diff --git a/src/behaviours/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx b/src/behaviours/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx new file mode 100644 index 0000000000..3c9695d8fa --- /dev/null +++ b/src/behaviours/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx @@ -0,0 +1,132 @@ +/** + * 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 type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; +import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; +import { getExtensionFakeFor } from "../../../../renderer/components/test-utils/get-extension-fake"; +import { getInjectable } from "@ogre-tools/injectable"; +import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token"; +import type { IObservableValue } from "mobx"; +import { observable, runInAction, computed } from "mobx"; +import React from "react"; +import { navigateToRouteInjectionToken } from "../../../../common/front-end-routing/navigate-to-route-injection-token"; +import { routeSpecificComponentInjectionToken } from "../../../../renderer/routes/route-specific-component-injection-token"; +import extensionShouldBeEnabledForClusterFrameInjectable from "../../../../renderer/extension-loader/extension-should-be-enabled-for-cluster-frame.injectable"; +import { KubeObject } from "../../../../common/k8s-api/kube-object"; +import { KubeObjectStatusLevel } from "../../../../common/k8s-api/kube-object-status"; +import { KubeObjectStatusIcon } from "../../../../renderer/components/kube-object-status-icon"; + +describe("reactively hide kube object status", () => { + let builder: ApplicationBuilder; + let rendered: RenderResult; + let someObservable: IObservableValue; + + beforeEach(async () => { + builder = getApplicationBuilder(); + + const rendererDi = builder.dis.rendererDi; + + rendererDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); + + rendererDi.register(testRouteInjectable, testRouteComponentInjectable); + + builder.setEnvironmentToClusterFrame(); + + const getExtensionFake = getExtensionFakeFor(builder); + + someObservable = observable.box(false); + + const testExtension = getExtensionFake({ + id: "test-extension-id", + name: "test-extension", + + rendererOptions: { + kubeObjectStatusTexts: [ + { + kind: "some-kind", + apiVersions: ["some-api-version"], + + resolve: () => ({ + level: KubeObjectStatusLevel.CRITICAL, + text: "some-kube-object-status-text", + }), + + visible: computed(() => someObservable.get()), + }, + ], + }, + }); + + rendered = await builder.render(); + + const navigateToRoute = rendererDi.inject(navigateToRouteInjectionToken); + const testRoute = rendererDi.inject(testRouteInjectable); + + navigateToRoute(testRoute); + + builder.extensions.enable(testExtension); + }); + + it("does not show the kube object status", () => { + const actual = rendered.baseElement.querySelectorAll( + ".KubeObjectStatusIcon", + ); + + expect(actual).toHaveLength(0); + }); + + it("given item should be shown, shows the kube object status", () => { + runInAction(() => { + someObservable.set(true); + }); + + const actual = rendered.baseElement.querySelectorAll( + ".KubeObjectStatusIcon", + ); + + expect(actual).toHaveLength(1); + }); +}); + +const testRouteInjectable = getInjectable({ + id: "test-route", + + instantiate: () => ({ + path: "/test-route", + clusterFrame: true, + isEnabled: computed(() => true), + }), + + injectionToken: frontEndRouteInjectionToken, +}); + +const testRouteComponentInjectable = getInjectable({ + id: "test-route-component", + + instantiate: (di) => ({ + route: di.inject(testRouteInjectable), + + Component: () => ( + + ), + }), + + injectionToken: routeSpecificComponentInjectionToken, +}); + +const getKubeObjectStub = (kind: string, apiVersion: string) => + KubeObject.create({ + apiVersion, + kind, + metadata: { + uid: "some-uid", + name: "some-name", + resourceVersion: "some-resource-version", + namespace: "some-namespace", + selfLink: "", + }, + }); diff --git a/src/renderer/components/kube-object-status-icon/kube-object-status-registration.ts b/src/renderer/components/kube-object-status-icon/kube-object-status-registration.ts index 01fd22b203..301b1b29eb 100644 --- a/src/renderer/components/kube-object-status-icon/kube-object-status-registration.ts +++ b/src/renderer/components/kube-object-status-icon/kube-object-status-registration.ts @@ -2,6 +2,7 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ +import type { IComputedValue } from "mobx"; import type { KubeObject } from "../../../common/k8s-api/kube-object"; import type { KubeObjectStatus } from "../../../common/k8s-api/kube-object-status"; @@ -9,4 +10,5 @@ export interface KubeObjectStatusRegistration { kind: string; apiVersions: string[]; resolve: (object: KubeObject) => KubeObjectStatus; + visible?: IComputedValue; } diff --git a/src/renderer/components/kube-object-status-icon/kube-object-status-text-registrator.injectable.ts b/src/renderer/components/kube-object-status-icon/kube-object-status-text-registrator.injectable.ts index 0592330e8c..b5ba2bb922 100644 --- a/src/renderer/components/kube-object-status-icon/kube-object-status-text-registrator.injectable.ts +++ b/src/renderer/components/kube-object-status-icon/kube-object-status-text-registrator.injectable.ts @@ -38,9 +38,13 @@ const kubeObjectStatusTextRegistratorInjectable = getInjectable({ instantiate: () => ({ ...registration, - enabled: computed(() => - extensionShouldBeEnabledForClusterFrame.value.get(), - ), + enabled: computed(() => { + if (!extensionShouldBeEnabledForClusterFrame.value.get()) { + return false; + } + + return registration.visible ? registration.visible.get() : true; + }), }), injectionToken: kubeObjectStatusTextInjectionToken,