From c98613590510cbf9dec79e08ca9f6ceb29b8c7e8 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 29 Apr 2022 09:27:49 -0400 Subject: [PATCH] Replace overrideFsWithFakes implementation - Switch to using memfs package because we are now using statInjectable and a handrolled fs replacement will just become to complex Signed-off-by: Sebastian Malton --- package.json | 1 + src/common/fs/stat.injectable.ts | 13 ++++ .../kubeconfig-syncs/get-entry.injectable.ts | 4 +- src/test-utils/override-fs-with-fakes.ts | 70 +++++-------------- 4 files changed, 34 insertions(+), 54 deletions(-) create mode 100644 src/common/fs/stat.injectable.ts diff --git a/package.json b/package.json index 364b5bfcb2..cb838519c8 100644 --- a/package.json +++ b/package.json @@ -373,6 +373,7 @@ "jest-fetch-mock": "^3.0.3", "jest-mock-extended": "^1.0.18", "make-plural": "^6.2.2", + "memfs": "^3.4.1", "mini-css-extract-plugin": "^2.6.0", "mock-http": "^1.1.0", "node-gyp": "7.1.2", diff --git a/src/common/fs/stat.injectable.ts b/src/common/fs/stat.injectable.ts new file mode 100644 index 0000000000..99bbffafa0 --- /dev/null +++ b/src/common/fs/stat.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 statInjectable = getInjectable({ + id: "stat", + instantiate: (di) => di.inject(fsInjectable).stat, +}); + +export default statInjectable; diff --git a/src/renderer/components/+preferences/kubeconfig-syncs/get-entry.injectable.ts b/src/renderer/components/+preferences/kubeconfig-syncs/get-entry.injectable.ts index cc1f5bc135..784d74665a 100644 --- a/src/renderer/components/+preferences/kubeconfig-syncs/get-entry.injectable.ts +++ b/src/renderer/components/+preferences/kubeconfig-syncs/get-entry.injectable.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import fsInjectable from "../../../../common/fs/fs.injectable"; +import statInjectable from "../../../../common/fs/stat.injectable"; import type { KubeconfigSyncEntry } from "../../../../common/user-store"; import kubeconfigSyncsPreferencesLoggerInjectable from "./logger.injectable"; import type { SyncValue } from "./view"; @@ -14,7 +14,7 @@ const getSyncEntryInjectable = getInjectable({ id: "get-sync-entry", instantiate: (di): GetSyncEntry => { const logger = di.inject(kubeconfigSyncsPreferencesLoggerInjectable); - const { stat } = di.inject(fsInjectable); + const stat = di.inject(statInjectable); return async ({ filePath, ...data }) => { try { diff --git a/src/test-utils/override-fs-with-fakes.ts b/src/test-utils/override-fs-with-fakes.ts index 1f0d0321c7..d16ce42dc3 100644 --- a/src/test-utils/override-fs-with-fakes.ts +++ b/src/test-utils/override-fs-with-fakes.ts @@ -7,59 +7,25 @@ import readFileInjectable from "../common/fs/read-file.injectable"; 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"; - -type Override = (di: DiContainer) => void; +import { createFsFromVolume, Volume } from "memfs"; +import statInjectable from "../common/fs/stat.injectable"; export const overrideFsWithFakes = (di: DiContainer) => { - const state = new Map(); + const inMemoryFs = createFsFromVolume(Volume.fromJSON({})); - const readFile = readFileFor(state); - - const overrides: Override[] = [ - (di) => { - di.override(readFileInjectable, () => readFile); - }, - - (di) => { - di.override( - writeJsonFileInjectable, - () => (filePath: string, contents: object) => { - state.set(filePath, JSON.stringify(contents)); - - return Promise.resolve(); - }, - ); - }, - - (di) => { - di.override(readJsonFileInjectable, () => async (filePath: string) => { - const fileContent = await readFile(filePath); - - return JSON.parse(fileContent.toString()); - }); - }, - - (di) => { - di.override( - pathExistsInjectable, - () => async (filePath: string) => Promise.resolve(state.has(filePath)), - ); - }, - ]; - - overrides.forEach(callback => callback(di)); -}; - -const readFileFor = (state: Map) => (filePath: string) => { - const fileContent = state.get(filePath); - - if (!fileContent) { - const existingFilePaths = [...state.keys()].join('", "'); - - throw new Error( - `Tried to access file ${filePath} which does not exist. Existing file paths are: "${existingFilePaths}"`, - ); - } - - return Promise.resolve(fileContent); + di.override(readFileInjectable, () => ( + (filePath) => Promise.resolve(inMemoryFs.readFileSync(filePath, { encoding: "utf-8" })) + )); + di.override(writeJsonFileInjectable, () => ( + (filePath, contents) => Promise.resolve(inMemoryFs.writeFileSync(filePath, JSON.stringify(contents))) + )); + di.override(readJsonFileInjectable, () => ( + (filePath) => Promise.resolve(JSON.parse(inMemoryFs.readFileSync(filePath, { encoding: "utf-8" }) as string)) + )); + di.override(pathExistsInjectable, () => ( + (filePath) => Promise.resolve(inMemoryFs.existsSync(filePath)) + )); + di.override(statInjectable, () => ( + (filePath) => Promise.resolve(inMemoryFs.statSync(filePath)) + )); };