From a79d76084229d45c202ca00fe6e86f7a1a2d7596 Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Thu, 21 Jul 2022 09:11:06 +0300 Subject: [PATCH] Add Open Closed Principle compliant way to introduce global overrides without modification in getDiForUnitTesting Signed-off-by: Janne Savolainen --- src/common/test-utils/get-global-override.ts | 13 +++++++++++++ src/main/getDiForUnitTesting.ts | 18 ++++++++++++++++++ src/renderer/getDiForUnitTesting.tsx | 18 ++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 src/common/test-utils/get-global-override.ts diff --git a/src/common/test-utils/get-global-override.ts b/src/common/test-utils/get-global-override.ts new file mode 100644 index 0000000000..3a556df793 --- /dev/null +++ b/src/common/test-utils/get-global-override.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 type { Injectable } from "@ogre-tools/injectable"; + +export const getGlobalOverride = >( + injectable: T, + overridingInstantiate: T["instantiate"], +) => ({ + injectable, + overridingInstantiate, + }); diff --git a/src/main/getDiForUnitTesting.ts b/src/main/getDiForUnitTesting.ts index 51a677ad07..2024f68d27 100644 --- a/src/main/getDiForUnitTesting.ts +++ b/src/main/getDiForUnitTesting.ts @@ -124,6 +124,16 @@ export function getDiForUnitTesting(opts: { doGeneralOverrides?: boolean } = {}) di.preventSideEffects(); if (doGeneralOverrides) { + const globalOverrideFilePaths = getGlobalOverridePaths(); + + const globalOverrides = globalOverrideFilePaths.map( + (filePath) => require(filePath).default, + ); + + globalOverrides.forEach(globalOverride => { + di.override(globalOverride.injectable, globalOverride.overridingInstantiate); + }); + di.override(electronInjectable, () => ({})); di.override(waitUntilBundledExtensionsAreLoadedInjectable, () => async () => {}); di.override(getRandomIdInjectable, () => () => "some-irrelevant-random-id"); @@ -211,6 +221,14 @@ const getInjectableFilePaths = memoize(() => [ ...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 dbae2a575d..fdb7f089c0 100644 --- a/src/renderer/getDiForUnitTesting.tsx +++ b/src/renderer/getDiForUnitTesting.tsx @@ -96,6 +96,16 @@ export const getDiForUnitTesting = (opts: { doGeneralOverrides?: boolean } = {}) di.preventSideEffects(); if (doGeneralOverrides) { + const globalOverrideFilePaths = getGlobalOverridePaths(); + + const globalOverrides = globalOverrideFilePaths.map( + (filePath) => require(filePath).default, + ); + + globalOverrides.forEach(globalOverride => { + di.override(globalOverride.injectable, globalOverride.overridingInstantiate); + }); + di.override(getRandomIdInjectable, () => () => "some-irrelevant-random-id"); di.override(platformInjectable, () => "darwin"); di.override(startTopbarStateSyncInjectable, () => ({ @@ -228,6 +238,14 @@ const getInjectableFilePaths = memoize(() => [ ...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, () => () => {