diff --git a/src/behaviours/application-update/installing-update-using-topbar-button.test.tsx b/src/behaviours/application-update/installing-update-using-topbar-button.test.tsx index 55100c9fca..029d5745e3 100644 --- a/src/behaviours/application-update/installing-update-using-topbar-button.test.tsx +++ b/src/behaviours/application-update/installing-update-using-topbar-button.test.tsx @@ -1,6 +1,6 @@ import type { AsyncFnMock } from "@async-fn/jest"; import asyncFn from "@async-fn/jest"; -import type { RenderResult } from "@testing-library/react"; +import { act, RenderResult } from "@testing-library/react"; import type { CheckForPlatformUpdates } from "../../main/application-update/check-for-platform-updates/check-for-platform-updates.injectable"; import checkForPlatformUpdatesInjectable from "../../main/application-update/check-for-platform-updates/check-for-platform-updates.injectable"; import type { DownloadPlatformUpdate } from "../../main/application-update/download-platform-update/download-platform-update.injectable"; @@ -16,11 +16,17 @@ import openAppContextMenuInjectable from "../../renderer/components/layout/top-b import toggleMaximizeWindowInjectable from "../../renderer/components/layout/top-bar/toggle-maximize-window.injectable"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; +import restartAndInstallUpdateInjectable from "../../renderer/components/update-button/restart-and-install-update.injectable"; + +function daysToMilliseconds(days: number) { + return Math.round(days * 24 * 60 * 60 * 1000); +} describe("encourage user to update when sufficient time passed since update was downloaded", () => { let applicationBuilder: ApplicationBuilder; let checkForPlatformUpdatesMock: AsyncFnMock; let downloadPlatformUpdateMock: AsyncFnMock; + let restartAndInstallUpdate: jest.MockedFunction<() => void>; beforeEach(() => { applicationBuilder = getApplicationBuilder(); @@ -45,6 +51,8 @@ describe("encourage user to update when sufficient time passed since update was mainDi.unoverride(periodicalCheckForUpdateWarningInjectable); mainDi.permitSideEffects(periodicalCheckForUpdateWarningInjectable); + rendererDi.override(restartAndInstallUpdateInjectable, () => restartAndInstallUpdate = jest.fn()); + // TODO: Remove below lines when TopBar are free from side-effects rendererDi.unoverride(openAppContextMenuInjectable); rendererDi.unoverride(goBackInjectable); @@ -102,6 +110,63 @@ describe("encourage user to update when sufficient time passed since update was expect(button).toBeInTheDocument(); }) + + it("has soft emotional indication in the button", () => { + const button = rendered.getByTestId("update-button"); + + expect(button).toHaveAttribute("data-warning-level", "light") + }) + + describe("when button is clicked", () => { + it("shows dropdown with update item", () => { + const button = rendered.queryByTestId("update-button"); + + act(() => button?.click()); + + expect(rendered.getByTestId("update-lens-menu-item")).toBeInTheDocument(); + }) + + it("when selected update now, restarts the application to update", () => { + const button = rendered.queryByTestId("update-button"); + + act(() => button?.click()); + + const updateMenuItem = rendered.getByTestId("update-lens-menu-item"); + + act(() => updateMenuItem?.click()); + + expect(restartAndInstallUpdate).toBeCalled(); + }) + + describe("when dropdown closed without clicking update item", () => { + it("does not restart the application to update", async () => { + const button = rendered.queryByTestId("update-button"); + + act(() => button?.click()); + + act(() => button?.click()); + + expect(restartAndInstallUpdate).not.toBeCalled(); + }) + }) + }) + + describe("given just enough time passes for medium update encouragement", () => { + beforeAll(() => { + jest.useFakeTimers(); + jest.advanceTimersByTime(daysToMilliseconds(22)); + }) + + it("has medium emotional indication in the button", () => { + const button = rendered.getByTestId("update-button"); + + expect(button).toHaveAttribute("data-warning-level", "medium") + }) + + afterAll(() => { + jest.useRealTimers(); + }) + }) }); }); });