From 2c4a7ecfb4e4fa30a8830b49383133dd5dc2c9b8 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 5 Apr 2023 11:04:56 -0400 Subject: [PATCH] chore: Replace all uses of stopServicesAndExitApp with requestQuitOfApp - Also updated tests with new behaviour Signed-off-by: Sebastian Malton --- .../quit-application-menu-item.injectable.ts | 9 +---- ...ing-the-app-using-application-menu.test.ts | 35 ++++-------------- ...tron-app.global-override-for-injectable.ts | 5 ++- .../features/require-quit.injectable.ts | 17 +++++++++ .../close-all-windows.injectable.ts | 20 ---------- .../stop-services-and-exit-app.injectable.ts | 23 ------------ .../quit-app-tray-item.injectable.ts | 37 +++++-------------- .../test-utils/get-application-builder.tsx | 7 ++-- 8 files changed, 43 insertions(+), 110 deletions(-) create mode 100644 packages/core/src/main/electron-app/features/require-quit.injectable.ts delete mode 100644 packages/core/src/main/start-main-application/lens-window/hide-all-windows/close-all-windows.injectable.ts delete mode 100644 packages/core/src/main/stop-services-and-exit-app.injectable.ts diff --git a/packages/core/src/features/application-menu/main/menu-items/special-menu-for-mac-application/quit-application/quit-application-menu-item.injectable.ts b/packages/core/src/features/application-menu/main/menu-items/special-menu-for-mac-application/quit-application/quit-application-menu-item.injectable.ts index 71f7cde125..61053dd37a 100644 --- a/packages/core/src/features/application-menu/main/menu-items/special-menu-for-mac-application/quit-application/quit-application-menu-item.injectable.ts +++ b/packages/core/src/features/application-menu/main/menu-items/special-menu-for-mac-application/quit-application/quit-application-menu-item.injectable.ts @@ -4,28 +4,23 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import applicationMenuItemInjectionToken from "../../application-menu-item-injection-token"; -import stopServicesAndExitAppInjectable from "../../../../../../main/stop-services-and-exit-app.injectable"; import isMacInjectable from "../../../../../../common/vars/is-mac.injectable"; +import requestQuitOfAppInjectable from "../../../../../../main/electron-app/features/require-quit.injectable"; const quitApplicationMenuItemInjectable = getInjectable({ id: "quit-application-menu-item", instantiate: (di) => { - const stopServicesAndExitApp = di.inject(stopServicesAndExitAppInjectable); const isMac = di.inject(isMacInjectable); return { kind: "clickable-menu-item" as const, id: "quit", label: "Quit", - parentId: isMac ? "mac" : "file", orderNumber: isMac ? 140 : 70, keyboardShortcut: isMac ? "Cmd+Q" : "Alt+F4", - - onClick: () => { - stopServicesAndExitApp(); - }, + onClick: di.inject(requestQuitOfAppInjectable), }; }, diff --git a/packages/core/src/features/quitting-and-restarting-the-app/quitting-the-app-using-application-menu.test.ts b/packages/core/src/features/quitting-and-restarting-the-app/quitting-the-app-using-application-menu.test.ts index 3827226bb9..337b801e66 100644 --- a/packages/core/src/features/quitting-and-restarting-the-app/quitting-the-app-using-application-menu.test.ts +++ b/packages/core/src/features/quitting-and-restarting-the-app/quitting-the-app-using-application-menu.test.ts @@ -5,14 +5,13 @@ import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; -import forceAppExitInjectable from "../../main/electron-app/features/force-app-exit.injectable"; -import stopServicesAndExitAppInjectable from "../../main/stop-services-and-exit-app.injectable"; -import { testUsingFakeTime, advanceFakeTime } from "../../test-utils/use-fake-time"; +import { testUsingFakeTime } from "../../test-utils/use-fake-time"; +import requestQuitOfAppInjectable from "../../main/electron-app/features/require-quit.injectable"; describe("quitting the app using application menu", () => { describe("given application has started", () => { let builder: ApplicationBuilder; - let forceAppExitMock: jest.Mock; + let requestQuitOfAppMock: jest.Mock; beforeEach(async () => { testUsingFakeTime("2015-10-21T07:28:00Z"); @@ -20,10 +19,8 @@ describe("quitting the app using application menu", () => { builder = getApplicationBuilder(); builder.beforeApplicationStart(({ mainDi }) => { - mainDi.unoverride(stopServicesAndExitAppInjectable); - - forceAppExitMock = jest.fn(); - mainDi.override(forceAppExitInjectable, () => forceAppExitMock); + requestQuitOfAppMock = jest.fn(); + mainDi.override(requestQuitOfAppInjectable, () => requestQuitOfAppMock); }); await builder.render(); @@ -40,26 +37,8 @@ describe("quitting the app using application menu", () => { builder.applicationMenu.click("root", "mac", "quit"); }); - it("closes all windows", () => { - const windows = builder.applicationWindow.getAll(); - - expect(windows).toEqual([]); - }); - - it("after insufficient time passes, does not terminate application yet", () => { - advanceFakeTime(999); - - expect(forceAppExitMock).not.toHaveBeenCalled(); - }); - - describe("after sufficient time passes", () => { - beforeEach(() => { - advanceFakeTime(1000); - }); - - it("terminates application", () => { - expect(forceAppExitMock).toHaveBeenCalled(); - }); + it("requests quit of application", () => { + expect(requestQuitOfAppMock).toBeCalled(); }); }); }); diff --git a/packages/core/src/main/electron-app/electron-app.global-override-for-injectable.ts b/packages/core/src/main/electron-app/electron-app.global-override-for-injectable.ts index 919303dd08..9ea5e69b26 100644 --- a/packages/core/src/main/electron-app/electron-app.global-override-for-injectable.ts +++ b/packages/core/src/main/electron-app/electron-app.global-override-for-injectable.ts @@ -6,16 +6,17 @@ import { kebabCase } from "lodash"; import { getGlobalOverride } from "@k8slens/test-utils"; import electronAppInjectable from "./electron-app.injectable"; +import EventEmitter from "events"; export default getGlobalOverride(electronAppInjectable, () => { const commandLineArgs: string[] = []; const chromiumArgs = new Map(); const appPaths = new Map(); - const app = ({ + const app = (new EventEmitter(), { getVersion: () => "6.0.0", setLoginItemSettings: () => { }, - on: () => app, + quit: () => {}, whenReady: async () => {}, getPath: (name) => appPaths.get(name) ?? `/some-directory-for-${kebabCase(name)}`, setPath: (name, value) => appPaths.set(name, value), diff --git a/packages/core/src/main/electron-app/features/require-quit.injectable.ts b/packages/core/src/main/electron-app/features/require-quit.injectable.ts new file mode 100644 index 0000000000..78c514dbfd --- /dev/null +++ b/packages/core/src/main/electron-app/features/require-quit.injectable.ts @@ -0,0 +1,17 @@ +/** + * 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 electronAppInjectable from "../electron-app.injectable"; + +const requestQuitOfAppInjectable = getInjectable({ + id: "request-quit-of-app", + instantiate: (di) => { + const app = di.inject(electronAppInjectable); + + return () => app.quit(); + }, +}); + +export default requestQuitOfAppInjectable; diff --git a/packages/core/src/main/start-main-application/lens-window/hide-all-windows/close-all-windows.injectable.ts b/packages/core/src/main/start-main-application/lens-window/hide-all-windows/close-all-windows.injectable.ts deleted file mode 100644 index 38f6fec7b9..0000000000 --- a/packages/core/src/main/start-main-application/lens-window/hide-all-windows/close-all-windows.injectable.ts +++ /dev/null @@ -1,20 +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 { applicationWindowInjectionToken } from "../application-window/application-window-injection-token"; - -const closeAllWindowsInjectable = getInjectable({ - id: "close-all-windows", - - instantiate: (di) => () => { - const lensWindows = di.injectMany(applicationWindowInjectionToken); - - lensWindows.forEach((lensWindow) => { - lensWindow.close(); - }); - }, -}); - -export default closeAllWindowsInjectable; diff --git a/packages/core/src/main/stop-services-and-exit-app.injectable.ts b/packages/core/src/main/stop-services-and-exit-app.injectable.ts deleted file mode 100644 index 37be4095b4..0000000000 --- a/packages/core/src/main/stop-services-and-exit-app.injectable.ts +++ /dev/null @@ -1,23 +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 forceAppExitInjectable from "./electron-app/features/force-app-exit.injectable"; -import emitAppEventInjectable from "../common/app-event-bus/emit-event.injectable"; - -const stopServicesAndExitAppInjectable = getInjectable({ - id: "stop-services-and-exit-app", - - instantiate: (di) => { - const forceAppExit = di.inject(forceAppExitInjectable); - const emitAppEvent = di.inject(emitAppEventInjectable); - - return async () => { - emitAppEvent({ name: "service", action: "close" }); - setTimeout(forceAppExit, 1000); - }; - }, -}); - -export default stopServicesAndExitAppInjectable; diff --git a/packages/core/src/main/tray/tray-menu-item/implementations/quit-app-tray-item.injectable.ts b/packages/core/src/main/tray/tray-menu-item/implementations/quit-app-tray-item.injectable.ts index 894a823511..7f82d8a2d0 100644 --- a/packages/core/src/main/tray/tray-menu-item/implementations/quit-app-tray-item.injectable.ts +++ b/packages/core/src/main/tray/tray-menu-item/implementations/quit-app-tray-item.injectable.ts @@ -5,37 +5,20 @@ import { getInjectable } from "@ogre-tools/injectable"; import { trayMenuItemInjectionToken } from "../tray-menu-item-injection-token"; import { computed } from "mobx"; -import stopServicesAndExitAppInjectable from "../../../stop-services-and-exit-app.injectable"; -import { withErrorSuppression } from "../../../../common/utils/with-error-suppression/with-error-suppression"; -import { pipeline } from "@ogre-tools/fp"; -import withErrorLoggingInjectable from "../../../../common/utils/with-error-logging/with-error-logging.injectable"; +import requestQuitOfAppInjectable from "../../../electron-app/features/require-quit.injectable"; const quitAppTrayItemInjectable = getInjectable({ id: "quit-app-tray-item", - instantiate: (di) => { - const stopServicesAndExitApp = di.inject(stopServicesAndExitAppInjectable); - const withErrorLoggingFor = di.inject(withErrorLoggingInjectable); - - return { - id: "quit-app", - parentId: null, - orderNumber: 150, - label: computed(() => "Quit App"), - enabled: computed(() => true), - visible: computed(() => true), - - click: pipeline( - stopServicesAndExitApp, - - withErrorLoggingFor(() => "[TRAY]: Quitting application failed."), - - // TODO: Find out how to improve typing so that instead of - // x => withErrorSuppression(x) there could only be withErrorSuppression - (x) => withErrorSuppression(x), - ), - }; - }, + instantiate: (di) => ({ + id: "quit-app", + parentId: null, + orderNumber: 150, + label: computed(() => "Quit App"), + enabled: computed(() => true), + visible: computed(() => true), + click: di.inject(requestQuitOfAppInjectable), + }), injectionToken: trayMenuItemInjectionToken, }); diff --git a/packages/core/src/renderer/components/test-utils/get-application-builder.tsx b/packages/core/src/renderer/components/test-utils/get-application-builder.tsx index eb63c9efb8..f05ee416a9 100644 --- a/packages/core/src/renderer/components/test-utils/get-application-builder.tsx +++ b/packages/core/src/renderer/components/test-utils/get-application-builder.tsx @@ -50,7 +50,6 @@ import createApplicationWindowInjectable from "../../../main/start-main-applicat import type { CreateElectronWindow } from "../../../main/start-main-application/lens-window/application-window/create-electron-window.injectable"; import createElectronWindowInjectable from "../../../main/start-main-application/lens-window/application-window/create-electron-window.injectable"; import { applicationWindowInjectionToken } from "../../../main/start-main-application/lens-window/application-window/application-window-injection-token"; -import closeAllWindowsInjectable from "../../../main/start-main-application/lens-window/hide-all-windows/close-all-windows.injectable"; import type { LensWindow } from "../../../main/start-main-application/lens-window/application-window/create-lens-window.injectable"; import type { FakeExtensionOptions } from "./get-extension-fake"; import { getExtensionFakeForMain, getExtensionFakeForRenderer } from "./get-extension-fake"; @@ -330,9 +329,11 @@ export const getApplicationBuilder = () => { mainDi, applicationWindow: { closeAll: () => { - const closeAll = mainDi.inject(closeAllWindowsInjectable); + const lensWindows = mainDi.injectMany(applicationWindowInjectionToken); - closeAll(); + for (const lensWindow of lensWindows) { + lensWindow.close(); + } document.documentElement.innerHTML = ""; },