From f52e79fdaa12e3d516c574841b9455c2ea8f5b86 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 4 Jan 2023 16:24:07 -0500 Subject: [PATCH] Fix delete-cluster-dialog tests Signed-off-by: Sebastian Malton --- .../delete-cluster-dialog.test.tsx | 29 ++----- .../is-current-context.tsx | 10 +++ .../delete-cluster-dialog/open.injectable.ts | 13 ++- .../delete-cluster-dialog/state.injectable.ts | 2 + .../components/delete-cluster-dialog/view.tsx | 87 ++++++++----------- 5 files changed, 68 insertions(+), 73 deletions(-) create mode 100644 src/renderer/components/delete-cluster-dialog/is-current-context.tsx diff --git a/src/features/cluster/delete-dialog/delete-cluster-dialog.test.tsx b/src/features/cluster/delete-dialog/delete-cluster-dialog.test.tsx index 5c527edbb4..5cbf8267de 100644 --- a/src/features/cluster/delete-dialog/delete-cluster-dialog.test.tsx +++ b/src/features/cluster/delete-dialog/delete-cluster-dialog.test.tsx @@ -18,6 +18,7 @@ import type { Cluster } from "../../../common/cluster/cluster"; import navigateToCatalogInjectable from "../../../common/front-end-routing/routes/catalog/navigate-to-catalog.injectable"; import directoryForKubeConfigsInjectable from "../../../common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable"; import joinPathsInjectable from "../../../common/path/join-paths.injectable"; +import { advanceFakeTime } from "../../../common/test-utils/use-fake-time"; const currentClusterServerUrl = "https://localhost"; const nonCurrentClusterServerUrl = "http://localhost"; @@ -135,11 +136,8 @@ describe("Deleting a cluster", () => { describe("when the dialog is opened for the current cluster", () => { // TODO: replace with actual behaviour instead of technical use beforeEach(async () => { - openDeleteClusterDialog({ - cluster: currentCluster, - config, - }); - + openDeleteClusterDialog(config, currentCluster); + advanceFakeTime(1000); await rendered.findByTestId("delete-cluster-dialog"); }); @@ -159,11 +157,8 @@ describe("Deleting a cluster", () => { describe("when the dialog is opened for not the current cluster", () => { // TODO: replace with actual behaviour instead of technical use beforeEach(async () => { - openDeleteClusterDialog({ - cluster: nonCurrentCluster, - config, - }); - + openDeleteClusterDialog(config, nonCurrentCluster); + advanceFakeTime(1000); await rendered.findByTestId("delete-cluster-dialog"); }); @@ -219,11 +214,8 @@ describe("Deleting a cluster", () => { describe("when the dialog is opened", () => { // TODO: replace with actual behaviour instead of technical use beforeEach(async () => { - openDeleteClusterDialog({ - cluster: currentCluster, - config, - }); - + openDeleteClusterDialog(config, currentCluster); + advanceFakeTime(1000); await rendered.findByTestId("delete-cluster-dialog"); }); @@ -258,11 +250,8 @@ describe("Deleting a cluster", () => { describe("when the dialog is opened", () => { // TODO: replace with actual behaviour instead of technical use beforeEach(async () => { - openDeleteClusterDialog({ - cluster: currentCluster, - config, - }); - + openDeleteClusterDialog(config, currentCluster); + advanceFakeTime(1000); await rendered.findByTestId("delete-cluster-dialog"); }); diff --git a/src/renderer/components/delete-cluster-dialog/is-current-context.tsx b/src/renderer/components/delete-cluster-dialog/is-current-context.tsx new file mode 100644 index 0000000000..e0eebcea63 --- /dev/null +++ b/src/renderer/components/delete-cluster-dialog/is-current-context.tsx @@ -0,0 +1,10 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import type { KubeConfig } from "@kubernetes/client-node"; +import type { Cluster } from "../../../common/cluster/cluster"; + +export function isCurrentContext(config: KubeConfig, cluster: Cluster) { + return config.currentContext == cluster.contextName; +} diff --git a/src/renderer/components/delete-cluster-dialog/open.injectable.ts b/src/renderer/components/delete-cluster-dialog/open.injectable.ts index 992956845f..987e627774 100644 --- a/src/renderer/components/delete-cluster-dialog/open.injectable.ts +++ b/src/renderer/components/delete-cluster-dialog/open.injectable.ts @@ -2,18 +2,25 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ +import type { KubeConfig } from "@kubernetes/client-node"; import { getInjectable } from "@ogre-tools/injectable"; -import type { DeleteClusterDialogState } from "./state.injectable"; +import type { Cluster } from "../../../common/cluster/cluster"; +import { isCurrentContext } from "./is-current-context"; import deleteClusterDialogStateInjectable from "./state.injectable"; -export type OpenDeleteClusterDialog = (props: DeleteClusterDialogState) => void; +export type OpenDeleteClusterDialog = (config: KubeConfig, cluster: Cluster) => void; const openDeleteClusterDialogInjectable = getInjectable({ id: "open-delete-cluster-dialog", instantiate: (di): OpenDeleteClusterDialog => { const state = di.inject(deleteClusterDialogStateInjectable); - return (props) => state.set(props); + return (config, cluster) => state.set({ + cluster, + config, + newCurrentContext: "", + showContextSwitch: isCurrentContext(config, cluster), + }); }, }); diff --git a/src/renderer/components/delete-cluster-dialog/state.injectable.ts b/src/renderer/components/delete-cluster-dialog/state.injectable.ts index 8287ba6445..fe75e034ef 100644 --- a/src/renderer/components/delete-cluster-dialog/state.injectable.ts +++ b/src/renderer/components/delete-cluster-dialog/state.injectable.ts @@ -10,6 +10,8 @@ import type { Cluster } from "../../../common/cluster/cluster"; export interface DeleteClusterDialogState { config: KubeConfig; cluster: Cluster; + showContextSwitch: boolean; + newCurrentContext: string; } const deleteClusterDialogStateInjectable = getInjectable({ diff --git a/src/renderer/components/delete-cluster-dialog/view.tsx b/src/renderer/components/delete-cluster-dialog/view.tsx index 69b3bc1612..78b06c7fe2 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 { runInAction } from "mobx"; import { observer } from "mobx-react"; import React from "react"; @@ -29,6 +29,7 @@ import requestDeleteClusterInjectable from "../../../features/cluster/delete-dia import type { SaveKubeconfig } from "./save-kubeconfig.injectable"; import saveKubeconfigInjectable from "./save-kubeconfig.injectable"; import showErrorNotificationInjectable from "../notifications/show-error-notification.injectable"; +import { isCurrentContext } from "./is-current-context"; interface Dependencies { state: IObservableValue; @@ -42,40 +43,22 @@ interface Dependencies { @observer class NonInjectedDeleteClusterDialog extends React.Component { - private readonly showContextSwitch = observable.box(false); - private readonly newCurrentContext = observable.box(); - - @action - onOpen(state: DeleteClusterDialogState) { - this.newCurrentContext.set(""); - this.showContextSwitch.set(this.isCurrentContext(state)); - } - - onClose = () => { - this.showContextSwitch.set(false); - }; - - removeContext(state: DeleteClusterDialogState) { - state.config.contexts = state.config.contexts.filter(item => - item.name !== state.cluster.contextName, - ); - } - - changeCurrentContext(state: DeleteClusterDialogState) { - const newCurrentContext = this.newCurrentContext.get(); - const showContextSwitch = this.showContextSwitch.get(); - - if (newCurrentContext && showContextSwitch) { - state.config.currentContext = newCurrentContext; - } - } - async onDelete(state: DeleteClusterDialogState) { - const { cluster, config } = state; + const { cluster, config, newCurrentContext, showContextSwitch } = state; await this.props.requestSetClusterAsDeleting(cluster.id); - this.removeContext(state); - this.changeCurrentContext(state); + + runInAction(() => { + this.props.state.set({ + ...state, + config: Object.assign(config, { + contexts: config.contexts.filter(item => item.name !== state.cluster.contextName), + currentContext: newCurrentContext && showContextSwitch + ? newCurrentContext + : config.currentContext, + }), + }); + }); try { await this.props.saveKubeconfig(config, cluster.kubeConfigPath); @@ -85,15 +68,13 @@ class NonInjectedDeleteClusterDialog extends React.Component { this.props.showErrorNotification(`Cannot remove cluster, failed to process config file. ${error}`); } finally { await this.props.requestClearClusterAsDeleting(cluster.id); + this.close(); } - - this.onClose(); } - shouldDeleteBeDisabled({ cluster, config }: DeleteClusterDialogState): boolean { + shouldDeleteBeDisabled({ cluster, config, newCurrentContext, showContextSwitch }: DeleteClusterDialogState): boolean { const noContextsAvailable = config.contexts.filter(context => context.name !== cluster.contextName).length == 0; - const newContextNotSelected = this.newCurrentContext.get() === ""; - const showContextSwitch = this.showContextSwitch.get(); + const newContextNotSelected = newCurrentContext === ""; if (noContextsAvailable) { return false; @@ -102,12 +83,10 @@ class NonInjectedDeleteClusterDialog extends React.Component { return showContextSwitch && newContextNotSelected; } - isCurrentContext({ cluster, config }: DeleteClusterDialogState) { - return config.currentContext == cluster.contextName; - } + renderCurrentContextSwitch(state: DeleteClusterDialogState) { + const { cluster, config, showContextSwitch, newCurrentContext } = state; - renderCurrentContextSwitch({ cluster, config }: DeleteClusterDialogState) { - if (!this.showContextSwitch.get()) { + if (!showContextSwitch) { return null; } @@ -124,10 +103,13 @@ class NonInjectedDeleteClusterDialog extends React.Component {