From 00db92e22eeff076f3cd17806805be29c83717ba Mon Sep 17 00:00:00 2001 From: Juho Heikka Date: Tue, 6 Jun 2023 13:25:01 +0300 Subject: [PATCH] Add tests for auto detect section Signed-off-by: Juho Heikka --- .../__tests__/prometheus-setting.test.tsx | 133 ++++++++++++++++++ .../get-prometheus-details.injectable.ts | 3 - .../no-prometheus-provider-detectec.tsx | 4 +- .../cluster-settings/prometheus-details.tsx | 6 +- .../cluster-settings/prometheus-setting.tsx | 5 +- .../renderer/components/layout/sub-title.tsx | 6 +- 6 files changed, 146 insertions(+), 11 deletions(-) create mode 100644 packages/core/src/renderer/components/cluster-settings/__tests__/prometheus-setting.test.tsx diff --git a/packages/core/src/renderer/components/cluster-settings/__tests__/prometheus-setting.test.tsx b/packages/core/src/renderer/components/cluster-settings/__tests__/prometheus-setting.test.tsx new file mode 100644 index 0000000000..5f2aca007f --- /dev/null +++ b/packages/core/src/renderer/components/cluster-settings/__tests__/prometheus-setting.test.tsx @@ -0,0 +1,133 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import React from "react"; +import { ClusterPrometheusSetting } from "../prometheus-setting"; +import type { DiRender } from "@k8slens/test-utils"; +import { renderFor } from "../../test-utils/renderFor"; +import { Cluster } from "../../../../common/cluster/cluster"; +import { getDiForUnitTesting } from "../../../getDiForUnitTesting"; +import fetchInjectable from "../../../../common/fetch/fetch.injectable"; +import type { AsyncFnMock } from "@async-fn/jest"; +import type { Fetch } from "../../../../common/fetch/fetch.injectable"; +import asyncFn from "@async-fn/jest"; +import { testUsingFakeTime } from "../../../../test-utils/use-fake-time"; +import requestMetricsProvidersInjectable from "../../../../common/k8s-api/endpoints/metrics.api/request-providers.injectable"; +import type { MetricProviderInfo } from "../../../../common/k8s-api/endpoints/metrics.api/request-providers.injectable"; +import getPrometheusDetailsRouteInjectable from "../get-prometheus-details.injectable"; +import type { PrometheusDetailsData } from "../../../../common/k8s-api/endpoints/metrics.api/prometheus-details.channel"; + +const cluster = new Cluster({ + contextName: "some-context-name", + id: "some-cluster-id", + kubeConfigPath: "/some/path", + preferences: { + terminalCWD: "/foobar", + defaultNamespace: "kube-system", + }, +}); + +describe("prometheus-settings", () => { + let fetchMock: AsyncFnMock; + let render: DiRender; + let getPrometheusDetailsMock: jest.Mock; + + + beforeEach(async () => { + testUsingFakeTime("2015-10-21T07:28:00Z"); + + const di = getDiForUnitTesting(); + + fetchMock = asyncFn(); + di.override(fetchInjectable, () => fetchMock); + const metricProviders: MetricProviderInfo[] = [{ + name: "some-name", + id: "some-id", + isConfigurable: true, + }]; + + getPrometheusDetailsMock = jest.fn(); + + di.override(requestMetricsProvidersInjectable, () => () => Promise.resolve(metricProviders)); + di.override(getPrometheusDetailsRouteInjectable, () => getPrometheusDetailsMock); + + const prometheusDetails: PrometheusDetailsData = { + prometheusPath: "some/path:42", + provider: { + name: "some-name", + kind: "some-kind", + isConfigurable: true, + }, + }; + + getPrometheusDetailsMock.mockImplementation(() => Promise.resolve(prometheusDetails)); + render = renderFor(di); + }); + + it("should render prometheus settings", async () => { + const dom = render(); + + const title = await dom.findByTestId("prometheus-title"); + + expect(title).toHaveTextContent("Prometheus"); + }); + + it("given auto detected prometheus, renders prometheus provider details", async () => { + const dom = render(); + + const autoDetectSection = await dom.findByTestId("auto-detected-prometheus-details"); + + expect(autoDetectSection).toBeDefined(); + const autoDetectProvider = await dom.findByTestId("auto-detected-prometheus-details-provider"); + const autoDetectPath = await dom.findByTestId("auto-detected-prometheus-details-path"); + + expect(autoDetectProvider).toHaveTextContent("Provider:some-name"); + expect(autoDetectPath).toHaveTextContent("Path:some/path:42"); + }); + + it("given no auto detected prometheus, renders prometheus notification", async () => { + getPrometheusDetailsMock.mockImplementation(() => Promise.reject(new Error("some-error"))); + + const dom = render(); + + const noAutoDetectSection = await dom.findByTestId("no-auto-detected-prometheus-provider"); + const infoText = await dom.findByTestId("no-auto-detected-prometheus-info"); + + expect(noAutoDetectSection).toBeDefined(); + expect(infoText).toHaveTextContent("Could not detect any Prometheus provider."); + }); + + it("given no auto detection selected, does not render auto detect section", async () => { + const clusterWithProviderPreferences = new Cluster({ + contextName: "some-context-name", + id: "some-cluster-id", + kubeConfigPath: "/some/path", + preferences: { + terminalCWD: "/foobar", + defaultNamespace: "kube-system", + prometheusProvider: { + type: "some-id", + }, + prometheus: { + namespace: "some-namespace", + port: 42, + prefix: "some-prefix", + service: "some-service", + }, + }, + }); + const dom = render(); + + await dom.findByTestId("prometheus-title"); + const selectedProvider = dom.container.getElementsByClassName("Select__single-value")[0]; + const autoDetectSection = dom.queryByTestId("auto-detected-prometheus-details"); + const editSection = dom.queryByTestId("edit-prometheus-path-section"); + + expect(selectedProvider).toHaveTextContent("some-name"); + expect(autoDetectSection).toBeFalsy(); + expect(editSection).toBeDefined(); + }); + +}); diff --git a/packages/core/src/renderer/components/cluster-settings/get-prometheus-details.injectable.ts b/packages/core/src/renderer/components/cluster-settings/get-prometheus-details.injectable.ts index 601ed11f12..b163bbff97 100644 --- a/packages/core/src/renderer/components/cluster-settings/get-prometheus-details.injectable.ts +++ b/packages/core/src/renderer/components/cluster-settings/get-prometheus-details.injectable.ts @@ -3,7 +3,6 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import { logInfoInjectionToken } from "@k8slens/logger"; import { requestFromChannelInjectionToken } from "@k8slens/messaging"; import { prometheusDetailsChannel } from "../../../common/k8s-api/endpoints/metrics.api/prometheus-details.channel"; @@ -12,11 +11,9 @@ const getPrometheusDetailsRouteInjectable = getInjectable({ id: "get-prometheus-details-route", instantiate: (di) => { - const logger = di.inject(logInfoInjectionToken); const requestFromChannel = di.inject(requestFromChannelInjectionToken); return (async (clusterId: string) => { - logger("requestFromChannel"); const prometheusDetails = await requestFromChannel(prometheusDetailsChannel, clusterId); return prometheusDetails; diff --git a/packages/core/src/renderer/components/cluster-settings/no-prometheus-provider-detectec.tsx b/packages/core/src/renderer/components/cluster-settings/no-prometheus-provider-detectec.tsx index beefcef16b..2ea256f694 100644 --- a/packages/core/src/renderer/components/cluster-settings/no-prometheus-provider-detectec.tsx +++ b/packages/core/src/renderer/components/cluster-settings/no-prometheus-provider-detectec.tsx @@ -8,11 +8,11 @@ import { Icon } from "@k8slens/icon"; export const NoPrometheusProviderDetected = () => ( -
+
-
Could not detect any Prometheus provider.
+
Could not detect any Prometheus provider.
); diff --git a/packages/core/src/renderer/components/cluster-settings/prometheus-details.tsx b/packages/core/src/renderer/components/cluster-settings/prometheus-details.tsx index 7a67b97a0f..eda7d50bcd 100644 --- a/packages/core/src/renderer/components/cluster-settings/prometheus-details.tsx +++ b/packages/core/src/renderer/components/cluster-settings/prometheus-details.tsx @@ -15,9 +15,9 @@ interface PrometheusDetailsProps { path: string; } export const PrometheusDetails = ({ providerName, path }: PrometheusDetailsProps) => ( -
+
-
+
Provider:
@@ -25,7 +25,7 @@ export const PrometheusDetails = ({ providerName, path }: PrometheusDetailsProps {providerName}
-
+
Path:
diff --git a/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx b/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx index 42ee088664..eda1ea70a2 100644 --- a/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx +++ b/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx @@ -162,7 +162,7 @@ class NonInjectedClusterPrometheusSetting extends React.Component
- + { this.loading ? @@ -189,6 +189,7 @@ class NonInjectedClusterPrometheusSetting extends React.Component + {showPrometheusDetailsResult && ( <>
@@ -207,7 +208,7 @@ class NonInjectedClusterPrometheusSetting extends React.Component
-
+
{ }); return ( -
+
{title} {" "} {children}