From d677a1bf816e158c1fdd0e04b4b688e63c9505d0 Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Fri, 20 May 2022 15:38:27 +0300 Subject: [PATCH] Make Animate deterministic in unit tests Signed-off-by: Janne Savolainen --- .../installing-update-using-tray.test.ts.snap | 10 +++---- .../__snapshots__/ask-boolean.test.ts.snap | 8 +++--- src/renderer/components/animate/animate.tsx | 28 ++++++++++++++++--- .../request-animation-frame.injectable.ts | 13 +++++++++ .../__tests__/update-button.test.tsx | 12 +++++++- src/renderer/getDiForUnitTesting.tsx | 3 ++ 6 files changed, 60 insertions(+), 14 deletions(-) create mode 100644 src/renderer/components/animate/request-animation-frame.injectable.ts diff --git a/src/behaviours/application-update/__snapshots__/installing-update-using-tray.test.ts.snap b/src/behaviours/application-update/__snapshots__/installing-update-using-tray.test.ts.snap index ddea0e46f1..16595f03f1 100644 --- a/src/behaviours/application-update/__snapshots__/installing-update-using-tray.test.ts.snap +++ b/src/behaviours/application-update/__snapshots__/installing-update-using-tray.test.ts.snap @@ -17,7 +17,7 @@ exports[`installing update using tray when started when user checks for updates class="Notifications flex column align-flex-end" >
void) => void; +} + @observer -class DefaultedAnimate extends React.Component { +class DefaultedAnimate extends React.Component { static defaultProps = { name: "opacity", enter: true, @@ -38,7 +44,7 @@ class DefaultedAnimate extends React.Component { + + this.props.requestAnimationFrame(() => { this.statusClassName.enter = true; this.props.onEnter(); }); @@ -115,4 +122,17 @@ class DefaultedAnimate extends React.Component ; +export const NonInjectedAnimate = (props: AnimateProps & Dependencies) => ; + +export const Animate = withInjectables( + NonInjectedAnimate, + + { + getProps: (di, props) => ({ + requestAnimationFrame: di.inject(requestAnimationFrameInjectable), + ...props, + }), + }, +); + + diff --git a/src/renderer/components/animate/request-animation-frame.injectable.ts b/src/renderer/components/animate/request-animation-frame.injectable.ts new file mode 100644 index 0000000000..f61b2ae874 --- /dev/null +++ b/src/renderer/components/animate/request-animation-frame.injectable.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; + +const requestAnimationFrameInjectable = getInjectable({ + id: "request-animation-frame", + instantiate: () => (callback: () => void) => requestAnimationFrame(callback), + causesSideEffects: true, +}); + +export default requestAnimationFrameInjectable; diff --git a/src/renderer/components/update-button/__tests__/update-button.test.tsx b/src/renderer/components/update-button/__tests__/update-button.test.tsx index ff52035a48..8133bd3845 100644 --- a/src/renderer/components/update-button/__tests__/update-button.test.tsx +++ b/src/renderer/components/update-button/__tests__/update-button.test.tsx @@ -3,15 +3,25 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { render, act } from "@testing-library/react"; +import { act } from "@testing-library/react"; import React from "react"; import { UpdateButton } from "../update-button"; import "@testing-library/jest-dom/extend-expect"; +import { getDiForUnitTesting } from "../../../getDiForUnitTesting"; +import type { DiRender } from "../../test-utils/renderFor"; +import { renderFor } from "../../test-utils/renderFor"; const update = jest.fn(); describe("", () => { + let render: DiRender; + beforeEach(() => { + + const di = getDiForUnitTesting({ doGeneralOverrides: true }); + + render = renderFor(di); + update.mockClear(); }); diff --git a/src/renderer/getDiForUnitTesting.tsx b/src/renderer/getDiForUnitTesting.tsx index adc70e2a41..43e7925feb 100644 --- a/src/renderer/getDiForUnitTesting.tsx +++ b/src/renderer/getDiForUnitTesting.tsx @@ -44,6 +44,7 @@ import { observable } from "mobx"; import defaultShellInjectable from "./components/+preferences/default-shell.injectable"; import appVersionInjectable from "../common/get-configuration-file-model/app-version/app-version.injectable"; import provideInitialValuesForSyncBoxesInjectable from "./sync-box/provide-initial-values-for-sync-boxes.injectable"; +import requestAnimationFrameInjectable from "./components/animate/request-animation-frame.injectable"; export const getDiForUnitTesting = (opts: GetDiForUnitTestingOptions = {}) => { const { @@ -80,6 +81,8 @@ export const getDiForUnitTesting = (opts: GetDiForUnitTestingOptions = {}) => { di.override(historyInjectable, () => createMemoryHistory()); + di.override(requestAnimationFrameInjectable, () => (callback) => callback()); + di.override(lensResourcesDirInjectable, () => "/irrelevant"); di.override(ipcRendererInjectable, () => ({