chore: Extract @k8slens/kube-object package

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton committed 2023-05-02 10:11:52 -07:00
1 parent 576373b16b
commit 1bf24db797
466 files changed
+6838 -6375

No files matched your search

@@ -3,22 +3,15 @@
* 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 type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
import React from "react";
import { KubeObject } from "../../../../common/k8s-api/kube-object";
import { KubeObject } from "@k8slens/kube-object";
import apiManagerInjectable from "../../../../common/k8s-api/api-manager/manager.injectable";
import type { KubeObjectStore } from "../../../../common/k8s-api/kube-object.store";
import type { KubeApi } from "../../../../common/k8s-api/kube-api";
import showDetailsInjectable
from "../../../../renderer/components/kube-detail-params/show-details.injectable";
import type {
FakeExtensionOptions,
} from "../../../../renderer/components/test-utils/get-extension-fake";
import showDetailsInjectable from "../../../../renderer/components/kube-detail-params/show-details.injectable";
import type { FakeExtensionOptions } from "../../../../renderer/components/test-utils/get-extension-fake";
import { observable } from "mobx";
describe("disable kube object detail items when cluster is not relevant", () => {
@@ -37,7 +30,7 @@ describe("disable kube object detail items when cluster is not relevant", () =>
} as Partial<KubeApi<KubeObject>> as KubeApi<KubeObject>;
const store = {
api,
loadFromPath: async () => getKubeObjectStub("some-kind", "some-api-version"),
loadFromPath: async () => Promise.resolve(getKubeObjectStub("some-kind", "some-api-version")),
getByPath() {
},
} as Partial<KubeObjectStore<KubeObject>> as KubeObjectStore<KubeObject>;
@@ -8,7 +8,7 @@ import { getApplicationBuilder } from "../../../../renderer/components/test-util
import type { IObservableValue } from "mobx";
import { runInAction, computed, observable } from "mobx";
import React from "react";
import { KubeObject } from "../../../../common/k8s-api/kube-object";
import { KubeObject } from "@k8slens/kube-object";
import apiManagerInjectable from "../../../../common/k8s-api/api-manager/manager.injectable";
import type { KubeObjectStore } from "../../../../common/k8s-api/kube-object.store";
import type { KubeApi } from "../../../../common/k8s-api/kube-api";
@@ -33,7 +33,7 @@ describe("reactively hide kube object detail item", () => {
} as Partial<KubeApi<KubeObject>> as KubeApi<KubeObject>;
const store = {
api,
loadFromPath: async () => getKubeObjectStub("some-kind", "some-api-version"),
loadFromPath: async () => Promise.resolve(getKubeObjectStub("some-kind", "some-api-version")),
getByPath() {
},
} as Partial<KubeObjectStore<KubeObject>> as KubeObjectStore<KubeObject>;
@@ -14,7 +14,7 @@ import { computed, runInAction } 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 { KubeObject } from "@k8slens/kube-object";
import { KubeObjectMenu } from "../../../../renderer/components/kube-object-menu";
describe("disable kube object menu items when cluster is not relevant", () => {
@@ -12,7 +12,7 @@ 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 { KubeObject } from "../../../../common/k8s-api/kube-object";
import { KubeObject } from "@k8slens/kube-object";
import { KubeObjectMenu } from "../../../../renderer/components/kube-object-menu";
describe("reactively hide kube object menu item", () => {
@@ -15,7 +15,7 @@ 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 { KubeObjectStatusIcon } from "../../../../renderer/components/kube-object-status-icon/kube-object-status-icon";
import { KubeObject } from "../../../../common/k8s-api/kube-object";
import { KubeObject } from "@k8slens/kube-object";
import { KubeObjectStatusLevel } from "../../../../common/k8s-api/kube-object-status";
describe("disable kube object statuses when cluster is not relevant", () => {
@@ -12,7 +12,7 @@ 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 { KubeObject } from "../../../../common/k8s-api/kube-object";
import { KubeObject } from "@k8slens/kube-object";
import { KubeObjectStatusLevel } from "../../../../common/k8s-api/kube-object-status";
import { KubeObjectStatusIcon } from "../../../../renderer/components/kube-object-status-icon";
@@ -3,7 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { KubeObjectStatusLevel } from "../../../common/k8s-api/kube-object-status";
import { KubeObject } from "../../../common/k8s-api/kube-object";
import { KubeObject } from "@k8slens/kube-object";
import React from "react";
import type { DiContainer } from "@ogre-tools/injectable";
import { getInjectable } from "@ogre-tools/injectable";
@@ -13,7 +13,7 @@ import getRandomIdForEditResourceTabInjectable from "../../../renderer/component
import type { AsyncFnMock } from "@async-fn/jest";
import asyncFn from "@async-fn/jest";
import dockStoreInjectable from "../../../renderer/components/dock/dock/store.injectable";
import { Namespace } from "../../../common/k8s-api/endpoints";
import { Namespace } from "@k8slens/kube-object";
import showSuccessNotificationInjectable from "../../../renderer/components/notifications/show-success-notification.injectable";
import showErrorNotificationInjectable from "../../../renderer/components/notifications/show-error-notification.injectable";
import readJsonFileInjectable from "../../../common/fs/read-json-file.injectable";
@@ -23,8 +23,7 @@ import type { ApiKubePatch } from "../../../renderer/k8s/api-kube-patch.injectab
import type { ApiKubeGet } from "../../../renderer/k8s/api-kube-get.injectable";
import apiKubePatchInjectable from "../../../renderer/k8s/api-kube-patch.injectable";
import apiKubeGetInjectable from "../../../renderer/k8s/api-kube-get.injectable";
import type { KubeJsonApiData } from "../../../common/k8s-api/kube-json-api";
import type { BaseKubeJsonApiObjectMetadata, KubeObjectScope } from "../../../common/k8s-api/kube-object";
import type { BaseKubeJsonApiObjectMetadata, KubeObjectScope, KubeJsonApiData } from "@k8slens/kube-object";
import { JsonApiErrorParsed } from "../../../common/k8s-api/json-api";
import type { ShowNotification } from "../../../renderer/components/notifications";
import React from "react";
@@ -542,9 +541,9 @@ metadata:
readJsonFileInjectable,
);
const actual = (await readJsonFile(
const actual = await readJsonFile(
"/some-directory-for-lens-local-storage/some-cluster-id.json",
)) as any;
) as Record<string, Record<string, unknown>>;
expect(
actual.edit_resource_store["some-first-tab-id"],
@@ -13,7 +13,7 @@ import requestKubeResourceInjectable from "../../../renderer/components/dock/edi
import directoryForLensLocalStorageInjectable from "../../../common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable";
import writeJsonFileInjectable from "../../../common/fs/write-json-file.injectable";
import { TabKind } from "../../../renderer/components/dock/dock/store";
import { Namespace } from "../../../common/k8s-api/endpoints";
import { Namespace } from "@k8slens/kube-object";
describe("cluster/namespaces - edit namespaces from previously opened tab", () => {
let builder: ApplicationBuilder;
@@ -7,9 +7,11 @@ import type { RenderResult } from "@testing-library/react";
import navigateToPodsInjectable from "../../../common/front-end-routing/routes/cluster/workloads/pods/navigate-to-pods.injectable";
import { type ApplicationBuilder, getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
import podStoreInjectable from "../../../renderer/components/workloads-pods/store.injectable";
import type { PodMetrics } from "../../../common/k8s-api/endpoints";
import { Pod } from "../../../common/k8s-api/endpoints";
import type { PodMetrics, PodStatus } from "@k8slens/kube-object";
import { Pod } from "@k8slens/kube-object";
import type { PodMetricsApi } from "../../../common/k8s-api/endpoints/pod-metrics.api";
import podMetricsApiInjectable from "../../../common/k8s-api/endpoints/pod-metrics.api.injectable";
import type { RequestMetrics } from "../../../common/k8s-api/endpoints/metrics.api/request-metrics.injectable";
import requestMetricsInjectable from "../../../common/k8s-api/endpoints/metrics.api/request-metrics.injectable";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
@@ -18,7 +20,7 @@ describe("workloads / pods", () => {
let applicationBuilder: ApplicationBuilder;
const podMetrics: PodMetrics[] = [];
beforeEach(async () => {
beforeEach(() => {
applicationBuilder = getApplicationBuilder().setEnvironmentToClusterFrame();
applicationBuilder.namespaces.add("default");
applicationBuilder.beforeWindowStart(({ windowDi }) => {
@@ -28,8 +30,8 @@ describe("workloads / pods", () => {
});
windowDi.override(podMetricsApiInjectable, () => ({
list: async () => podMetrics,
} as any));
list: async () => Promise.resolve(podMetrics),
} as PodMetricsApi));
const apiManager = windowDi.inject(apiManagerInjectable);
const podStore = windowDi.inject(podStoreInjectable);
@@ -79,7 +81,7 @@ describe("workloads / pods", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("shows item list is empty", async () => {
it("shows item list is empty", () => {
expect(rendered.getByText("Item list is empty")).toBeInTheDocument();
});
});
@@ -87,7 +89,7 @@ describe("workloads / pods", () => {
describe("given a namespace has pods", () => {
beforeEach(async () => {
applicationBuilder.afterWindowStart(({ windowDi }) => {
windowDi.override(requestMetricsInjectable, () => () => ({} as any));
windowDi.override(requestMetricsInjectable, () => (() => Promise.resolve({})) as unknown as RequestMetrics);
const podStore = windowDi.inject(podStoreInjectable);
@@ -111,7 +113,7 @@ describe("workloads / pods", () => {
},
],
},
status: {} as any,
status: {} as PodStatus,
}));
podStore.isLoaded = true;
});
@@ -27,7 +27,7 @@ import stopLoadingLogsInjectable from "../../renderer/components/dock/logs/stop-
import { dockerPod } from "../../renderer/components/dock/logs/__test__/pod.mock";
import showErrorNotificationInjectable from "../../renderer/components/notifications/show-error-notification.injectable";
import type { DiContainer } from "@ogre-tools/injectable";
import type { Container } from "../../common/k8s-api/endpoints";
import type { Container } from "@k8slens/kube-object";
describe("download logs options in logs dock tab", () => {
let windowDi: DiContainer;
@@ -36,7 +36,7 @@ describe("download logs options in logs dock tab", () => {
let openSaveFileDialogMock: jest.MockedFunction<() => void>;
let callForLogsMock: jest.MockedFunction<CallForLogs>;
let getLogsMock: jest.Mock;
let getSplittedLogsMock: jest.Mock;
let getSplitLogsMock: jest.Mock;
let showErrorNotificationMock: jest.Mock;
const logs = new Map([["timestamp", "some-logs"]]);
const pod = dockerPod;
@@ -55,7 +55,7 @@ describe("download logs options in logs dock tab", () => {
callForLogsMock = jest.fn();
getLogsMock = jest.fn();
getSplittedLogsMock = jest.fn();
getSplitLogsMock = jest.fn();
builder.beforeWindowStart(({ windowDi }) => {
windowDi.override(callForLogsInjectable, () => callForLogsMock);
@@ -63,7 +63,7 @@ describe("download logs options in logs dock tab", () => {
// Overriding internals of logsViewModelInjectable
windowDi.override(getLogsInjectable, () => getLogsMock);
windowDi.override(getLogsWithoutTimestampsInjectable, () => getLogsMock);
windowDi.override(getTimestampSplitLogsInjectable, () => getSplittedLogsMock);
windowDi.override(getTimestampSplitLogsInjectable, () => getSplitLogsMock);
windowDi.override(reloadLogsInjectable, () => jest.fn());
windowDi.override(getLogTabDataInjectable, () => () => ({
selectedPodId: selectedPod.getId(),
@@ -106,11 +106,11 @@ describe("download logs options in logs dock tab", () => {
});
describe("when logs not available", () => {
beforeEach(async () => {
beforeEach(() => {
const createLogsTab = windowDi.inject(createPodLogsTabInjectable);
getLogsMock.mockReturnValue([]);
getSplittedLogsMock.mockReturnValue([]);
getSplitLogsMock.mockReturnValue([]);
createLogsTab({
selectedPod: pod,
@@ -130,11 +130,11 @@ describe("download logs options in logs dock tab", () => {
});
describe("when logs available", () => {
beforeEach(async () => {
beforeEach(() => {
const createLogsTab = windowDi.inject(createPodLogsTabInjectable);
getLogsMock.mockReturnValue(["some-logs"]);
getSplittedLogsMock.mockReturnValue([...logs]);
getSplitLogsMock.mockReturnValue([...logs]);
createLogsTab({
selectedPod: pod,
@@ -174,13 +174,13 @@ describe("download logs options in logs dock tab", () => {
});
describe("when call for all logs resolves with logs", () => {
beforeEach(async () => {
beforeEach(() => {
callForLogsMock.mockResolvedValue("all-logs");
});
describe("when selected 'download all logs'", () => {
beforeEach(async () => {
await act(async () => {
beforeEach(() => {
act(() => {
const button = rendered.getByTestId("download-all-logs");
button.click();
@@ -194,11 +194,11 @@ describe("download logs options in logs dock tab", () => {
);
});
it("shows save dialog with proper attributes", async () => {
it("shows save dialog with proper attributes", () => {
expect(openSaveFileDialogMock).toHaveBeenCalledWith("docker-exporter.log", "all-logs", "text/plain");
});
it("doesn't block download dropdown for interaction after click", async () => {
it("doesn't block download dropdown for interaction after click", () => {
expect(rendered.getByTestId("download-logs-dropdown")).not.toHaveAttribute("disabled");
});
});
@@ -225,13 +225,13 @@ describe("download logs options in logs dock tab", () => {
});
describe("when call for logs resolves with no logs", () => {
beforeEach(async () => {
beforeEach(() => {
callForLogsMock.mockResolvedValue("");
});
describe("when selected 'download all logs'", () => {
beforeEach(async () => {
await act(async () => {
beforeEach(() => {
act(() => {
const button = rendered.getByTestId("download-all-logs");
button.click();
@@ -254,8 +254,8 @@ describe("download logs options in logs dock tab", () => {
});
describe("when selected 'download all logs'", () => {
beforeEach(async () => {
await act(async () => {
beforeEach(() => {
act(() => {
const button = rendered.getByTestId("download-all-logs");
button.click();
@@ -269,7 +269,7 @@ describe("download logs options in logs dock tab", () => {
);
});
it("doesn't show save dialog", async () => {
it("doesn't show save dialog", () => {
expect(openSaveFileDialogMock).not.toHaveBeenCalled();
});
});