From 203580ad920162f18a7e763cf64bdb6e22b1773b Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Mon, 11 Apr 2022 13:31:13 -0400 Subject: [PATCH] fix delete-cluster-dialog.test.tsx Signed-off-by: Sebastian Malton --- src/common/cluster/cluster.ts | 4 +- .../create-context-handler.injectable.ts | 2 +- .../create-kubeconfig-manager.injectable.ts | 6 +- .../__tests__/delete-cluster-dialog.test.tsx | 64 +++++++++---------- .../components/delete-cluster-dialog/view.tsx | 27 ++++---- src/renderer/components/select/select.tsx | 18 +++++- 6 files changed, 70 insertions(+), 51 deletions(-) diff --git a/src/common/cluster/cluster.ts b/src/common/cluster/cluster.ts index 56d46e1107..85d1104f0e 100644 --- a/src/common/cluster/cluster.ts +++ b/src/common/cluster/cluster.ts @@ -58,14 +58,14 @@ export class Cluster implements ClusterModel, ClusterState { public get contextHandler() { // TODO: remove these once main/renderer are seperate classes - assert(this._contextHandler); + assert(this._contextHandler, "contextHandler is only defined in the main environment"); return this._contextHandler; } protected get proxyKubeconfigManager() { // TODO: remove these once main/renderer are seperate classes - assert(this._proxyKubeconfigManager); + assert(this._proxyKubeconfigManager, "proxyKubeconfigManager is only defined in the main environment"); return this._proxyKubeconfigManager; } diff --git a/src/main/context-handler/create-context-handler.injectable.ts b/src/main/context-handler/create-context-handler.injectable.ts index 0740fe7425..fcf3ffbf7e 100644 --- a/src/main/context-handler/create-context-handler.injectable.ts +++ b/src/main/context-handler/create-context-handler.injectable.ts @@ -17,7 +17,7 @@ const createContextHandlerInjectable = getInjectable({ instantiate: (di) => { const createKubeAuthProxy = di.inject(createKubeAuthProxyInjectable); - return (cluster: Cluster): ClusterContextHandler => { + return (cluster: Cluster): ClusterContextHandler | undefined => { const clusterUrl = new URLParse(cluster.apiUrl); return new ContextHandler( diff --git a/src/main/kubeconfig-manager/create-kubeconfig-manager.injectable.ts b/src/main/kubeconfig-manager/create-kubeconfig-manager.injectable.ts index 83f24e1856..077cfe88b5 100644 --- a/src/main/kubeconfig-manager/create-kubeconfig-manager.injectable.ts +++ b/src/main/kubeconfig-manager/create-kubeconfig-manager.injectable.ts @@ -13,16 +13,18 @@ export interface KubeConfigManagerInstantiationParameter { cluster: Cluster; } +export type CreateKubeconfigManager = (cluster: Cluster) => KubeconfigManager | undefined; + const createKubeconfigManagerInjectable = getInjectable({ id: "create-kubeconfig-manager", - instantiate: (di) => { + instantiate: (di): CreateKubeconfigManager => { const dependencies: KubeconfigManagerDependencies = { directoryForTemp: di.inject(directoryForTempInjectable), logger: di.inject(loggerInjectable), }; - return (cluster: Cluster) => new KubeconfigManager(dependencies, cluster); + return (cluster) => new KubeconfigManager(dependencies, cluster); }, }); diff --git a/src/renderer/components/delete-cluster-dialog/__tests__/delete-cluster-dialog.test.tsx b/src/renderer/components/delete-cluster-dialog/__tests__/delete-cluster-dialog.test.tsx index cb40583bec..2675868db6 100644 --- a/src/renderer/components/delete-cluster-dialog/__tests__/delete-cluster-dialog.test.tsx +++ b/src/renderer/components/delete-cluster-dialog/__tests__/delete-cluster-dialog.test.tsx @@ -4,7 +4,7 @@ */ import "@testing-library/jest-dom/extend-expect"; import { KubeConfig } from "@kubernetes/client-node"; -import { fireEvent } from "@testing-library/react"; +import { fireEvent, screen } from "@testing-library/react"; import mockFs from "mock-fs"; import React from "react"; import * as selectEvent from "react-select-event"; @@ -16,9 +16,10 @@ import { createClusterInjectionToken } from "../../../../common/cluster/create-c import createContextHandlerInjectable from "../../../../main/context-handler/create-context-handler.injectable"; import type { DiRender } from "../../test-utils/renderFor"; import { renderFor } from "../../test-utils/renderFor"; -import hotbarStoreInjectable from "../../../../common/hotbars/store.injectable"; import type { OpenDeleteClusterDialog } from "../open.injectable"; import openDeleteClusterDialogInjectable from "../open.injectable"; +import createStoresAndApisInjectable from "../../../create-stores-apis.injectable"; +import createKubeconfigManagerInjectable from "../../../../main/kubeconfig-manager/create-kubeconfig-manager.injectable"; jest.mock("electron", () => ({ app: { @@ -98,12 +99,11 @@ describe("", () => { const { mainDi, rendererDi, runSetups } = getDisForUnitTesting({ doGeneralOverrides: true }); render = renderFor(rendererDi); - - mainDi.override(createContextHandlerInjectable, () => () => undefined as never); - + mainDi.override(createContextHandlerInjectable, () => () => undefined); + mainDi.override(createKubeconfigManagerInjectable, () => () => undefined); mockFs(); - rendererDi.override(hotbarStoreInjectable, () => ({})); + rendererDi.override(createStoresAndApisInjectable, () => true); await runSetups(); @@ -137,7 +137,7 @@ describe("", () => { expect(container).toBeInstanceOf(HTMLElement); }); - it("shows warning when deleting non-current-context cluster", () => { + it("shows warning when deleting non-current-context cluster", async () => { const cluster = createCluster({ id: "test", contextName: "test", @@ -148,14 +148,14 @@ describe("", () => { }); openDeleteClusterDialog({ cluster, config }); - const { getByText } = render(); + render(); const message = "The contents of kubeconfig file will be changed!"; - expect(getByText(message)).toBeInstanceOf(HTMLElement); + expect(await screen.findByText(message)).toBeInstanceOf(HTMLElement); }); - it("shows warning when deleting current-context cluster", () => { + it("shows warning when deleting current-context cluster", async () => { const cluster = createCluster({ id: "other-cluster", contextName: "other-context", @@ -166,10 +166,9 @@ describe("", () => { }); openDeleteClusterDialog({ cluster, config }); + render(); - const { getByTestId } = render(); - - expect(getByTestId("current-context-warning")).toBeInstanceOf(HTMLElement); + expect(await screen.findByTestId("current-context-warning")).toBeInstanceOf(HTMLElement); }); it("shows context switcher when deleting current cluster", async () => { @@ -183,14 +182,15 @@ describe("", () => { }); openDeleteClusterDialog({ cluster, config }); + render(); - const { getByText } = render(); + const menu = await screen.findByText("Select new context..."); - expect(getByText("Select...")).toBeInTheDocument(); - selectEvent.openMenu(getByText("Select...")); + expect(menu).toBeInTheDocument(); + selectEvent.openMenu(menu); - expect(getByText("test")).toBeInTheDocument(); - expect(getByText("test2")).toBeInTheDocument(); + expect(await screen.findByText("test")).toBeInTheDocument(); + expect(await screen.findByText("test2")).toBeInTheDocument(); }); it("shows context switcher after checkbox click", async () => { @@ -204,21 +204,23 @@ describe("", () => { }); openDeleteClusterDialog({ cluster, config }); + render(); - const { getByText, getByTestId } = render(); - const link = getByTestId("context-switch"); + const link = await screen.findByTestId("context-switch"); expect(link).toBeInstanceOf(HTMLElement); fireEvent.click(link); - expect(getByText("Select...")).toBeInTheDocument(); - selectEvent.openMenu(getByText("Select...")); + const menu = await screen.findByText("Select new context..."); - expect(getByText("test")).toBeInTheDocument(); - expect(getByText("test2")).toBeInTheDocument(); + expect(menu).toBeInTheDocument(); + selectEvent.openMenu(menu); + + expect(await screen.findByText("test")).toBeInTheDocument(); + expect(await screen.findByText("test2")).toBeInTheDocument(); }); - it("shows warning for internal kubeconfig cluster", () => { + it("shows warning for internal kubeconfig cluster", async () => { const cluster = createCluster({ id: "some-cluster", contextName: "test", @@ -231,10 +233,9 @@ describe("", () => { const spy = jest.spyOn(cluster, "isInLocalKubeconfig").mockImplementation(() => true); openDeleteClusterDialog({ cluster, config }); + render(); - const { getByTestId } = render(); - - expect(getByTestId("internal-kubeconfig-warning")).toBeInstanceOf(HTMLElement); + expect(await screen.findByTestId("internal-kubeconfig-warning")).toBeInstanceOf(HTMLElement); spy.mockRestore(); }); @@ -256,7 +257,7 @@ describe("", () => { mockFs.restore(); }); - it("shows warning if no other contexts left", () => { + it("shows warning if no other contexts left", async () => { const cluster = createCluster({ id: "other-cluster", contextName: "other-context", @@ -267,10 +268,9 @@ describe("", () => { }); openDeleteClusterDialog({ cluster, config }); + render(); - const { getByTestId } = render(); - - expect(getByTestId("no-more-contexts-warning")).toBeInstanceOf(HTMLElement); + expect(await screen.findByTestId("no-more-contexts-warning")).toBeInstanceOf(HTMLElement); }); }); }); diff --git a/src/renderer/components/delete-cluster-dialog/view.tsx b/src/renderer/components/delete-cluster-dialog/view.tsx index 7744a1c6c3..d0cb7dc6b4 100644 --- a/src/renderer/components/delete-cluster-dialog/view.tsx +++ b/src/renderer/components/delete-cluster-dialog/view.tsx @@ -5,7 +5,7 @@ import styles from "./view.module.scss"; import type { IObservableValue } from "mobx"; -import { action, observable } from "mobx"; +import { action, observable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; @@ -31,7 +31,7 @@ export interface Dependencies { @observer class NonInjectedDeleteClusterDialog extends React.Component { private readonly showContextSwitch = observable.box(false); - private readonly newCurrentContext = observable.box(""); + private readonly newCurrentContext = observable.box(); @action onOpen(state: DeleteClusterDialogState) { @@ -99,24 +99,27 @@ class NonInjectedDeleteClusterDialog extends React.Component { return null; } + const contextName = this.newCurrentContext.get(); + const selectOptions = config + .contexts + .filter(context => context.name !== cluster.contextName); + const selectedOption = selectOptions.find(ctx => ctx.name === contextName); + return (