From 44e0ebc10d3bc7e5d6120ad0477d8b0f1b204809 Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Wed, 11 May 2022 08:13:40 +0300 Subject: [PATCH] Extract updating is enabled to separate injectable Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen --- ...navigation-using-application-menu.test.tsx | 7 +++--- .../navigation-using-application-menu.test.ts | 4 +--- .../navigation-using-application-menu.test.ts | 5 +--- src/main/app-updater.ts | 6 ++--- .../electron-updater-is-active.injectable.ts | 18 ++++++++++++++ src/main/getDiForUnitTesting.ts | 9 +++---- .../menu/application-menu-items.injectable.ts | 14 +++++------ src/main/start-update-checking.injectable.ts | 4 ++-- .../is-auto-update-enabled.injectable.ts | 24 ------------------- .../publish-is-configured.injectable.ts | 20 ++++++++++++++++ .../updating-is-enabled.injectable.ts | 20 ++++++++++++++++ src/renderer/getDiForUnitTesting.tsx | 2 -- 12 files changed, 79 insertions(+), 54 deletions(-) create mode 100644 src/main/electron-app/features/electron-updater-is-active.injectable.ts delete mode 100644 src/main/update-app/is-auto-update-enabled.injectable.ts create mode 100644 src/main/update-app/publish-is-configured.injectable.ts create mode 100644 src/main/update-app/updating-is-enabled.injectable.ts diff --git a/src/behaviours/add-cluster/navigation-using-application-menu.test.tsx b/src/behaviours/add-cluster/navigation-using-application-menu.test.tsx index aeb6f89383..bb68918c1a 100644 --- a/src/behaviours/add-cluster/navigation-using-application-menu.test.tsx +++ b/src/behaviours/add-cluster/navigation-using-application-menu.test.tsx @@ -6,16 +6,17 @@ import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; -import isAutoUpdateEnabledInjectable from "../../main/update-app/is-auto-update-enabled.injectable"; import React from "react"; // TODO: Make components free of side effects by making them deterministic jest.mock("../../renderer/components/tooltip/tooltip", () => ({ Tooltip: () => null, })); + jest.mock("../../renderer/components/tooltip/withTooltip", () => ({ withTooltip: (Target: any) => ({ tooltip, tooltipOverrideDisabled, ...props }: any) => , })); + jest.mock("../../renderer/components/monaco-editor/monaco-editor", () => ({ MonacoEditor: () => null, })); @@ -25,9 +26,7 @@ describe("add-cluster - navigation using application menu", () => { let rendered: RenderResult; beforeEach(async () => { - applicationBuilder = getApplicationBuilder().beforeApplicationStart(({ mainDi }) => { - mainDi.override(isAutoUpdateEnabledInjectable, () => () => false); - }); + applicationBuilder = getApplicationBuilder(); rendered = await applicationBuilder.render(); }); diff --git a/src/behaviours/extensions/navigation-using-application-menu.test.ts b/src/behaviours/extensions/navigation-using-application-menu.test.ts index 2ff0b74b91..369f097790 100644 --- a/src/behaviours/extensions/navigation-using-application-menu.test.ts +++ b/src/behaviours/extensions/navigation-using-application-menu.test.ts @@ -6,7 +6,6 @@ import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; -import isAutoUpdateEnabledInjectable from "../../main/update-app/is-auto-update-enabled.injectable"; import extensionsStoreInjectable from "../../extensions/extensions-store/extensions-store.injectable"; import type { ExtensionsStore } from "../../extensions/extensions-store/extensions-store"; import fileSystemProvisionerStoreInjectable from "../../extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable"; @@ -22,8 +21,7 @@ describe("extensions - navigation using application menu", () => { let focusWindowMock: jest.Mock; beforeEach(async () => { - applicationBuilder = getApplicationBuilder().beforeApplicationStart(({ mainDi, rendererDi }) => { - mainDi.override(isAutoUpdateEnabledInjectable, () => () => false); + applicationBuilder = getApplicationBuilder().beforeApplicationStart(({ rendererDi }) => { rendererDi.override(extensionsStoreInjectable, () => ({}) as unknown as ExtensionsStore); rendererDi.override(fileSystemProvisionerStoreInjectable, () => ({}) as unknown as FileSystemProvisionerStore); diff --git a/src/behaviours/welcome/navigation-using-application-menu.test.ts b/src/behaviours/welcome/navigation-using-application-menu.test.ts index 10eba84d50..a9f09c783c 100644 --- a/src/behaviours/welcome/navigation-using-application-menu.test.ts +++ b/src/behaviours/welcome/navigation-using-application-menu.test.ts @@ -6,16 +6,13 @@ import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; -import isAutoUpdateEnabledInjectable from "../../main/update-app/is-auto-update-enabled.injectable"; describe("welcome - navigation using application menu", () => { let applicationBuilder: ApplicationBuilder; let rendered: RenderResult; beforeEach(async () => { - applicationBuilder = getApplicationBuilder().beforeApplicationStart(({ mainDi }) => { - mainDi.override(isAutoUpdateEnabledInjectable, () => () => false); - }); + applicationBuilder = getApplicationBuilder(); rendered = await applicationBuilder.render(); }); diff --git a/src/main/app-updater.ts b/src/main/app-updater.ts index a3575de05b..47d651cd79 100644 --- a/src/main/app-updater.ts +++ b/src/main/app-updater.ts @@ -38,15 +38,15 @@ autoUpdater.logger = { }; interface Dependencies { - isAutoUpdateEnabled: () => boolean; + updatingIsEnabled: boolean; } /** * starts the automatic update checking * @param interval milliseconds between interval to check on, defaults to 2h */ -export const startUpdateChecking = ({ isAutoUpdateEnabled } : Dependencies) => once(function (interval = 1000 * 60 * 60 * 2): void { - if (!isAutoUpdateEnabled() || isTestEnv) { +export const startUpdateChecking = ({ updatingIsEnabled } : Dependencies) => once(function (interval = 1000 * 60 * 60 * 2): void { + if (!updatingIsEnabled || isTestEnv) { return; } diff --git a/src/main/electron-app/features/electron-updater-is-active.injectable.ts b/src/main/electron-app/features/electron-updater-is-active.injectable.ts new file mode 100644 index 0000000000..2fe0d7bf06 --- /dev/null +++ b/src/main/electron-app/features/electron-updater-is-active.injectable.ts @@ -0,0 +1,18 @@ +/** + * 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"; +import electronUpdaterInjectable from "./electron-updater.injectable"; + +const electronUpdaterIsActiveInjectable = getInjectable({ + id: "electron-updater-is-active", + + instantiate: (di) => { + const electronUpdater = di.inject(electronUpdaterInjectable); + + return electronUpdater.isUpdaterActive(); + }, +}); + +export default electronUpdaterIsActiveInjectable; diff --git a/src/main/getDiForUnitTesting.ts b/src/main/getDiForUnitTesting.ts index 2028b2f4f5..065ac9c6ca 100644 --- a/src/main/getDiForUnitTesting.ts +++ b/src/main/getDiForUnitTesting.ts @@ -31,7 +31,6 @@ import joinPathsInjectable from "../common/path/join-paths.injectable"; import { joinPathsFake } from "../common/test-utils/join-paths-fake"; import hotbarStoreInjectable from "../common/hotbars/store.injectable"; import type { GetDiForUnitTestingOptions } from "../test-utils/get-dis-for-unit-testing"; -import isAutoUpdateEnabledInjectable from "./update-app/is-auto-update-enabled.injectable"; import appEventBusInjectable from "../common/app-event-bus/app-event-bus.injectable"; import { EventEmitter } from "../common/event-emitter"; import type { AppEvent } from "../common/app-event-bus/event-bus"; @@ -80,7 +79,8 @@ import platformInjectable from "../common/vars/platform.injectable"; import productNameInjectable from "./app-paths/app-name/product-name.injectable"; import syncUpdateIsReadyToBeInstalledInjectable from "./electron-app/runnables/update-application/sync-update-is-ready-to-be-installed.injectable"; import quitAndInstallUpdateInjectable from "./electron-app/features/quit-and-install-update.injectable"; -import packageJsonInjectable from "../common/vars/package-json.injectable"; +import electronUpdaterIsActiveInjectable from "./electron-app/features/electron-updater-is-active.injectable"; +import publishIsConfiguredInjectable from "./update-app/publish-is-configured.injectable"; export function getDiForUnitTesting(opts: GetDiForUnitTestingOptions = {}) { const { @@ -117,7 +117,6 @@ export function getDiForUnitTesting(opts: GetDiForUnitTestingOptions = {}) { di.override(isDevelopmentInjectable, () => false); di.override(environmentVariablesInjectable, () => ({})); di.override(commandLineArgumentsInjectable, () => []); - di.override(packageJsonInjectable, () => ({})); di.override(productNameInjectable, () => "some-product-name"); @@ -245,6 +244,8 @@ const overrideElectronFeatures = (di: DiContainer) => { ); di.override(setElectronAppPathInjectable, () => () => {}); - di.override(isAutoUpdateEnabledInjectable, () => () => false); di.override(registerFileProtocolInjectable, () => () => {}); + + di.override(publishIsConfiguredInjectable, () => false); + di.override(electronUpdaterIsActiveInjectable, () => false); }; diff --git a/src/main/menu/application-menu-items.injectable.ts b/src/main/menu/application-menu-items.injectable.ts index 2441e5805f..751878f148 100644 --- a/src/main/menu/application-menu-items.injectable.ts +++ b/src/main/menu/application-menu-items.injectable.ts @@ -12,7 +12,7 @@ import { webContents } from "electron"; import loggerInjectable from "../../common/logger.injectable"; import appNameInjectable from "../app-paths/app-name/app-name.injectable"; import electronMenuItemsInjectable from "./electron-menu-items.injectable"; -import isAutoUpdateEnabledInjectable from "../update-app/is-auto-update-enabled.injectable"; +import updatingIsEnabledInjectable from "../update-app/updating-is-enabled.injectable"; import navigateToPreferencesInjectable from "../../common/front-end-routing/routes/preferences/navigate-to-preferences.injectable"; import navigateToExtensionsInjectable from "../../common/front-end-routing/routes/extensions/navigate-to-extensions.injectable"; import navigateToCatalogInjectable from "../../common/front-end-routing/routes/catalog/navigate-to-catalog.injectable"; @@ -41,7 +41,7 @@ const applicationMenuItemsInjectable = getInjectable({ const logger = di.inject(loggerInjectable); const appName = di.inject(appNameInjectable); const isMac = di.inject(isMacInjectable); - const isAutoUpdateEnabled = di.inject(isAutoUpdateEnabledInjectable); + const updatingIsEnabled = di.inject(updatingIsEnabledInjectable); const electronMenuItems = di.inject(electronMenuItemsInjectable); const showAbout = di.inject(showAboutInjectable); const applicationWindow = di.inject(applicationWindowInjectable); @@ -54,11 +54,9 @@ const applicationMenuItemsInjectable = getInjectable({ const navigateToAddCluster = di.inject(navigateToAddClusterInjectable); const stopServicesAndExitApp = di.inject(stopServicesAndExitAppInjectable); + logger.info(`[MENU]: autoUpdateEnabled=${updatingIsEnabled}`); + return computed((): MenuItemOpts[] => { - const autoUpdateDisabled = !isAutoUpdateEnabled(); - - logger.info(`[MENU]: autoUpdateDisabled=${autoUpdateDisabled}`); - const macAppMenu: MenuItemOpts = { label: appName, id: "root", @@ -70,7 +68,7 @@ const applicationMenuItemsInjectable = getInjectable({ showAbout(); }, }, - ...ignoreIf(autoUpdateDisabled, [ + ...ignoreIf(!updatingIsEnabled, [ { label: "Check for updates", click() { @@ -282,7 +280,7 @@ const applicationMenuItemsInjectable = getInjectable({ showAbout(); }, }, - ...ignoreIf(autoUpdateDisabled, [ + ...ignoreIf(!updatingIsEnabled, [ { label: "Check for updates", click() { diff --git a/src/main/start-update-checking.injectable.ts b/src/main/start-update-checking.injectable.ts index c8eeca00b9..813c9329ed 100644 --- a/src/main/start-update-checking.injectable.ts +++ b/src/main/start-update-checking.injectable.ts @@ -4,13 +4,13 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { startUpdateChecking } from "./app-updater"; -import isAutoUpdateEnabledInjectable from "./update-app/is-auto-update-enabled.injectable"; +import updatingIsEnabledInjectable from "./update-app/updating-is-enabled.injectable"; const startUpdateCheckingInjectable = getInjectable({ id: "start-update-checking", instantiate: (di) => startUpdateChecking({ - isAutoUpdateEnabled: di.inject(isAutoUpdateEnabledInjectable), + updatingIsEnabled: di.inject(updatingIsEnabledInjectable), }), causesSideEffects: true, diff --git a/src/main/update-app/is-auto-update-enabled.injectable.ts b/src/main/update-app/is-auto-update-enabled.injectable.ts deleted file mode 100644 index b90ca53004..0000000000 --- a/src/main/update-app/is-auto-update-enabled.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * 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"; -import electronUpdaterInjectable from "../electron-app/features/electron-updater.injectable"; -import packageJsonInjectable from "../../common/vars/package-json.injectable"; - -const isAutoUpdateEnabledInjectable = getInjectable({ - id: "is-auto-update-enabled", - - instantiate: (di) => { - const electronUpdater = di.inject(electronUpdaterInjectable); - const packageJson = di.inject(packageJsonInjectable); - - const isPublishConfigured = Object.keys(packageJson.build).includes("publish"); - - return () => { - return electronUpdater.isUpdaterActive() && isPublishConfigured; - }; - }, -}); - -export default isAutoUpdateEnabledInjectable; diff --git a/src/main/update-app/publish-is-configured.injectable.ts b/src/main/update-app/publish-is-configured.injectable.ts new file mode 100644 index 0000000000..321adc8a22 --- /dev/null +++ b/src/main/update-app/publish-is-configured.injectable.ts @@ -0,0 +1,20 @@ +/** + * 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"; +import packageJsonInjectable from "../../common/vars/package-json.injectable"; +import { has } from "lodash/fp"; + +// TOOO: Rename to something less technical +const publishIsConfiguredInjectable = getInjectable({ + id: "publish-is-configured", + + instantiate: (di) => { + const packageJson = di.inject(packageJsonInjectable); + + return has("build.publish", packageJson); + }, +}); + +export default publishIsConfiguredInjectable; diff --git a/src/main/update-app/updating-is-enabled.injectable.ts b/src/main/update-app/updating-is-enabled.injectable.ts new file mode 100644 index 0000000000..df5e264219 --- /dev/null +++ b/src/main/update-app/updating-is-enabled.injectable.ts @@ -0,0 +1,20 @@ +/** + * 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"; +import electronUpdaterIsActiveInjectable from "../electron-app/features/electron-updater-is-active.injectable"; +import publishIsConfiguredInjectable from "./publish-is-configured.injectable"; + +const updatingIsEnabledInjectable = getInjectable({ + id: "updating-is-enabled", + + instantiate: (di) => { + const electronUpdaterIsActive = di.inject(electronUpdaterIsActiveInjectable); + const publishIsConfigured = di.inject(publishIsConfiguredInjectable); + + return electronUpdaterIsActive && publishIsConfigured; + }, +}); + +export default updatingIsEnabledInjectable; diff --git a/src/renderer/getDiForUnitTesting.tsx b/src/renderer/getDiForUnitTesting.tsx index 356beb796b..77cb55c638 100644 --- a/src/renderer/getDiForUnitTesting.tsx +++ b/src/renderer/getDiForUnitTesting.tsx @@ -44,7 +44,6 @@ import setupOnApiErrorListenersInjectable from "./api/setup-on-api-errors.inject import { observable } from "mobx"; import defaultShellInjectable from "./components/+preferences/default-shell.injectable"; import themeStoreInjectable from "./themes/store.injectable"; -import packageJsonInjectable from "../common/vars/package-json.injectable"; export const getDiForUnitTesting = (opts: GetDiForUnitTestingOptions = {}) => { const { @@ -70,7 +69,6 @@ export const getDiForUnitTesting = (opts: GetDiForUnitTestingOptions = {}) => { di.override(isMacInjectable, () => true); di.override(isWindowsInjectable, () => false); di.override(isLinuxInjectable, () => false); - di.override(packageJsonInjectable, () => ({})); di.override(terminalSpawningPoolInjectable, () => document.createElement("div")); di.override(hostedClusterIdInjectable, () => undefined);