mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Expose reactive way to hide kube object detail items in Extension API
Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
parent
28bddf6bd7
commit
87a6ded2a4
@ -0,0 +1,138 @@
|
|||||||
|
/**
|
||||||
|
* 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 { runInAction, computed, observable } 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 { KubeObject } from "../../../../common/k8s-api/kube-object";
|
||||||
|
import apiManagerInjectable from "../../../../common/k8s-api/api-manager/manager.injectable";
|
||||||
|
import { KubeObjectDetails } from "../../../../renderer/components/kube-object-details";
|
||||||
|
import type { ApiManager } from "../../../../common/k8s-api/api-manager";
|
||||||
|
|
||||||
|
describe("reactively hide kube object detail item", () => {
|
||||||
|
let builder: ApplicationBuilder;
|
||||||
|
let rendered: RenderResult;
|
||||||
|
let someObservable: IObservableValue<boolean>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
builder = getApplicationBuilder();
|
||||||
|
|
||||||
|
builder.beforeApplicationStart(({ rendererDi }) => {
|
||||||
|
rendererDi.override(
|
||||||
|
apiManagerInjectable,
|
||||||
|
() =>
|
||||||
|
({
|
||||||
|
getStore: () => ({
|
||||||
|
getByPath: () =>
|
||||||
|
getKubeObjectStub("some-kind", "some-api-version"),
|
||||||
|
}),
|
||||||
|
} as unknown as ApiManager),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const rendererDi = builder.dis.rendererDi;
|
||||||
|
|
||||||
|
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: {
|
||||||
|
kubeObjectDetailItems: [
|
||||||
|
{
|
||||||
|
kind: "some-kind",
|
||||||
|
apiVersions: ["some-api-version"],
|
||||||
|
|
||||||
|
components: {
|
||||||
|
Details: () => (
|
||||||
|
<div data-testid="some-kube-object-detail-item">
|
||||||
|
Some detail
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
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 detail item", () => {
|
||||||
|
const actual = rendered.queryByTestId("some-kube-object-detail-item");
|
||||||
|
|
||||||
|
expect(actual).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("given item should be shown, shows the kube object detail item", () => {
|
||||||
|
runInAction(() => {
|
||||||
|
someObservable.set(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
const actual = rendered.queryByTestId("some-kube-object-detail-item");
|
||||||
|
|
||||||
|
expect(actual).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
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: () => <KubeObjectDetails />,
|
||||||
|
}),
|
||||||
|
|
||||||
|
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: "",
|
||||||
|
},
|
||||||
|
});
|
||||||
@ -10,9 +10,7 @@ import extensionShouldBeEnabledForClusterFrameInjectable from "../../../extensio
|
|||||||
import { kubeObjectDetailItemInjectionToken } from "./kube-object-detail-item-injection-token";
|
import { kubeObjectDetailItemInjectionToken } from "./kube-object-detail-item-injection-token";
|
||||||
import { extensionRegistratorInjectionToken } from "../../../../extensions/extension-loader/extension-registrator-injection-token";
|
import { extensionRegistratorInjectionToken } from "../../../../extensions/extension-loader/extension-registrator-injection-token";
|
||||||
import currentKubeObjectInDetailsInjectable from "../current-kube-object-in-details.injectable";
|
import currentKubeObjectInDetailsInjectable from "../current-kube-object-in-details.injectable";
|
||||||
import {
|
import { kubeObjectMatchesToKindAndApiVersion } from "./kube-object-matches-to-kind-and-api-version";
|
||||||
kubeObjectMatchesToKindAndApiVersion,
|
|
||||||
} from "./kube-object-matches-to-kind-and-api-version";
|
|
||||||
|
|
||||||
const kubeObjectDetailItemRegistratorInjectable = getInjectable({
|
const kubeObjectDetailItemRegistratorInjectable = getInjectable({
|
||||||
id: "kube-object-detail-item-registrator",
|
id: "kube-object-detail-item-registrator",
|
||||||
@ -45,20 +43,24 @@ const kubeObjectDetailItemRegistratorInjectable = getInjectable({
|
|||||||
id,
|
id,
|
||||||
|
|
||||||
instantiate: (di) => {
|
instantiate: (di) => {
|
||||||
const kubeObject = di.inject(
|
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||||
currentKubeObjectInDetailsInjectable,
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
kind: registration.kind,
|
kind: registration.kind,
|
||||||
apiVersions: registration.apiVersions,
|
apiVersions: registration.apiVersions,
|
||||||
Component: registration.components.Details,
|
Component: registration.components.Details,
|
||||||
|
|
||||||
enabled: computed(
|
enabled: computed(() => {
|
||||||
() =>
|
if (!extensionShouldBeEnabledForClusterFrame.value.get()) {
|
||||||
extensionShouldBeEnabledForClusterFrame.value.get() &&
|
return false;
|
||||||
isRelevantKubeObject(kubeObject.get()),
|
}
|
||||||
),
|
|
||||||
|
if (!isRelevantKubeObject(kubeObject.get())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return registration.visible ? registration.visible.get() : true;
|
||||||
|
}),
|
||||||
|
|
||||||
orderNumber: 300 - (registration.priority || 50),
|
orderNumber: 300 - (registration.priority || 50),
|
||||||
};
|
};
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
import type { KubeObject } from "../../../common/k8s-api/kube-object";
|
import type { KubeObject } from "../../../common/k8s-api/kube-object";
|
||||||
import type { KubeObjectDetailsProps } from "./kube-object-details";
|
import type { KubeObjectDetailsProps } from "./kube-object-details";
|
||||||
import type React from "react";
|
import type React from "react";
|
||||||
|
import type { IComputedValue } from "mobx";
|
||||||
|
|
||||||
export interface KubeObjectDetailComponents<T extends KubeObject = KubeObject> {
|
export interface KubeObjectDetailComponents<T extends KubeObject = KubeObject> {
|
||||||
Details: React.ComponentType<KubeObjectDetailsProps<T>>;
|
Details: React.ComponentType<KubeObjectDetailsProps<T>>;
|
||||||
@ -15,4 +16,5 @@ export interface KubeObjectDetailRegistration<T extends KubeObject = KubeObject>
|
|||||||
apiVersions: string[];
|
apiVersions: string[];
|
||||||
components: KubeObjectDetailComponents<T>;
|
components: KubeObjectDetailComponents<T>;
|
||||||
priority?: number;
|
priority?: number;
|
||||||
|
visible?: IComputedValue<boolean>;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user