From 8e2c535bd327bbfcc99c0f8175c3f32bce009a37 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 7 Jul 2022 15:29:51 -0400 Subject: [PATCH] Get tests to pass Signed-off-by: Sebastian Malton --- src/common/__tests__/user-store.test.ts | 4 +++- src/main/__test__/kubeconfig-manager.test.ts | 21 ++++++++++++------- .../create-cluster.injectable.ts | 2 ++ .../kubeconfig-manager/kubeconfig-manager.ts | 4 ++-- .../cluster-store/migrations.injectable.ts | 2 ++ .../user-store/5.0.3-beta.1.injectable.ts | 13 +++++++----- .../create-cluster.injectable.ts | 1 + 7 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/common/__tests__/user-store.test.ts b/src/common/__tests__/user-store.test.ts index 238fc5bce8..22471252dc 100644 --- a/src/common/__tests__/user-store.test.ts +++ b/src/common/__tests__/user-store.test.ts @@ -35,6 +35,7 @@ import writeFileInjectable from "../fs/write-file.injectable"; import { getDiForUnitTesting } from "../../main/getDiForUnitTesting"; import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; import appVersionInjectable from "../get-configuration-file-model/app-version/app-version.injectable"; +import fsInjectable from "../fs/fs.injectable"; console = new Console(stdout, stderr); @@ -49,8 +50,9 @@ describe("user store tests", () => { di.override(writeFileInjectable, () => () => Promise.resolve()); di.override(directoryForUserDataInjectable, () => "some-directory-for-user-data"); - di.permitSideEffects(getConfigurationFileModelInjectable); + di.permitSideEffects(getConfigurationFileModelInjectable); + di.permitSideEffects(fsInjectable); di.permitSideEffects(appVersionInjectable); di.permitSideEffects(userStoreInjectable); diff --git a/src/main/__test__/kubeconfig-manager.test.ts b/src/main/__test__/kubeconfig-manager.test.ts index 9cac0063ee..56e846349b 100644 --- a/src/main/__test__/kubeconfig-manager.test.ts +++ b/src/main/__test__/kubeconfig-manager.test.ts @@ -18,11 +18,12 @@ import type { DiContainer } from "@ogre-tools/injectable"; import { parse } from "url"; import loggerInjectable from "../../common/logger.injectable"; import type { Logger } from "../../common/logger"; -import assert from "assert"; import directoryForUserDataInjectable from "../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; import normalizedPlatformInjectable from "../../common/vars/normalized-platform.injectable"; import kubectlBinaryNameInjectable from "../kubectl/binary-name.injectable"; import kubectlDownloadingNormalizedArchInjectable from "../kubectl/normalized-arch.injectable"; +import readFileInjectable from "../../common/fs/read-file.injectable"; +import fsInjectable from "../../common/fs/fs.injectable"; console = new Console(process.stdout, process.stderr); // fix mockFS @@ -30,7 +31,7 @@ const clusterServerUrl = "https://192.168.64.3:8443"; describe("kubeconfig manager tests", () => { let clusterFake: Cluster; - let createKubeconfigManager: (cluster: Cluster) => KubeconfigManager | undefined; + let createKubeconfigManager: (cluster: Cluster) => KubeconfigManager; let di: DiContainer; let loggerMock: jest.Mocked; @@ -43,6 +44,9 @@ describe("kubeconfig manager tests", () => { di.override(kubectlDownloadingNormalizedArchInjectable, () => "amd64"); di.override(normalizedPlatformInjectable, () => "darwin"); + di.unoverride(readFileInjectable); + di.permitSideEffects(fsInjectable); + loggerMock = { warn: jest.fn(), debug: jest.fn(), @@ -110,11 +114,17 @@ describe("kubeconfig manager tests", () => { it("should create 'temp' kube config with proxy", async () => { const kubeConfManager = createKubeconfigManager(clusterFake); + let kubeConfigPath: string; - assert(kubeConfManager, "should actually create one"); + try { + kubeConfigPath = await kubeConfManager.getPath(); + } catch (error) { + console.error(error); + fail(error); + } expect(loggerMock.error).not.toBeCalled(); - expect(await kubeConfManager.getPath()).toBe(`some-directory-for-temp${path.sep}kubeconfig-foo`); + expect(kubeConfigPath).toBe(`some-directory-for-temp${path.sep}kubeconfig-foo`); // this causes an intermittent "ENXIO: no such device or address, read" error // const file = await fse.readFile(await kubeConfManager.getPath()); const file = fse.readFileSync(await kubeConfManager.getPath()); @@ -127,9 +137,6 @@ describe("kubeconfig manager tests", () => { it("should remove 'temp' kube config on unlink and remove reference from inside class", async () => { const kubeConfManager = createKubeconfigManager(clusterFake); - - assert(kubeConfManager, "should actually create one"); - const configPath = await kubeConfManager.getPath(); expect(await fse.pathExists(configPath)).toBe(true); diff --git a/src/main/create-cluster/create-cluster.injectable.ts b/src/main/create-cluster/create-cluster.injectable.ts index 07c2ee3247..65518c3156 100644 --- a/src/main/create-cluster/create-cluster.injectable.ts +++ b/src/main/create-cluster/create-cluster.injectable.ts @@ -15,6 +15,7 @@ import listNamespacesInjectable from "../../common/cluster/list-namespaces.injec import loggerInjectable from "../../common/logger.injectable"; import detectorRegistryInjectable from "../cluster-detectors/detector-registry.injectable"; import createVersionDetectorInjectable from "../cluster-detectors/create-version-detector.injectable"; +import readFileInjectable from "../../common/fs/read-file.injectable"; const createClusterInjectable = getInjectable({ id: "create-cluster", @@ -30,6 +31,7 @@ const createClusterInjectable = getInjectable({ logger: di.inject(loggerInjectable), detectorRegistry: di.inject(detectorRegistryInjectable), createVersionDetector: di.inject(createVersionDetectorInjectable), + readFile: di.inject(readFileInjectable), }; return (model, configData) => new Cluster(dependencies, model, configData); diff --git a/src/main/kubeconfig-manager/kubeconfig-manager.ts b/src/main/kubeconfig-manager/kubeconfig-manager.ts index d7a9794a0f..2128b31815 100644 --- a/src/main/kubeconfig-manager/kubeconfig-manager.ts +++ b/src/main/kubeconfig-manager/kubeconfig-manager.ts @@ -16,7 +16,7 @@ import type { Logger } from "../../common/logger"; export interface KubeconfigManagerDependencies { readonly directoryForTemp: string; readonly logger: Logger; - lensProxyPort: { get: () => number }; + readonly lensProxyPort: { get: () => number }; } export class KubeconfigManager { @@ -78,7 +78,7 @@ export class KubeconfigManager { return this.tempFilePath = await this.createProxyKubeconfig(); } catch (error) { - throw Object.assign(new Error("Failed to creat temp config for auth-proxy"), { cause: error }); + throw new Error("Failed to creat temp config for auth-proxy", { cause: error as Error }); } } diff --git a/src/main/migrations/cluster-store/migrations.injectable.ts b/src/main/migrations/cluster-store/migrations.injectable.ts index 54b0be68d8..0373f9817c 100644 --- a/src/main/migrations/cluster-store/migrations.injectable.ts +++ b/src/main/migrations/cluster-store/migrations.injectable.ts @@ -8,6 +8,7 @@ import joinMigrationsInjectable from "../join.injectable"; import { getInjectable } from "@ogre-tools/injectable"; import { clusterStoreMigrationDeclarationInjectionToken } from "./migration"; +import { clusterStoreMigrationsInjectionToken } from "../../../common/cluster-store/migrations"; const clusterStoreMigrationsInjectable = getInjectable({ id: "cluster-store-migrations", @@ -17,6 +18,7 @@ const clusterStoreMigrationsInjectable = getInjectable({ return joinMigrations(migrationDeclarations); }, + injectionToken: clusterStoreMigrationsInjectionToken, }); export default clusterStoreMigrationsInjectable; diff --git a/src/main/migrations/user-store/5.0.3-beta.1.injectable.ts b/src/main/migrations/user-store/5.0.3-beta.1.injectable.ts index 80cd88ceb4..8adc87754d 100644 --- a/src/main/migrations/user-store/5.0.3-beta.1.injectable.ts +++ b/src/main/migrations/user-store/5.0.3-beta.1.injectable.ts @@ -8,7 +8,7 @@ import path from "path"; import os from "os"; import type { ClusterStoreModel } from "../../../common/cluster-store/cluster-store"; import type { KubeconfigSyncEntry } from "../../../common/user-store"; -import { hasTypedProperty, isErrnoException, isLogicalChildPath } from "../../../common/utils"; +import { hasOptionalTypedProperty, isErrnoException, isLogicalChildPath } from "../../../common/utils"; import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; import directoryForKubeConfigsInjectable from "../../../common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable"; import { getInjectable } from "@ogre-tools/injectable"; @@ -39,17 +39,20 @@ const userStoreV503Beta1MigrationInjectable = getInjectable({ return; } - if (!hasTypedProperty(preferences, "syncKubeconfigEntries", Array.isArray)) { + if (!hasOptionalTypedProperty(preferences, "syncKubeconfigEntries", Array.isArray)) { + delete (preferences as any).syncKubeconfigEntries; + + store.set("preferences", preferences); + return; } - const { syncKubeconfigEntries } = preferences; - + const { syncKubeconfigEntries = [] } = preferences; const { clusters = [] }: ClusterStoreModel = JSON.parse(readFileSync(joinPaths(userDataPath, "lens-cluster-store.json"))) ?? {}; const extensionDataDir = joinPaths(userDataPath, "extension_data"); const syncPaths = new Set(syncKubeconfigEntries.map(s => s.filePath)); - syncPaths.add(path.join(os.homedir(), ".kube")); + syncPaths.add(joinPaths(os.homedir(), ".kube")); for (const cluster of clusters) { if (!cluster.kubeConfigPath) { diff --git a/src/renderer/create-cluster/create-cluster.injectable.ts b/src/renderer/create-cluster/create-cluster.injectable.ts index 7e997477a6..0ff40a5cbf 100644 --- a/src/renderer/create-cluster/create-cluster.injectable.ts +++ b/src/renderer/create-cluster/create-cluster.injectable.ts @@ -26,6 +26,7 @@ const createClusterInjectable = getInjectable({ createListNamespaces: () => { throw new Error("Tried to access back-end feature in front-end."); }, detectorRegistry: undefined as never, createVersionDetector: () => { throw new Error("Tried to access back-end feature in front-end."); }, + readFile: () => { throw new Error("Tried to access back-end feature in front-end."); }, }; return (model, configData) => new Cluster(dependencies, model, configData);