diff --git a/src/behaviours/helm-charts/__snapshots__/activate-helm-repository-from-list-in-preferences.test.ts.snap b/src/behaviours/helm-charts/__snapshots__/activate-helm-repository-from-list-in-preferences.test.ts.snap index 33cb389643..7433d2fe39 100644 --- a/src/behaviours/helm-charts/__snapshots__/activate-helm-repository-from-list-in-preferences.test.ts.snap +++ b/src/behaviours/helm-charts/__snapshots__/activate-helm-repository-from-list-in-preferences.test.ts.snap @@ -1063,7 +1063,9 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
+
some-url
+ + + delete + +
+
@@ -1626,7 +1642,9 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
+
some-url
+ + + delete + +
+
@@ -2238,7 +2270,9 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
+
some-url
+ + + delete + +
+
@@ -3362,7 +3410,9 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
+
some-url
+ + + delete + +
+
-
+
some-other-url
+ + + delete + +
+
@@ -3938,7 +4018,9 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
+
some-url
+ + + delete + +
+
-
+
some-other-url
+ + + delete + +
+
@@ -4573,7 +4685,9 @@ exports[`activate helm repository from list in preferences when navigating to pr
-
+
some-url
+ + + delete + +
+
-
+
some-other-url
+ + + delete + +
+
diff --git a/src/behaviours/helm-charts/__snapshots__/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap b/src/behaviours/helm-charts/__snapshots__/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap new file mode 100644 index 0000000000..7afbf7ef6b --- /dev/null +++ b/src/behaviours/helm-charts/__snapshots__/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap @@ -0,0 +1,2281 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`deactivate helm repository from list of active repositories in preferences when navigating to preferences containing helm repositories renders 1`] = ` + +
+
+ +
+
+
+
+

+ Kubernetes +

+
+
+ Kubectl binary download + +
+ +
+
+
+ Download mirror + +
+
+ + +
+
+
+ Download mirror for kubectl +
+
+ +
+
+
+ + +
+
+
+
+
+
+ Directory for binaries + +
+
+ +
+
+
+ The directory to download binaries into. +
+
+
+
+ Path to kubectl binary + +
+
+ +
+
+
+
+
+
+

+ Kubeconfig Syncs +

+
+ +
+
+ Synced Items + +
+
+
+ No files and folders have been synced yet +
+
+
+
+
+

+ Helm Charts +

+
+
+
+ + +
+
+
+ Repositories +
+
+ +
+
+
+ + + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ Repositories +
+
+ +
+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + close + + +
+ +
+
+
+
+
+
+
+ +`; + +exports[`deactivate helm repository from list of active repositories in preferences when navigating to preferences containing helm repositories when active repositories resolve renders 1`] = ` + +
+
+ +
+
+
+
+

+ Kubernetes +

+
+
+ Kubectl binary download + +
+ +
+
+
+ Download mirror + +
+
+ + +
+
+
+ Download mirror for kubectl +
+
+ +
+
+
+ + +
+
+
+
+
+
+ Directory for binaries + +
+
+ +
+
+
+ The directory to download binaries into. +
+
+
+
+ Path to kubectl binary + +
+
+ +
+
+
+
+
+
+

+ Kubeconfig Syncs +

+
+ +
+
+ Synced Items + +
+
+
+ No files and folders have been synced yet +
+
+
+
+
+

+ Helm Charts +

+
+
+
+ + +
+
+
+ Repositories +
+
+ +
+
+
+ + + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ Repositories +
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+ some-active-repository +
+
+ some-url +
+ + + delete + +
+ +
+
+
+
+
+
+
+
+
+
+ + + close + + +
+ +
+
+
+
+
+
+
+ +`; + +exports[`deactivate helm repository from list of active repositories in preferences when navigating to preferences containing helm repositories when active repositories resolve when deactivating repository renders 1`] = ` + +
+
+ +
+
+
+
+

+ Kubernetes +

+
+
+ Kubectl binary download + +
+ +
+
+
+ Download mirror + +
+
+ + +
+
+
+ Download mirror for kubectl +
+
+ +
+
+
+ + +
+
+
+
+
+
+ Directory for binaries + +
+
+ +
+
+
+ The directory to download binaries into. +
+
+
+
+ Path to kubectl binary + +
+
+ +
+
+
+
+
+
+

+ Kubeconfig Syncs +

+
+ +
+
+ Synced Items + +
+
+
+ No files and folders have been synced yet +
+
+
+
+
+

+ Helm Charts +

+
+
+
+ + +
+
+
+ Repositories +
+
+ +
+
+
+ + + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ Repositories +
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+ some-active-repository +
+
+ some-url +
+ + + delete + +
+ +
+
+
+
+
+
+
+
+
+
+ + + close + + +
+ +
+
+
+
+
+
+
+ +`; + +exports[`deactivate helm repository from list of active repositories in preferences when navigating to preferences containing helm repositories when active repositories resolve when deactivating repository when deactivating resolves renders 1`] = ` + +
+
+ +
+
+
+
+

+ Kubernetes +

+
+
+ Kubectl binary download + +
+ +
+
+
+ Download mirror + +
+
+ + +
+
+
+ Download mirror for kubectl +
+
+ +
+
+
+ + +
+
+
+
+
+
+ Directory for binaries + +
+
+ +
+
+
+ The directory to download binaries into. +
+
+
+
+ Path to kubectl binary + +
+
+ +
+
+
+
+
+
+

+ Kubeconfig Syncs +

+
+ +
+
+ Synced Items + +
+
+
+ No files and folders have been synced yet +
+
+
+
+
+

+ Helm Charts +

+
+
+
+ + +
+
+
+ Repositories +
+
+ +
+
+
+ + + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ Repositories +
+
+ +
+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + close + + +
+ +
+
+
+
+
+
+
+ +`; diff --git a/src/behaviours/helm-charts/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts b/src/behaviours/helm-charts/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts new file mode 100644 index 0000000000..c71adf628c --- /dev/null +++ b/src/behaviours/helm-charts/deactivate-helm-repository-from-list-of-active-repository-in-preferences.test.ts @@ -0,0 +1,117 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import type { RenderResult } from "@testing-library/react"; +import { fireEvent } from "@testing-library/react"; +import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; +import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; +import type { AsyncFnMock } from "@async-fn/jest"; +import asyncFn from "@async-fn/jest"; +import execFileInjectable from "../../common/fs/exec-file.injectable"; +import helmBinaryPathInjectable from "../../main/helm/helm-binary-path.injectable"; +import getActiveHelmRepositoriesInjectable from "../../main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable"; +import type { HelmRepo } from "../../common/helm-repo"; +import callForPublicHelmRepositoriesInjectable from "../../renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/public-helm-repositories/call-for-public-helm-repositories.injectable"; + +describe("deactivate helm repository from list of active repositories in preferences", () => { + let applicationBuilder: ApplicationBuilder; + let rendered: RenderResult; + let getActiveHelmRepositoriesMock: AsyncFnMock<() => Promise>; + let execFileMock: AsyncFnMock< + ReturnType + >; + + beforeEach(async () => { + applicationBuilder = getApplicationBuilder(); + + execFileMock = asyncFn(); + getActiveHelmRepositoriesMock = asyncFn(); + + applicationBuilder.beforeApplicationStart(({ mainDi, rendererDi }) => { + rendererDi.override(callForPublicHelmRepositoriesInjectable, () => async () => []); + + mainDi.override( + getActiveHelmRepositoriesInjectable, + () => getActiveHelmRepositoriesMock, + ); + + mainDi.override(execFileInjectable, () => execFileMock); + mainDi.override(helmBinaryPathInjectable, () => "some-helm-binary-path"); + }); + + rendered = await applicationBuilder.render(); + }); + + describe("when navigating to preferences containing helm repositories", () => { + beforeEach(async () => { + applicationBuilder.preferences.navigate(); + applicationBuilder.preferences.navigation.click("kubernetes"); + }); + + it("renders", () => { + expect(rendered.baseElement).toMatchSnapshot(); + }); + + describe("when active repositories resolve", () => { + beforeEach(async () => { + getActiveHelmRepositoriesMock.resolve([ + { name: "some-active-repository", url: "some-url" }, + ]); + }); + + it("renders", () => { + expect(rendered.baseElement).toMatchSnapshot(); + }); + + describe("when deactivating repository", () => { + beforeEach(() => { + execFileMock.mockClear(); + getActiveHelmRepositoriesMock.mockClear(); + + const deactiveButton = rendered.getByTestId( + "deactivate-helm-repository-some-active-repository", + ); + + fireEvent.click(deactiveButton); + }); + + it("renders", () => { + expect(rendered.baseElement).toMatchSnapshot(); + }); + + it("deactivates the repository", () => { + expect(execFileMock).toHaveBeenCalledWith( + "some-helm-binary-path", + ["repo", "remove", "some-active-repository"], + ); + }); + + it("does not reload active repositories yet", () => { + expect(getActiveHelmRepositoriesMock).not.toHaveBeenCalled(); + }); + + describe("when deactivating resolves", () => { + beforeEach(async () => { + await execFileMock.resolveSpecific( + [ + "some-helm-binary-path", + ["repo", "remove", "some-active-repository"], + ], + + "", + ); + }); + + it("renders", () => { + expect(rendered.baseElement).toMatchSnapshot(); + }); + + it("reloads active repositories", () => { + expect(getActiveHelmRepositoriesMock).toHaveBeenCalled(); + }); + }); + }); + }); + }); +}); diff --git a/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/select-helm-repository/select-helm-repository.injectable.ts b/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/select-helm-repository/select-helm-repository.injectable.ts index 95261e9678..dd2e9c3aa5 100644 --- a/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/select-helm-repository/select-helm-repository.injectable.ts +++ b/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/select-helm-repository/select-helm-repository.injectable.ts @@ -7,7 +7,7 @@ import activateHelmRepositoryInjectable from "./activate-helm-repository.injecta import type { SelectOption } from "../../../../../select"; import type { HelmRepo } from "../../../../../../../common/helm-repo"; import type { SingleValue } from "react-select"; -import deactivateHelmRepositoryInjectable from "./deactivate-helm-repository.injectable"; +import deactivateHelmRepositoryInjectable from "../../deactivate-helm-repository.injectable"; const selectHelmRepositoryInjectable = getInjectable({ id: "select-helm-repository", diff --git a/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/select-helm-repository/deactivate-helm-repository.injectable.ts b/src/renderer/components/+preferences/kubernetes/helm-charts/deactivate-helm-repository.injectable.ts similarity index 76% rename from src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/select-helm-repository/deactivate-helm-repository.injectable.ts rename to src/renderer/components/+preferences/kubernetes/helm-charts/deactivate-helm-repository.injectable.ts index 3b9bb2f088..3a1f7c000a 100644 --- a/src/renderer/components/+preferences/kubernetes/helm-charts/activation-of-public-helm-repository/select-helm-repository/deactivate-helm-repository.injectable.ts +++ b/src/renderer/components/+preferences/kubernetes/helm-charts/deactivate-helm-repository.injectable.ts @@ -3,10 +3,10 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import type { HelmRepo } from "../../../../../../../common/helm-repo"; -import { requestFromChannelInjectionToken } from "../../../../../../../common/utils/channel/request-from-channel-injection-token"; -import activeHelmRepositoriesInjectable from "../../active-helm-repositories.injectable"; -import deactivateHelmRepositoryChannelInjectable from "../../../../../../../common/helm/deactivate-helm-repository-channel.injectable"; +import type { HelmRepo } from "../../../../../common/helm-repo"; +import { requestFromChannelInjectionToken } from "../../../../../common/utils/channel/request-from-channel-injection-token"; +import activeHelmRepositoriesInjectable from "./active-helm-repositories.injectable"; +import deactivateHelmRepositoryChannelInjectable from "../../../../../common/helm/deactivate-helm-repository-channel.injectable"; const activatePublicHelmRepositoryInjectable = getInjectable({ id: "deactivate-public-helm-repository", diff --git a/src/renderer/components/+preferences/kubernetes/helm-charts/helm-repositories.tsx b/src/renderer/components/+preferences/kubernetes/helm-charts/helm-repositories.tsx index bcb6bfcbd2..aab7cb9152 100644 --- a/src/renderer/components/+preferences/kubernetes/helm-charts/helm-repositories.tsx +++ b/src/renderer/components/+preferences/kubernetes/helm-charts/helm-repositories.tsx @@ -15,12 +15,15 @@ import { Spinner } from "../../../spinner"; import type { HelmRepo } from "../../../../../common/helm-repo"; import { Notice } from "../../../+extensions/notice"; import { isEmpty } from "lodash/fp"; +import { RemovableItem } from "../../removable-item"; +import deactivateHelmRepositoryInjectable from "./deactivate-helm-repository.injectable"; interface Dependencies { activeHelmRepositories: IAsyncComputed; + deactivateRepository: (repository: HelmRepo) => Promise; } -const NonInjectedActiveHelmRepositories = observer(({ activeHelmRepositories }: Dependencies) => { +const NonInjectedActiveHelmRepositories = observer(({ activeHelmRepositories, deactivateRepository }: Dependencies) => { if (activeHelmRepositories.pending.get()) { return ; } @@ -40,13 +43,18 @@ const NonInjectedActiveHelmRepositories = observer(({ activeHelmRepositories }: return (
{repositories.map((repository) => ( -
+ deactivateRepository(repository)} + className="mt-3" + data-testid={`deactivate-helm-repository-${repository.name}`} + >
{repository.name}
{repository.url}
-
+ ))}
); @@ -59,6 +67,7 @@ export const HelmRepositories = withInjectables( { getProps: (di) => ({ activeHelmRepositories: di.inject(activeHelmRepositoriesInjectable), + deactivateRepository: di.inject(deactivateHelmRepositoryInjectable), }), }, ); diff --git a/src/renderer/components/+preferences/removable-item.tsx b/src/renderer/components/+preferences/removable-item.tsx index eb0cf048e3..328ec7b5ad 100644 --- a/src/renderer/components/+preferences/removable-item.tsx +++ b/src/renderer/components/+preferences/removable-item.tsx @@ -14,9 +14,10 @@ export interface RemovableItemProps extends DOMAttributes{ icon?: string; onRemove: () => void; className?: string; + "data-testid"?: string; } -export function RemovableItem({ icon, onRemove, children, className, ...rest }: RemovableItemProps) { +export function RemovableItem({ icon, onRemove, children, className, "data-testid": testId, ...rest }: RemovableItemProps) { return (
{icon && ( @@ -27,6 +28,7 @@ export function RemovableItem({ icon, onRemove, children, className, ...rest }: material="delete" onClick={onRemove} tooltip="Remove" + data-testid={testId} />
);