From 33834e34b735143cc6654806fe9da5fb41e03336 Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Thu, 11 Aug 2022 16:42:52 +0300 Subject: [PATCH] Optimize getting injectable paths only once for all test suites (#6013) --- src/common/test-utils/get-global-override.ts | 5 ++++ src/jest.setup.ts | 12 ++++++++ src/main/getDiForUnitTesting.ts | 30 +++++--------------- src/renderer/getDiForUnitTesting.tsx | 30 +++++--------------- 4 files changed, 31 insertions(+), 46 deletions(-) diff --git a/src/common/test-utils/get-global-override.ts b/src/common/test-utils/get-global-override.ts index 3a556df793..ac3c86a33e 100644 --- a/src/common/test-utils/get-global-override.ts +++ b/src/common/test-utils/get-global-override.ts @@ -4,6 +4,11 @@ */ import type { Injectable } from "@ogre-tools/injectable"; +export interface GlobalOverride { + injectable: Injectable; + overridingInstantiate: any; +} + export const getGlobalOverride = >( injectable: T, overridingInstantiate: T["instantiate"], diff --git a/src/jest.setup.ts b/src/jest.setup.ts index 4b3f787cfc..c2f151ff76 100644 --- a/src/jest.setup.ts +++ b/src/jest.setup.ts @@ -8,6 +8,8 @@ import configurePackages from "./common/configure-packages"; import { configure } from "mobx"; import { setImmediate } from "timers"; import { TextEncoder, TextDecoder as TextDecoderNode } from "util"; +import glob from "glob"; +import path from "path"; // setup default configuration for external npm-packages configurePackages(); @@ -45,3 +47,13 @@ global.ResizeObserver = class { jest.mock("./renderer/components/monaco-editor/monaco-editor"); jest.mock("./renderer/components/tooltip/withTooltip"); + +const getInjectables = (environment: "renderer" | "main", filePathGlob: string) => + glob.sync(`./{common,extensions,${environment}}/**/${filePathGlob}`, { + cwd: __dirname, + }).map(x => path.resolve(__dirname, x)); + +(global as any).rendererInjectablePaths = getInjectables("renderer", "*.injectable.{ts,tsx}"); +(global as any).rendererGlobalOverridePaths = getInjectables("renderer", "*.global-override-for-injectable.{ts,tsx}"); +(global as any).mainInjectablePaths = getInjectables("main", "*.injectable.{ts,tsx}"); +(global as any).mainGlobalOverridePaths = getInjectables("main", "*.global-override-for-injectable.{ts,tsx}"); diff --git a/src/main/getDiForUnitTesting.ts b/src/main/getDiForUnitTesting.ts index 9c5a3ab741..2e9e5ad26d 100644 --- a/src/main/getDiForUnitTesting.ts +++ b/src/main/getDiForUnitTesting.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import glob from "glob"; -import { kebabCase, memoize, noop, chunk } from "lodash/fp"; +import { kebabCase, noop, chunk } from "lodash/fp"; import type { DiContainer, Injectable } from "@ogre-tools/injectable"; import { createContainer } from "@ogre-tools/injectable"; import { Environments, setLegacyGlobalDiForExtensionApi } from "../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; @@ -101,6 +100,7 @@ import { registerMobX } from "@ogre-tools/injectable-extension-for-mobx"; import electronInjectable from "./utils/resolve-system-proxy/electron.injectable"; import type { HotbarStore } from "../common/hotbars/store"; import focusApplicationInjectable from "./electron-app/features/focus-application.injectable"; +import type { GlobalOverride } from "../common/test-utils/get-global-override"; export function getDiForUnitTesting(opts: { doGeneralOverrides?: boolean } = {}) { const { @@ -113,9 +113,9 @@ export function getDiForUnitTesting(opts: { doGeneralOverrides?: boolean } = {}) setLegacyGlobalDiForExtensionApi(di, Environments.main); - const filePaths = getInjectableFilePaths(); - - const injectables = filePaths.map(filePath => require(filePath).default); + const injectables: Injectable[] = (global as any).mainInjectablePaths.map( + (filePath: string) => require(filePath).default, + ); chunk(100)(injectables).forEach(chunkInjectables => { di.register(...chunkInjectables); @@ -124,10 +124,8 @@ export function getDiForUnitTesting(opts: { doGeneralOverrides?: boolean } = {}) di.preventSideEffects(); if (doGeneralOverrides) { - const globalOverrideFilePaths = getGlobalOverridePaths(); - - const globalOverrides = globalOverrideFilePaths.map( - (filePath) => require(filePath).default, + const globalOverrides: GlobalOverride[] = (global as any).mainGlobalOverridePaths.map( + (filePath: string) => require(filePath).default, ); globalOverrides.forEach(globalOverride => { @@ -215,20 +213,6 @@ export function getDiForUnitTesting(opts: { doGeneralOverrides?: boolean } = {}) return di; } -const getInjectableFilePaths = memoize(() => [ - ...glob.sync("./**/*.injectable.{ts,tsx}", { cwd: __dirname }), - ...glob.sync("../extensions/**/*.injectable.{ts,tsx}", { cwd: __dirname }), - ...glob.sync("../common/**/*.injectable.{ts,tsx}", { cwd: __dirname }), -]); - -const getGlobalOverridePaths = memoize(() => - glob.sync( - "../{common,extensions,main}/**/*.global-override-for-injectable.{ts,tsx}", - - { cwd: __dirname }, - ), -); - // TODO: Reorganize code in Runnables to get rid of requirement for override const overrideRunnablesHavingSideEffects = (di: DiContainer) => { [ diff --git a/src/renderer/getDiForUnitTesting.tsx b/src/renderer/getDiForUnitTesting.tsx index 4b8a69c090..5789f513a4 100644 --- a/src/renderer/getDiForUnitTesting.tsx +++ b/src/renderer/getDiForUnitTesting.tsx @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import glob from "glob"; -import { memoize, noop, chunk } from "lodash/fp"; +import { noop, chunk } from "lodash/fp"; import type { DiContainer, Injectable } from "@ogre-tools/injectable"; import { createContainer, @@ -73,6 +72,7 @@ import forceUpdateModalRootFrameComponentInjectable from "./application-update/f import legacyOnChannelListenInjectable from "./ipc/legacy-channel-listen.injectable"; import getEntitySettingCommandsInjectable from "./components/command-palette/registered-commands/get-entity-setting-commands.injectable"; import storageSaveDelayInjectable from "./utils/create-storage/storage-save-delay.injectable"; +import type { GlobalOverride } from "../common/test-utils/get-global-override"; export const getDiForUnitTesting = (opts: { doGeneralOverrides?: boolean } = {}) => { const { @@ -85,9 +85,9 @@ export const getDiForUnitTesting = (opts: { doGeneralOverrides?: boolean } = {}) setLegacyGlobalDiForExtensionApi(di, Environments.renderer); - const filePaths = getInjectableFilePaths(); - - const injectables = filePaths.map(filePath => require(filePath).default); + const injectables: Injectable[] = (global as any).rendererInjectablePaths.map( + (filePath: string) => require(filePath).default, + ); chunk(100)(injectables).forEach(chunkInjectables => { di.register(...chunkInjectables); @@ -96,10 +96,8 @@ export const getDiForUnitTesting = (opts: { doGeneralOverrides?: boolean } = {}) di.preventSideEffects(); if (doGeneralOverrides) { - const globalOverrideFilePaths = getGlobalOverridePaths(); - - const globalOverrides = globalOverrideFilePaths.map( - (filePath) => require(filePath).default, + const globalOverrides: GlobalOverride[] = (global as any).rendererGlobalOverridePaths.map( + (filePath: string) => require(filePath).default, ); globalOverrides.forEach(globalOverride => { @@ -232,20 +230,6 @@ export const getDiForUnitTesting = (opts: { doGeneralOverrides?: boolean } = {}) return di; }; -const getInjectableFilePaths = memoize(() => [ - ...glob.sync("./**/*.injectable.{ts,tsx}", { cwd: __dirname }), - ...glob.sync("../common/**/*.injectable.{ts,tsx}", { cwd: __dirname }), - ...glob.sync("../extensions/**/*.injectable.{ts,tsx}", { cwd: __dirname }), -]); - -const getGlobalOverridePaths = memoize(() => - glob.sync( - "../{common,extensions,renderer}/**/*.global-override-for-injectable.{ts,tsx}", - - { cwd: __dirname }, - ), -); - const overrideFunctionalInjectables = (di: DiContainer, injectables: Injectable[]) => { injectables.forEach(injectable => { di.override(injectable, () => () => {