From bea52f9f80bb3ba86c2f6d6911fcbd73ce817bd5 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 2 Dec 2022 11:55:35 -0500 Subject: [PATCH] Add global override for getConfigurationFileModel to fix tests Signed-off-by: Sebastian Malton --- src/common/fs/write-json-sync.injectable.ts | 13 +++++ ...le-model.global-override-for-injectable.ts | 50 +++++++++++++++++++ src/test-utils/override-fs-with-fakes.ts | 16 ++++-- 3 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 src/common/fs/write-json-sync.injectable.ts create mode 100644 src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts diff --git a/src/common/fs/write-json-sync.injectable.ts b/src/common/fs/write-json-sync.injectable.ts new file mode 100644 index 0000000000..25c1933bb5 --- /dev/null +++ b/src/common/fs/write-json-sync.injectable.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 { getInjectable } from "@ogre-tools/injectable"; +import fsInjectable from "./fs.injectable"; + +const writeJsonSyncInjectable = getInjectable({ + id: "write-json-sync", + instantiate: (di) => di.inject(fsInjectable).writeJsonSync, +}); + +export default writeJsonSyncInjectable; diff --git a/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts b/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts new file mode 100644 index 0000000000..a2201ed52a --- /dev/null +++ b/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts @@ -0,0 +1,50 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import assert from "assert"; +import { action } from "mobx"; +import path from "path"; +import { getGlobalOverride } from "../test-utils/get-global-override"; +import getConfigurationFileModelInjectable from "./get-configuration-file-model.injectable"; +import type Config from "conf"; +import readJsonSyncInjectable from "../fs/read-json-sync.injectable"; +import writeJsonSyncInjectable from "../fs/write-json-sync.injectable"; + +export default getGlobalOverride(getConfigurationFileModelInjectable, (di) => { + const readJsonSync = di.inject(readJsonSyncInjectable); + const writeJsonSync = di.inject(writeJsonSyncInjectable); + + return (options) => { + assert(options.cwd, "Missing options.cwd"); + assert(options.configName, "Missing options.configName"); + + const configFilePath = path.posix.join(options.cwd, options.configName); + + return { + get store() { + try { + return readJsonSync(configFilePath); + } catch { + return {}; + } + }, + path: configFilePath, + set: action((key: string, value: unknown) => { + let currentState: object; + + try { + currentState = readJsonSync(configFilePath); + } catch { + currentState = {}; + } + + writeJsonSync(configFilePath, { + ...currentState, + [key]: value, + }); + }), + } as Partial as Config; + }; +}); diff --git a/src/test-utils/override-fs-with-fakes.ts b/src/test-utils/override-fs-with-fakes.ts index 9269eab04e..c594e20c8b 100644 --- a/src/test-utils/override-fs-with-fakes.ts +++ b/src/test-utils/override-fs-with-fakes.ts @@ -8,21 +8,29 @@ import writeJsonFileInjectable from "../common/fs/write-json-file.injectable"; import readJsonFileInjectable from "../common/fs/read-json-file.injectable"; import pathExistsInjectable from "../common/fs/path-exists.injectable"; import deleteFileInjectable from "../common/fs/delete-file.injectable"; +import writeJsonSyncInjectable from "../common/fs/write-json-sync.injectable"; +import readJsonSyncInjectable from "../common/fs/read-json-sync.injectable"; export const overrideFsWithFakes = (di: DiContainer, state = new Map()) => { const readFile = readFileFor(state); - di.override(readFileInjectable, () => readFile); + di.override(readFileInjectable, () => async (filePath) => readFile(filePath)); di.override(writeJsonFileInjectable, () => ( async (filePath, contents) => { state.set(filePath, JSON.stringify(contents)); } )); di.override(readJsonFileInjectable, () => ( - async (filePath: string) => JSON.parse(await readFile(filePath)) + async (filePath: string) => JSON.parse(readFile(filePath)) + )); + di.override(writeJsonSyncInjectable, () => ( + (filePath, data) => state.set(filePath, JSON.stringify(data)) + )); + di.override(readJsonSyncInjectable, () => ( + (filePath) => JSON.parse(readFile(filePath)) )); di.override(pathExistsInjectable, () => ( - (filePath: string) => Promise.resolve(state.has(filePath)) + async (filePath: string) => state.has(filePath) )); di.override(deleteFileInjectable, () => async (filePath: string) => { state.delete(filePath); @@ -40,5 +48,5 @@ const readFileFor = (state: Map) => (filePath: string) => { ); } - return Promise.resolve(fileContent); + return fileContent; };