mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Fix tests not stopping by forcing cleanup
Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
parent
8fd732b3fa
commit
e9e248e32c
@ -7,17 +7,17 @@ import getElectronAppPathInjectable from "../../main/app-paths/get-electron-app-
|
|||||||
import type { PathName } from "./app-path-names";
|
import type { PathName } from "./app-path-names";
|
||||||
import setElectronAppPathInjectable from "../../main/app-paths/set-electron-app-path/set-electron-app-path.injectable";
|
import setElectronAppPathInjectable from "../../main/app-paths/set-electron-app-path/set-electron-app-path.injectable";
|
||||||
import directoryForIntegrationTestingInjectable from "../../main/app-paths/directory-for-integration-testing/directory-for-integration-testing.injectable";
|
import directoryForIntegrationTestingInjectable from "../../main/app-paths/directory-for-integration-testing/directory-for-integration-testing.injectable";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../features/test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../features/test-utils/application-builder";
|
||||||
import type { DiContainer } from "@ogre-tools/injectable";
|
import type { DiContainer } from "@ogre-tools/injectable";
|
||||||
import appPathsInjectable from "./app-paths.injectable";
|
import appPathsInjectable from "./app-paths.injectable";
|
||||||
|
|
||||||
describe("app-paths", () => {
|
describe("app-paths", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
const defaultAppPathsStub: AppPaths = {
|
const defaultAppPathsStub: AppPaths = {
|
||||||
currentApp: "/some-current-app",
|
currentApp: "/some-current-app",
|
||||||
appData: "/some-app-data",
|
appData: "/some-app-data",
|
||||||
@ -56,10 +56,6 @@ describe("app-paths", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("normally", () => {
|
describe("normally", () => {
|
||||||
let windowDi: DiContainer;
|
let windowDi: DiContainer;
|
||||||
let mainDi: DiContainer;
|
let mainDi: DiContainer;
|
||||||
|
|||||||
@ -6,8 +6,8 @@ import type { DiContainer } from "@ogre-tools/injectable";
|
|||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import type { SendMessageToChannel } from "./message-to-channel-injection-token";
|
import type { SendMessageToChannel } from "./message-to-channel-injection-token";
|
||||||
import { sendMessageToChannelInjectionToken } from "./message-to-channel-injection-token";
|
import { sendMessageToChannelInjectionToken } from "./message-to-channel-injection-token";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../features/test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../features/test-utils/application-builder";
|
||||||
import type { LensWindow } from "../../../main/start-main-application/lens-window/application-window/create-lens-window.injectable";
|
import type { LensWindow } from "../../../main/start-main-application/lens-window/application-window/create-lens-window.injectable";
|
||||||
import type { MessageChannel } from "./message-channel-listener-injection-token";
|
import type { MessageChannel } from "./message-channel-listener-injection-token";
|
||||||
import { messageChannelListenerInjectionToken } from "./message-channel-listener-injection-token";
|
import { messageChannelListenerInjectionToken } from "./message-channel-listener-injection-token";
|
||||||
@ -25,15 +25,16 @@ type TestMessageChannel = MessageChannel<string>;
|
|||||||
type TestRequestChannel = RequestChannel<string, string>;
|
type TestRequestChannel = RequestChannel<string, string>;
|
||||||
|
|
||||||
describe("channel", () => {
|
describe("channel", () => {
|
||||||
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
describe("messaging from main to renderer, given listener for channel in a window and application has started", () => {
|
describe("messaging from main to renderer, given listener for channel in a window and application has started", () => {
|
||||||
let messageListenerInWindowMock: jest.Mock;
|
let messageListenerInWindowMock: jest.Mock;
|
||||||
let mainDi: DiContainer;
|
let mainDi: DiContainer;
|
||||||
let messageToChannel: SendMessageToChannel;
|
let messageToChannel: SendMessageToChannel;
|
||||||
let builder: ApplicationBuilder;
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
messageListenerInWindowMock = jest.fn();
|
messageListenerInWindowMock = jest.fn();
|
||||||
|
|
||||||
const testChannelListenerInTestWindowInjectable = getInjectable({
|
const testChannelListenerInTestWindowInjectable = getInjectable({
|
||||||
@ -60,10 +61,6 @@ describe("channel", () => {
|
|||||||
messageToChannel = mainDi.inject(sendMessageToChannelInjectionToken);
|
messageToChannel = mainDi.inject(sendMessageToChannelInjectionToken);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given window is started", () => {
|
describe("given window is started", () => {
|
||||||
let someWindowFake: LensWindow;
|
let someWindowFake: LensWindow;
|
||||||
|
|
||||||
@ -107,10 +104,8 @@ describe("channel", () => {
|
|||||||
describe("messaging from renderer to main, given listener for channel in a main and application has started", () => {
|
describe("messaging from renderer to main, given listener for channel in a main and application has started", () => {
|
||||||
let messageListenerInMainMock: jest.Mock;
|
let messageListenerInMainMock: jest.Mock;
|
||||||
let messageToChannel: SendMessageToChannel;
|
let messageToChannel: SendMessageToChannel;
|
||||||
let builder: ApplicationBuilder;
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
messageListenerInMainMock = jest.fn();
|
messageListenerInMainMock = jest.fn();
|
||||||
|
|
||||||
const testChannelListenerInMainInjectable = getInjectable({
|
const testChannelListenerInMainInjectable = getInjectable({
|
||||||
@ -137,10 +132,6 @@ describe("channel", () => {
|
|||||||
messageToChannel = windowDi.inject(sendMessageToChannelInjectionToken);
|
messageToChannel = windowDi.inject(sendMessageToChannelInjectionToken);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("when sending message, triggers listener in main", () => {
|
it("when sending message, triggers listener in main", () => {
|
||||||
messageToChannel(testMessageChannel, "some-message");
|
messageToChannel(testMessageChannel, "some-message");
|
||||||
|
|
||||||
@ -151,10 +142,8 @@ describe("channel", () => {
|
|||||||
describe("requesting from main in renderer, given listener for channel in a main and application has started", () => {
|
describe("requesting from main in renderer, given listener for channel in a main and application has started", () => {
|
||||||
let requestListenerInMainMock: AsyncFnMock<RequestChannelHandler<TestRequestChannel>>;
|
let requestListenerInMainMock: AsyncFnMock<RequestChannelHandler<TestRequestChannel>>;
|
||||||
let requestFromChannel: RequestFromChannel;
|
let requestFromChannel: RequestFromChannel;
|
||||||
let builder: ApplicationBuilder;
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
requestListenerInMainMock = asyncFn();
|
requestListenerInMainMock = asyncFn();
|
||||||
|
|
||||||
const testChannelListenerInMainInjectable = getRequestChannelListenerInjectable({
|
const testChannelListenerInMainInjectable = getRequestChannelListenerInjectable({
|
||||||
@ -175,10 +164,6 @@ describe("channel", () => {
|
|||||||
requestFromChannel = windowDi.inject(requestFromChannelInjectable);
|
requestFromChannel = windowDi.inject(requestFromChannelInjectable);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when requesting from channel", () => {
|
describe("when requesting from channel", () => {
|
||||||
let actualPromise: Promise<string>;
|
let actualPromise: Promise<string>;
|
||||||
|
|
||||||
@ -207,11 +192,7 @@ describe("channel", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("when registering multiple handlers for the same channel", () => {
|
describe("when registering multiple handlers for the same channel", () => {
|
||||||
let builder: ApplicationBuilder;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
const testChannelListenerInMainInjectable = getRequestChannelListenerInjectable({
|
const testChannelListenerInMainInjectable = getRequestChannelListenerInjectable({
|
||||||
channel: testRequestChannel,
|
channel: testRequestChannel,
|
||||||
handler: () => () => "some-value",
|
handler: () => () => "some-value",
|
||||||
@ -231,10 +212,6 @@ describe("channel", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("throws on startup", async () => {
|
it("throws on startup", async () => {
|
||||||
await expect(builder.render()).rejects.toThrow('Tried to register a multiple channel handlers for "some-request-channel-id", only one handler is supported for a request channel.');
|
await expect(builder.render()).rejects.toThrow('Tried to register a multiple channel handlers for "some-request-channel-id", only one handler is supported for a request channel.');
|
||||||
});
|
});
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
import type { DiContainer } from "@ogre-tools/injectable";
|
import type { DiContainer } from "@ogre-tools/injectable";
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { observe, runInAction } from "mobx";
|
import { observe, runInAction } from "mobx";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../features/test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../features/test-utils/application-builder";
|
||||||
import createSyncBoxInjectable from "./create-sync-box.injectable";
|
import createSyncBoxInjectable from "./create-sync-box.injectable";
|
||||||
import type { SyncBox } from "./sync-box-injection-token";
|
import type { SyncBox } from "./sync-box-injection-token";
|
||||||
import { syncBoxInjectionToken } from "./sync-box-injection-token";
|
import { syncBoxInjectionToken } from "./sync-box-injection-token";
|
||||||
@ -14,9 +14,9 @@ import { syncBoxInjectionToken } from "./sync-box-injection-token";
|
|||||||
describe("sync-box", () => {
|
describe("sync-box", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
builder.beforeApplicationStart(mainDi => {
|
builder.beforeApplicationStart(mainDi => {
|
||||||
runInAction(() => {
|
runInAction(() => {
|
||||||
mainDi.register(someInjectable);
|
mainDi.register(someInjectable);
|
||||||
@ -30,10 +30,6 @@ describe("sync-box", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given application is started, when value is set in main", () => {
|
describe("given application is started, when value is set in main", () => {
|
||||||
let valueInMain: string;
|
let valueInMain: string;
|
||||||
let syncBoxInMain: SyncBox<string>;
|
let syncBoxInMain: SyncBox<string>;
|
||||||
|
|||||||
@ -4,23 +4,19 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
|
|
||||||
describe("add-cluster - navigation using application menu", () => {
|
describe("add-cluster - navigation using application menu", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.container).toMatchSnapshot();
|
expect(rendered.container).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { noop } from "lodash/fp";
|
import { noop } from "lodash/fp";
|
||||||
import { runInAction } from "mobx";
|
import { runInAction } from "mobx";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
||||||
import applicationMenuItemInjectionToken from "./main/menu-items/application-menu-item-injection-token";
|
import applicationMenuItemInjectionToken from "./main/menu-items/application-menu-item-injection-token";
|
||||||
import logErrorInjectable from "../../common/log-error.injectable";
|
import logErrorInjectable from "../../common/log-error.injectable";
|
||||||
@ -15,9 +15,9 @@ describe("application-menu-in-legacy-extension-api", () => {
|
|||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let logErrorMock: jest.Mock;
|
let logErrorMock: jest.Mock;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.beforeApplicationStart(
|
builder.beforeApplicationStart(
|
||||||
(mainDi) => {
|
(mainDi) => {
|
||||||
runInAction(() => {
|
runInAction(() => {
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import populateApplicationMenuInjectable from "./main/populate-application-menu.injectable";
|
import populateApplicationMenuInjectable from "./main/populate-application-menu.injectable";
|
||||||
import { advanceFakeTime, testUsingFakeTime } from "../../common/test-utils/use-fake-time";
|
import { advanceFakeTime, testUsingFakeTime } from "../../common/test-utils/use-fake-time";
|
||||||
import { getCompositePaths } from "../../common/utils/composite/get-composite-paths/get-composite-paths";
|
import { getCompositePaths } from "../../common/utils/composite/get-composite-paths/get-composite-paths";
|
||||||
@ -13,13 +13,13 @@ describe.each(allPlatforms)("application-menu, given platform is '%s'", (platfor
|
|||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let populateApplicationMenuMock: jest.Mock;
|
let populateApplicationMenuMock: jest.Mock;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
testUsingFakeTime();
|
testUsingFakeTime();
|
||||||
|
|
||||||
populateApplicationMenuMock = jest.fn();
|
populateApplicationMenuMock = jest.fn();
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.beforeApplicationStart((mainDi) => {
|
builder.beforeApplicationStart((mainDi) => {
|
||||||
mainDi.override(platformInjectable, () => platform);
|
mainDi.override(platformInjectable, () => platform);
|
||||||
|
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import populateApplicationMenuInjectable from "./main/populate-application-menu.injectable";
|
import populateApplicationMenuInjectable from "./main/populate-application-menu.injectable";
|
||||||
import { advanceFakeTime, testUsingFakeTime } from "../../common/test-utils/use-fake-time";
|
import { advanceFakeTime, testUsingFakeTime } from "../../common/test-utils/use-fake-time";
|
||||||
import { getCompositePaths } from "../../common/utils/composite/get-composite-paths/get-composite-paths";
|
import { getCompositePaths } from "../../common/utils/composite/get-composite-paths/get-composite-paths";
|
||||||
@ -17,14 +17,14 @@ describe("handling-of-orphan-application-menu-items, given orphan menu item", ()
|
|||||||
let populateApplicationMenuMock: jest.Mock;
|
let populateApplicationMenuMock: jest.Mock;
|
||||||
let logErrorMock: jest.Mock;
|
let logErrorMock: jest.Mock;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
testUsingFakeTime();
|
testUsingFakeTime();
|
||||||
|
|
||||||
populateApplicationMenuMock = jest.fn();
|
populateApplicationMenuMock = jest.fn();
|
||||||
logErrorMock = jest.fn();
|
logErrorMock = jest.fn();
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.beforeApplicationStart((mainDi) => {
|
builder.beforeApplicationStart((mainDi) => {
|
||||||
const someOrphanMenuItemInjectable = getInjectable({
|
const someOrphanMenuItemInjectable = getInjectable({
|
||||||
id: "some-orphan-menu-item",
|
id: "some-orphan-menu-item",
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import electronUpdaterIsActiveInjectable from "../../main/electron-app/features/electron-updater-is-active.injectable";
|
import electronUpdaterIsActiveInjectable from "../../main/electron-app/features/electron-updater-is-active.injectable";
|
||||||
import publishIsConfiguredInjectable from "./main/updating-is-enabled/publish-is-configured/publish-is-configured.injectable";
|
import publishIsConfiguredInjectable from "./main/updating-is-enabled/publish-is-configured/publish-is-configured.injectable";
|
||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
@ -28,11 +28,11 @@ describe("analytics for installing update", () => {
|
|||||||
let analyticsListenerMock: jest.Mock;
|
let analyticsListenerMock: jest.Mock;
|
||||||
let mainDi: DiContainer;
|
let mainDi: DiContainer;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
testUsingFakeTime("2015-10-21T07:28:00Z");
|
testUsingFakeTime("2015-10-21T07:28:00Z");
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
analyticsListenerMock = jest.fn();
|
analyticsListenerMock = jest.fn();
|
||||||
|
|
||||||
builder.beforeApplicationStart(mainDi => {
|
builder.beforeApplicationStart(mainDi => {
|
||||||
@ -62,10 +62,6 @@ describe("analytics for installing update", () => {
|
|||||||
mainDi = builder.mainDi;
|
mainDi = builder.mainDi;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given application is started and checking updates periodically", () => {
|
describe("given application is started and checking updates periodically", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
mainDi.unoverride(periodicalCheckForUpdatesInjectable);
|
mainDi.unoverride(periodicalCheckForUpdatesInjectable);
|
||||||
|
|||||||
@ -12,8 +12,8 @@ import type { DownloadPlatformUpdate } from "../../main/download-update/download
|
|||||||
import downloadPlatformUpdateInjectable from "../../main/download-update/download-platform-update/download-platform-update.injectable";
|
import downloadPlatformUpdateInjectable from "../../main/download-update/download-platform-update/download-platform-update.injectable";
|
||||||
import publishIsConfiguredInjectable from "../../main/updating-is-enabled/publish-is-configured/publish-is-configured.injectable";
|
import publishIsConfiguredInjectable from "../../main/updating-is-enabled/publish-is-configured/publish-is-configured.injectable";
|
||||||
import electronUpdaterIsActiveInjectable from "../../../../main/electron-app/features/electron-updater-is-active.injectable";
|
import electronUpdaterIsActiveInjectable from "../../../../main/electron-app/features/electron-updater-is-active.injectable";
|
||||||
import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import processCheckingForUpdatesInjectable from "../../main/process-checking-for-updates.injectable";
|
import processCheckingForUpdatesInjectable from "../../main/process-checking-for-updates.injectable";
|
||||||
import quitAndInstallUpdateInjectable from "../../main/quit-and-install-update.injectable";
|
import quitAndInstallUpdateInjectable from "../../main/quit-and-install-update.injectable";
|
||||||
import { advanceFakeTime, testUsingFakeTime } from "../../../../common/test-utils/use-fake-time";
|
import { advanceFakeTime, testUsingFakeTime } from "../../../../common/test-utils/use-fake-time";
|
||||||
@ -28,11 +28,11 @@ describe("encourage user to update when sufficient time passed since update was
|
|||||||
let downloadPlatformUpdateMock: AsyncFnMock<DownloadPlatformUpdate>;
|
let downloadPlatformUpdateMock: AsyncFnMock<DownloadPlatformUpdate>;
|
||||||
let quitAndInstallUpdateMock: jest.MockedFunction<() => void>;
|
let quitAndInstallUpdateMock: jest.MockedFunction<() => void>;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
testUsingFakeTime("2015-10-21T07:28:00Z");
|
testUsingFakeTime("2015-10-21T07:28:00Z");
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.beforeApplicationStart((mainDi) => {
|
builder.beforeApplicationStart((mainDi) => {
|
||||||
checkForPlatformUpdatesMock = asyncFn();
|
checkForPlatformUpdatesMock = asyncFn();
|
||||||
downloadPlatformUpdateMock = asyncFn();
|
downloadPlatformUpdateMock = asyncFn();
|
||||||
@ -55,10 +55,6 @@ describe("encourage user to update when sufficient time passed since update was
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when started", () => {
|
describe("when started", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import electronUpdaterIsActiveInjectable from "../../../../main/electron-app/features/electron-updater-is-active.injectable";
|
import electronUpdaterIsActiveInjectable from "../../../../main/electron-app/features/electron-updater-is-active.injectable";
|
||||||
import publishIsConfiguredInjectable from "../../main/updating-is-enabled/publish-is-configured/publish-is-configured.injectable";
|
import publishIsConfiguredInjectable from "../../main/updating-is-enabled/publish-is-configured/publish-is-configured.injectable";
|
||||||
@ -21,9 +21,9 @@ describe("installing update using tray", () => {
|
|||||||
let checkForPlatformUpdatesMock: AsyncFnMock<CheckForPlatformUpdates>;
|
let checkForPlatformUpdatesMock: AsyncFnMock<CheckForPlatformUpdates>;
|
||||||
let downloadPlatformUpdateMock: AsyncFnMock<DownloadPlatformUpdate>;
|
let downloadPlatformUpdateMock: AsyncFnMock<DownloadPlatformUpdate>;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
builder.beforeApplicationStart((mainDi) => {
|
builder.beforeApplicationStart((mainDi) => {
|
||||||
checkForPlatformUpdatesMock = asyncFn();
|
checkForPlatformUpdatesMock = asyncFn();
|
||||||
downloadPlatformUpdateMock = asyncFn();
|
downloadPlatformUpdateMock = asyncFn();
|
||||||
@ -43,10 +43,6 @@ describe("installing update using tray", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when started", () => {
|
describe("when started", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import type { CheckForPlatformUpdates } from "../../main/check-for-updates/check-for-platform-updates/check-for-platform-updates.injectable";
|
import type { CheckForPlatformUpdates } from "../../main/check-for-updates/check-for-platform-updates/check-for-platform-updates.injectable";
|
||||||
import checkForPlatformUpdatesInjectable from "../../main/check-for-updates/check-for-platform-updates/check-for-platform-updates.injectable";
|
import checkForPlatformUpdatesInjectable from "../../main/check-for-updates/check-for-platform-updates/check-for-platform-updates.injectable";
|
||||||
import type { DownloadPlatformUpdate } from "../../main/download-update/download-platform-update/download-platform-update.injectable";
|
import type { DownloadPlatformUpdate } from "../../main/download-update/download-platform-update/download-platform-update.injectable";
|
||||||
@ -30,11 +30,11 @@ describe("force user to update when too long since update was downloaded", () =>
|
|||||||
let mainDi: DiContainer;
|
let mainDi: DiContainer;
|
||||||
let quitAndInstallUpdateMock: jest.Mock;
|
let quitAndInstallUpdateMock: jest.Mock;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
testUsingFakeTime("2015-10-21T07:28:00Z");
|
testUsingFakeTime("2015-10-21T07:28:00Z");
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.beforeApplicationStart(mainDi => {
|
builder.beforeApplicationStart(mainDi => {
|
||||||
checkForPlatformUpdatesMock = asyncFn();
|
checkForPlatformUpdatesMock = asyncFn();
|
||||||
|
|
||||||
@ -60,10 +60,6 @@ describe("force user to update when too long since update was downloaded", () =>
|
|||||||
mainDi = builder.mainDi;
|
mainDi = builder.mainDi;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when application is started", () => {
|
describe("when application is started", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import electronUpdaterIsActiveInjectable from "../../../../main/electron-app/features/electron-updater-is-active.injectable";
|
import electronUpdaterIsActiveInjectable from "../../../../main/electron-app/features/electron-updater-is-active.injectable";
|
||||||
import publishIsConfiguredInjectable from "../../main/updating-is-enabled/publish-is-configured/publish-is-configured.injectable";
|
import publishIsConfiguredInjectable from "../../main/updating-is-enabled/publish-is-configured/publish-is-configured.injectable";
|
||||||
@ -17,11 +17,11 @@ describe("periodical checking of updates", () => {
|
|||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let processCheckingForUpdatesMock: jest.Mock;
|
let processCheckingForUpdatesMock: jest.Mock;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
testUsingFakeTime("2015-10-21T07:28:00Z");
|
testUsingFakeTime("2015-10-21T07:28:00Z");
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.beforeApplicationStart((mainDi) => {
|
builder.beforeApplicationStart((mainDi) => {
|
||||||
mainDi.unoverride(periodicalCheckForUpdatesInjectable);
|
mainDi.unoverride(periodicalCheckForUpdatesInjectable);
|
||||||
mainDi.permitSideEffects(periodicalCheckForUpdatesInjectable);
|
mainDi.permitSideEffects(periodicalCheckForUpdatesInjectable);
|
||||||
@ -35,10 +35,6 @@ describe("periodical checking of updates", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given updater is enabled and configuration exists, when started", () => {
|
describe("given updater is enabled and configuration exists, when started", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import quitAndInstallUpdateInjectable from "../../main/quit-and-install-update.injectable";
|
import quitAndInstallUpdateInjectable from "../../main/quit-and-install-update.injectable";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import electronUpdaterIsActiveInjectable from "../../../../main/electron-app/features/electron-updater-is-active.injectable";
|
import electronUpdaterIsActiveInjectable from "../../../../main/electron-app/features/electron-updater-is-active.injectable";
|
||||||
@ -22,8 +22,7 @@ import setUpdateOnQuitInjectable from "../../../../main/electron-app/features/se
|
|||||||
import showInfoNotificationInjectable from "../../../../renderer/components/notifications/show-info-notification.injectable";
|
import showInfoNotificationInjectable from "../../../../renderer/components/notifications/show-info-notification.injectable";
|
||||||
import processCheckingForUpdatesInjectable from "../../main/process-checking-for-updates.injectable";
|
import processCheckingForUpdatesInjectable from "../../main/process-checking-for-updates.injectable";
|
||||||
import type { DiContainer } from "@ogre-tools/injectable";
|
import type { DiContainer } from "@ogre-tools/injectable";
|
||||||
import getBuildVersionInjectable
|
import getBuildVersionInjectable from "../../../../main/vars/build-version/get-build-version.injectable";
|
||||||
from "../../../../main/vars/build-version/get-build-version.injectable";
|
|
||||||
|
|
||||||
describe("selection of update stability", () => {
|
describe("selection of update stability", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
@ -34,9 +33,9 @@ describe("selection of update stability", () => {
|
|||||||
let showInfoNotificationMock: jest.Mock;
|
let showInfoNotificationMock: jest.Mock;
|
||||||
let mainDi: DiContainer;
|
let mainDi: DiContainer;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
builder.beforeApplicationStart((mainDi) => {
|
builder.beforeApplicationStart((mainDi) => {
|
||||||
quitAndInstallUpdateMock = jest.fn();
|
quitAndInstallUpdateMock = jest.fn();
|
||||||
checkForPlatformUpdatesMock = asyncFn();
|
checkForPlatformUpdatesMock = asyncFn();
|
||||||
@ -73,10 +72,6 @@ describe("selection of update stability", () => {
|
|||||||
mainDi = builder.mainDi;
|
mainDi = builder.mainDi;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when started", () => {
|
describe("when started", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let processCheckingForUpdates: (source: string) => Promise<{ updateIsReadyToBeInstalled: boolean }>;
|
let processCheckingForUpdates: (source: string) => Promise<{ updateIsReadyToBeInstalled: boolean }>;
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import electronUpdaterIsActiveInjectable from "../../main/electron-app/features/electron-updater-is-active.injectable";
|
import electronUpdaterIsActiveInjectable from "../../main/electron-app/features/electron-updater-is-active.injectable";
|
||||||
import publishIsConfiguredInjectable from "./main/updating-is-enabled/publish-is-configured/publish-is-configured.injectable";
|
import publishIsConfiguredInjectable from "./main/updating-is-enabled/publish-is-configured/publish-is-configured.injectable";
|
||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
@ -21,9 +21,9 @@ describe("downgrading version update", () => {
|
|||||||
let checkForPlatformUpdatesMock: AsyncFnMock<CheckForPlatformUpdates>;
|
let checkForPlatformUpdatesMock: AsyncFnMock<CheckForPlatformUpdates>;
|
||||||
let mainDi: DiContainer;
|
let mainDi: DiContainer;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
builder.beforeApplicationStart(mainDi => {
|
builder.beforeApplicationStart(mainDi => {
|
||||||
checkForPlatformUpdatesMock = asyncFn();
|
checkForPlatformUpdatesMock = asyncFn();
|
||||||
|
|
||||||
@ -39,10 +39,6 @@ describe("downgrading version update", () => {
|
|||||||
mainDi = builder.mainDi;
|
mainDi = builder.mainDi;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
updateChannel: updateChannels.latest,
|
updateChannel: updateChannels.latest,
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import quitAndInstallUpdateInjectable from "./main/quit-and-install-update.injectable";
|
import quitAndInstallUpdateInjectable from "./main/quit-and-install-update.injectable";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import electronUpdaterIsActiveInjectable from "../../main/electron-app/features/electron-updater-is-active.injectable";
|
import electronUpdaterIsActiveInjectable from "../../main/electron-app/features/electron-updater-is-active.injectable";
|
||||||
@ -26,11 +26,11 @@ describe("installing update", () => {
|
|||||||
let downloadPlatformUpdateMock: AsyncFnMock<DownloadPlatformUpdate>;
|
let downloadPlatformUpdateMock: AsyncFnMock<DownloadPlatformUpdate>;
|
||||||
let setUpdateOnQuitMock: jest.Mock;
|
let setUpdateOnQuitMock: jest.Mock;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
testUsingFakeTime("2015-10-21T07:28:00Z");
|
testUsingFakeTime("2015-10-21T07:28:00Z");
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.beforeApplicationStart((mainDi) => {
|
builder.beforeApplicationStart((mainDi) => {
|
||||||
quitAndInstallUpdateMock = jest.fn();
|
quitAndInstallUpdateMock = jest.fn();
|
||||||
checkForPlatformUpdatesMock = asyncFn();
|
checkForPlatformUpdatesMock = asyncFn();
|
||||||
@ -61,10 +61,6 @@ describe("installing update", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when started", () => {
|
describe("when started", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let processCheckingForUpdates: (source: string) => Promise<{ updateIsReadyToBeInstalled: boolean }>;
|
let processCheckingForUpdates: (source: string) => Promise<{ updateIsReadyToBeInstalled: boolean }>;
|
||||||
|
|||||||
@ -13,7 +13,7 @@ import normalizedPlatformInjectable from "../../../common/vars/normalized-platfo
|
|||||||
import kubectlBinaryNameInjectable from "../../../main/kubectl/binary-name.injectable";
|
import kubectlBinaryNameInjectable from "../../../main/kubectl/binary-name.injectable";
|
||||||
import kubectlDownloadingNormalizedArchInjectable from "../../../main/kubectl/normalized-arch.injectable";
|
import kubectlDownloadingNormalizedArchInjectable from "../../../main/kubectl/normalized-arch.injectable";
|
||||||
import openDeleteClusterDialogInjectable, { type OpenDeleteClusterDialog } from "../../../renderer/components/delete-cluster-dialog/open.injectable";
|
import openDeleteClusterDialogInjectable, { type OpenDeleteClusterDialog } from "../../../renderer/components/delete-cluster-dialog/open.injectable";
|
||||||
import { type ApplicationBuilder, getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { type ApplicationBuilder, setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import type { Cluster } from "../../../common/cluster/cluster";
|
import type { Cluster } from "../../../common/cluster/cluster";
|
||||||
import navigateToCatalogInjectable from "../../../common/front-end-routing/routes/catalog/navigate-to-catalog.injectable";
|
import navigateToCatalogInjectable from "../../../common/front-end-routing/routes/catalog/navigate-to-catalog.injectable";
|
||||||
import directoryForKubeConfigsInjectable from "../../../common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable";
|
import directoryForKubeConfigsInjectable from "../../../common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable";
|
||||||
@ -77,10 +77,10 @@ describe("Deleting a cluster", () => {
|
|||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let config: KubeConfig;
|
let config: KubeConfig;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
config = new KubeConfig();
|
config = new KubeConfig();
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.beforeApplicationStart((mainDi) => {
|
builder.beforeApplicationStart((mainDi) => {
|
||||||
mainDi.override(createContextHandlerInjectable, () => () => undefined as never);
|
mainDi.override(createContextHandlerInjectable, () => () => undefined as never);
|
||||||
mainDi.override(createKubeconfigManagerInjectable, () => () => undefined as never);
|
mainDi.override(createKubeconfigManagerInjectable, () => () => undefined as never);
|
||||||
@ -104,10 +104,6 @@ describe("Deleting a cluster", () => {
|
|||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when the kubeconfig has multiple clusters", () => {
|
describe("when the kubeconfig has multiple clusters", () => {
|
||||||
let currentCluster: Cluster;
|
let currentCluster: Cluster;
|
||||||
let nonCurrentCluster: Cluster;
|
let nonCurrentCluster: Cluster;
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import type { TestExtensionRenderer } from "../../../renderer/components/test-utils/get-extension-fake";
|
import type { TestExtensionRenderer } from "../../../renderer/components/test-utils/get-extension-fake";
|
||||||
import type { KubernetesCluster } from "../../../common/catalog-entities";
|
import type { KubernetesCluster } from "../../../common/catalog-entities";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
@ -17,9 +17,9 @@ describe("disable-cluster-pages-when-cluster-is-not-relevant", () => {
|
|||||||
let rendererTestExtension: TestExtensionRenderer;
|
let rendererTestExtension: TestExtensionRenderer;
|
||||||
let isEnabledForClusterMock: AsyncFnMock<(cluster: KubernetesCluster) => Promise<boolean>>;
|
let isEnabledForClusterMock: AsyncFnMock<(cluster: KubernetesCluster) => Promise<boolean>>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
isEnabledForClusterMock = asyncFn();
|
isEnabledForClusterMock = asyncFn();
|
||||||
@ -47,10 +47,6 @@ describe("disable-cluster-pages-when-cluster-is-not-relevant", () => {
|
|||||||
builder.extensions.get("test-extension-id").applicationWindows.only;
|
builder.extensions.get("test-extension-id").applicationWindows.only;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given not yet known if extension should be enabled for the cluster, when navigating", () => {
|
describe("given not yet known if extension should be enabled for the cluster, when navigating", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
rendererTestExtension.navigate();
|
rendererTestExtension.navigate();
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import type { KubernetesCluster } from "../../../common/catalog-entities";
|
import type { KubernetesCluster } from "../../../common/catalog-entities";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
@ -15,9 +15,9 @@ describe("disable sidebar items when cluster is not relevant", () => {
|
|||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let isEnabledForClusterMock: AsyncFnMock<(cluster: KubernetesCluster) => Promise<boolean>>;
|
let isEnabledForClusterMock: AsyncFnMock<(cluster: KubernetesCluster) => Promise<boolean>>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
isEnabledForClusterMock = asyncFn();
|
isEnabledForClusterMock = asyncFn();
|
||||||
@ -53,10 +53,6 @@ describe("disable sidebar items when cluster is not relevant", () => {
|
|||||||
builder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given not yet known if extension should be enabled for the cluster", () => {
|
describe("given not yet known if extension should be enabled for the cluster", () => {
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.baseElement).toMatchSnapshot();
|
expect(rendered.baseElement).toMatchSnapshot();
|
||||||
|
|||||||
@ -7,8 +7,8 @@ import type { IObservableValue } from "mobx";
|
|||||||
import { observable, runInAction, computed } from "mobx";
|
import { observable, runInAction, computed } from "mobx";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import type { TestExtensionRenderer } from "../../../renderer/components/test-utils/get-extension-fake";
|
import type { TestExtensionRenderer } from "../../../renderer/components/test-utils/get-extension-fake";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
|
|
||||||
describe("reactively disable cluster pages", () => {
|
describe("reactively disable cluster pages", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
@ -16,9 +16,9 @@ describe("reactively disable cluster pages", () => {
|
|||||||
let someObservable: IObservableValue<boolean>;
|
let someObservable: IObservableValue<boolean>;
|
||||||
let testExtensionInstance: TestExtensionRenderer;
|
let testExtensionInstance: TestExtensionRenderer;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
someObservable = observable.box(false);
|
someObservable = observable.box(false);
|
||||||
@ -46,10 +46,6 @@ describe("reactively disable cluster pages", () => {
|
|||||||
builder.extensions.get("test-extension-id").applicationWindows.only;
|
builder.extensions.get("test-extension-id").applicationWindows.only;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("when navigating to the page, does not show the page", () => {
|
it("when navigating to the page, does not show the page", () => {
|
||||||
testExtensionInstance.navigate();
|
testExtensionInstance.navigate();
|
||||||
|
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import type { KubernetesCluster } from "../../../../common/catalog-entities";
|
import type { KubernetesCluster } from "../../../../common/catalog-entities";
|
||||||
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { KubeObject } from "../../../../common/k8s-api/kube-object";
|
import { KubeObject } from "../../../../common/k8s-api/kube-object";
|
||||||
import apiManagerInjectable from "../../../../common/k8s-api/api-manager/manager.injectable";
|
import apiManagerInjectable from "../../../../common/k8s-api/api-manager/manager.injectable";
|
||||||
@ -22,8 +22,9 @@ describe("disable kube object detail items when cluster is not relevant", () =>
|
|||||||
(cluster: KubernetesCluster) => Promise<boolean>
|
(cluster: KubernetesCluster) => Promise<boolean>
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
builder.afterWindowStart((windowDi) => {
|
builder.afterWindowStart((windowDi) => {
|
||||||
@ -75,10 +76,6 @@ describe("disable kube object detail items when cluster is not relevant", () =>
|
|||||||
builder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given not yet known if extension should be enabled for the cluster", () => {
|
describe("given not yet known if extension should be enabled for the cluster", () => {
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.baseElement).toMatchSnapshot();
|
expect(rendered.baseElement).toMatchSnapshot();
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import type { IObservableValue } from "mobx";
|
import type { IObservableValue } from "mobx";
|
||||||
import { runInAction, computed, observable } from "mobx";
|
import { runInAction, computed, observable } from "mobx";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
@ -19,9 +19,9 @@ describe("reactively hide kube object detail item", () => {
|
|||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let someObservable: IObservableValue<boolean>;
|
let someObservable: IObservableValue<boolean>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
builder.afterWindowStart((windowDi) => {
|
builder.afterWindowStart((windowDi) => {
|
||||||
@ -74,11 +74,6 @@ describe("reactively hide kube object detail item", () => {
|
|||||||
builder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.baseElement).toMatchSnapshot();
|
expect(rendered.baseElement).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import type { KubernetesCluster } from "../../../../common/catalog-entities";
|
import type { KubernetesCluster } from "../../../../common/catalog-entities";
|
||||||
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token";
|
import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token";
|
||||||
import { computed, runInAction } from "mobx";
|
import { computed, runInAction } from "mobx";
|
||||||
@ -24,9 +24,9 @@ describe("disable kube object menu items when cluster is not relevant", () => {
|
|||||||
(cluster: KubernetesCluster) => Promise<boolean>
|
(cluster: KubernetesCluster) => Promise<boolean>
|
||||||
>;
|
>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
@ -70,10 +70,6 @@ describe("disable kube object menu items when cluster is not relevant", () => {
|
|||||||
builder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given not yet known if extension should be enabled for the cluster", () => {
|
describe("given not yet known if extension should be enabled for the cluster", () => {
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.baseElement).toMatchSnapshot();
|
expect(rendered.baseElement).toMatchSnapshot();
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token";
|
import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token";
|
||||||
import type { IObservableValue } from "mobx";
|
import type { IObservableValue } from "mobx";
|
||||||
@ -20,9 +20,9 @@ describe("reactively hide kube object menu item", () => {
|
|||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let someObservable: IObservableValue<boolean>;
|
let someObservable: IObservableValue<boolean>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
@ -66,10 +66,6 @@ describe("reactively hide kube object menu item", () => {
|
|||||||
builder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does not show the kube object menu item", () => {
|
it("does not show the kube object menu item", () => {
|
||||||
const actual = rendered.queryByTestId("some-kube-object-menu-item");
|
const actual = rendered.queryByTestId("some-kube-object-menu-item");
|
||||||
|
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import type { KubernetesCluster } from "../../../../common/catalog-entities";
|
import type { KubernetesCluster } from "../../../../common/catalog-entities";
|
||||||
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token";
|
import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token";
|
||||||
import { computed, runInAction } from "mobx";
|
import { computed, runInAction } from "mobx";
|
||||||
@ -25,9 +25,9 @@ describe("disable kube object statuses when cluster is not relevant", () => {
|
|||||||
(cluster: KubernetesCluster) => Promise<boolean>
|
(cluster: KubernetesCluster) => Promise<boolean>
|
||||||
>;
|
>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
@ -71,10 +71,6 @@ describe("disable kube object statuses when cluster is not relevant", () => {
|
|||||||
builder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given not yet known if extension should be enabled for the cluster", () => {
|
describe("given not yet known if extension should be enabled for the cluster", () => {
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.baseElement).toMatchSnapshot();
|
expect(rendered.baseElement).toMatchSnapshot();
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import { waitFor } from "@testing-library/react";
|
import { waitFor } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../test-utils/application-builder";
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token";
|
import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token";
|
||||||
import type { IObservableValue } from "mobx";
|
import type { IObservableValue } from "mobx";
|
||||||
@ -22,9 +22,9 @@ describe("reactively hide kube object status", () => {
|
|||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let someObservable: IObservableValue<boolean>;
|
let someObservable: IObservableValue<boolean>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
@ -68,10 +68,6 @@ describe("reactively hide kube object status", () => {
|
|||||||
builder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does not show the kube object status", async () => {
|
it("does not show the kube object status", async () => {
|
||||||
await waitFor(() => expect(rendered.baseElement.querySelectorAll(".KubeObjectStatusIcon")).toHaveLength(0));
|
await waitFor(() => expect(rendered.baseElement.querySelectorAll(".KubeObjectStatusIcon")).toHaveLength(0));
|
||||||
});
|
});
|
||||||
|
|||||||
@ -12,8 +12,8 @@ import type { IAtom } from "mobx";
|
|||||||
import { runInAction, createAtom, computed } from "mobx";
|
import { runInAction, createAtom, computed } from "mobx";
|
||||||
import { frontEndRouteInjectionToken } from "../../../common/front-end-routing/front-end-route-injection-token";
|
import { frontEndRouteInjectionToken } from "../../../common/front-end-routing/front-end-route-injection-token";
|
||||||
import { routeSpecificComponentInjectionToken } from "../../../renderer/routes/route-specific-component-injection-token";
|
import { routeSpecificComponentInjectionToken } from "../../../renderer/routes/route-specific-component-injection-token";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { navigateToRouteInjectionToken } from "../../../common/front-end-routing/navigate-to-route-injection-token";
|
import { navigateToRouteInjectionToken } from "../../../common/front-end-routing/navigate-to-route-injection-token";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import { act } from "@testing-library/react";
|
import { act } from "@testing-library/react";
|
||||||
@ -27,11 +27,11 @@ describe("show status for a kube object", () => {
|
|||||||
let warningStatusIsShown: boolean;
|
let warningStatusIsShown: boolean;
|
||||||
let criticalStatusIsShown: boolean;
|
let criticalStatusIsShown: boolean;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
testUsingFakeTime("2015-10-21T07:28:00Z");
|
testUsingFakeTime("2015-10-21T07:28:00Z");
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
infoStatusIsShown = false;
|
infoStatusIsShown = false;
|
||||||
|
|
||||||
const infoStatusInjectable = getInjectable({
|
const infoStatusInjectable = getInjectable({
|
||||||
@ -110,10 +110,6 @@ describe("show status for a kube object", () => {
|
|||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given application starts and in test page", () => {
|
describe("given application starts and in test page", () => {
|
||||||
let windowDi: DiContainer;
|
let windowDi: DiContainer;
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|||||||
@ -7,15 +7,16 @@ import { act } from "@testing-library/react";
|
|||||||
import type { IObservableValue } from "mobx";
|
import type { IObservableValue } from "mobx";
|
||||||
import { computed, observable, runInAction } from "mobx";
|
import { computed, observable, runInAction } from "mobx";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
|
|
||||||
describe("legacy extension adding cluster frame components", () => {
|
describe("legacy extension adding cluster frame components", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
import type { DiContainer } from "@ogre-tools/injectable";
|
import type { DiContainer } from "@ogre-tools/injectable";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import { fireEvent } from "@testing-library/react";
|
import { fireEvent } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import navigateToNamespacesInjectable from "../../../common/front-end-routing/routes/cluster/namespaces/navigate-to-namespaces.injectable";
|
import navigateToNamespacesInjectable from "../../../common/front-end-routing/routes/cluster/namespaces/navigate-to-namespaces.injectable";
|
||||||
import createEditResourceTabInjectable from "../../../renderer/components/dock/edit-resource/edit-resource-tab.injectable";
|
import createEditResourceTabInjectable from "../../../renderer/components/dock/edit-resource/edit-resource-tab.injectable";
|
||||||
import getRandomIdForEditResourceTabInjectable from "../../../renderer/components/dock/edit-resource/get-random-id-for-edit-resource-tab.injectable";
|
import getRandomIdForEditResourceTabInjectable from "../../../renderer/components/dock/edit-resource/get-random-id-for-edit-resource-tab.injectable";
|
||||||
@ -31,9 +31,9 @@ describe("cluster/namespaces - edit namespace from new tab", () => {
|
|||||||
let showSuccessNotificationMock: jest.Mock;
|
let showSuccessNotificationMock: jest.Mock;
|
||||||
let showErrorNotificationMock: jest.Mock;
|
let showErrorNotificationMock: jest.Mock;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
@ -70,10 +70,6 @@ describe("cluster/namespaces - edit namespace from new tab", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when navigating to namespaces", () => {
|
describe("when navigating to namespaces", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let windowDi: DiContainer;
|
let windowDi: DiContainer;
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import { act } from "@testing-library/react";
|
import { act } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { CallForResource } from "../../../renderer/components/dock/edit-resource/edit-resource-model/call-for-resource/call-for-resource.injectable";
|
import type { CallForResource } from "../../../renderer/components/dock/edit-resource/edit-resource-model/call-for-resource/call-for-resource.injectable";
|
||||||
@ -19,9 +19,9 @@ describe("cluster/namespaces - edit namespaces from previously opened tab", () =
|
|||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let callForNamespaceMock: AsyncFnMock<CallForResource>;
|
let callForNamespaceMock: AsyncFnMock<CallForResource>;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
callForNamespaceMock = asyncFn();
|
callForNamespaceMock = asyncFn();
|
||||||
@ -41,10 +41,6 @@ describe("cluster/namespaces - edit namespaces from previously opened tab", () =
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given tab was previously opened, when application is started", () => {
|
describe("given tab was previously opened, when application is started", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
|||||||
@ -9,16 +9,16 @@ import type { SidebarItemRegistration } from "../../renderer/components/layout/s
|
|||||||
import { sidebarItemsInjectionToken } from "../../renderer/components/layout/sidebar-items.injectable";
|
import { sidebarItemsInjectionToken } from "../../renderer/components/layout/sidebar-items.injectable";
|
||||||
import { computed, runInAction } from "mobx";
|
import { computed, runInAction } from "mobx";
|
||||||
import { noop } from "lodash/fp";
|
import { noop } from "lodash/fp";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
|
|
||||||
describe("cluster - order of sidebar items", () => {
|
describe("cluster - order of sidebar items", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
@ -28,10 +28,6 @@ describe("cluster - order of sidebar items", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when rendered", () => {
|
describe("when rendered", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
|
|||||||
@ -14,8 +14,8 @@ import { computed, runInAction } from "mobx";
|
|||||||
import { noop } from "lodash/fp";
|
import { noop } from "lodash/fp";
|
||||||
import routeIsActiveInjectable from "../../renderer/routes/route-is-active.injectable";
|
import routeIsActiveInjectable from "../../renderer/routes/route-is-active.injectable";
|
||||||
import { frontEndRouteInjectionToken } from "../../common/front-end-routing/front-end-route-injection-token";
|
import { frontEndRouteInjectionToken } from "../../common/front-end-routing/front-end-route-injection-token";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import writeJsonFileInjectable from "../../common/fs/write-json-file.injectable";
|
import writeJsonFileInjectable from "../../common/fs/write-json-file.injectable";
|
||||||
import pathExistsInjectable from "../../common/fs/path-exists.injectable";
|
import pathExistsInjectable from "../../common/fs/path-exists.injectable";
|
||||||
import readJsonFileInjectable from "../../common/fs/read-json-file.injectable";
|
import readJsonFileInjectable from "../../common/fs/read-json-file.injectable";
|
||||||
@ -28,11 +28,11 @@ describe("cluster - sidebar and tab navigation for core", () => {
|
|||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
testUsingFakeTime("2015-10-21T07:28:00Z");
|
testUsingFakeTime("2015-10-21T07:28:00Z");
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
@ -40,10 +40,6 @@ describe("cluster - sidebar and tab navigation for core", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given core registrations", () => {
|
describe("given core registrations", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
|
|||||||
@ -8,8 +8,8 @@ import { fireEvent } from "@testing-library/react";
|
|||||||
import directoryForLensLocalStorageInjectable from "../../common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable";
|
import directoryForLensLocalStorageInjectable from "../../common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable";
|
||||||
import routesInjectable from "../../renderer/routes/routes.injectable";
|
import routesInjectable from "../../renderer/routes/routes.injectable";
|
||||||
import { matches } from "lodash/fp";
|
import { matches } from "lodash/fp";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import writeJsonFileInjectable from "../../common/fs/write-json-file.injectable";
|
import writeJsonFileInjectable from "../../common/fs/write-json-file.injectable";
|
||||||
import pathExistsInjectable from "../../common/fs/path-exists.injectable";
|
import pathExistsInjectable from "../../common/fs/path-exists.injectable";
|
||||||
import readJsonFileInjectable from "../../common/fs/read-json-file.injectable";
|
import readJsonFileInjectable from "../../common/fs/read-json-file.injectable";
|
||||||
@ -26,11 +26,11 @@ describe("cluster - sidebar and tab navigation for extensions", () => {
|
|||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
testUsingFakeTime("2015-10-21T07:28:00Z");
|
testUsingFakeTime("2015-10-21T07:28:00Z");
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
@ -43,10 +43,6 @@ describe("cluster - sidebar and tab navigation for extensions", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given extension with cluster pages and cluster page menus", () => {
|
describe("given extension with cluster pages and cluster page menus", () => {
|
||||||
let someObservable: IObservableValue<boolean>;
|
let someObservable: IObservableValue<boolean>;
|
||||||
|
|
||||||
|
|||||||
@ -10,8 +10,8 @@ import { computed, runInAction } from "mobx";
|
|||||||
import { routeSpecificComponentInjectionToken } from "../../renderer/routes/route-specific-component-injection-token";
|
import { routeSpecificComponentInjectionToken } from "../../renderer/routes/route-specific-component-injection-token";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { frontEndRouteInjectionToken } from "../../common/front-end-routing/front-end-route-injection-token";
|
import { frontEndRouteInjectionToken } from "../../common/front-end-routing/front-end-route-injection-token";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { navigateToRouteInjectionToken } from "../../common/front-end-routing/navigate-to-route-injection-token";
|
import { navigateToRouteInjectionToken } from "../../common/front-end-routing/navigate-to-route-injection-token";
|
||||||
import { shouldShowResourceInjectionToken } from "../../common/cluster-store/allowed-resources-injection-token";
|
import { shouldShowResourceInjectionToken } from "../../common/cluster-store/allowed-resources-injection-token";
|
||||||
|
|
||||||
@ -19,9 +19,9 @@ describe("cluster - visibility of sidebar items", () => {
|
|||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
@ -33,10 +33,6 @@ describe("cluster - visibility of sidebar items", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given kube resource for route is not allowed", () => {
|
describe("given kube resource for route is not allowed", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
|
|||||||
@ -5,24 +5,26 @@
|
|||||||
|
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import navigateToWorkloadsOverviewInjectable from "../../common/front-end-routing/routes/cluster/workloads/overview/navigate-to-workloads-overview.injectable";
|
import navigateToWorkloadsOverviewInjectable from "../../common/front-end-routing/routes/cluster/workloads/overview/navigate-to-workloads-overview.injectable";
|
||||||
import { type ApplicationBuilder, getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { type ApplicationBuilder, setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
|
|
||||||
describe("workload overview", () => {
|
describe("workload overview", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let applicationBuilder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
applicationBuilder = getApplicationBuilder().setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
applicationBuilder.allowKubeResource({
|
builder.allowKubeResource({
|
||||||
apiName: "pods",
|
apiName: "pods",
|
||||||
group: "v1",
|
group: "v1",
|
||||||
});
|
});
|
||||||
rendered = await applicationBuilder.render();
|
rendered = await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("when navigating to workload overview", () => {
|
describe("when navigating to workload overview", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
applicationBuilder.navigateWith(navigateToWorkloadsOverviewInjectable);
|
builder.navigateWith(navigateToWorkloadsOverviewInjectable);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../../test-utils/application-builder";
|
||||||
import type { KubernetesCluster } from "../../../../../common/catalog-entities";
|
import type { KubernetesCluster } from "../../../../../common/catalog-entities";
|
||||||
import { getApplicationBuilder } from "../../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../../test-utils/application-builder";
|
||||||
import navigateToWorkloadsOverviewInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/overview/navigate-to-workloads-overview.injectable";
|
import navigateToWorkloadsOverviewInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/overview/navigate-to-workloads-overview.injectable";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
@ -18,9 +18,9 @@ describe("disable workloads overview details when cluster is not relevant", () =
|
|||||||
(cluster: KubernetesCluster) => Promise<boolean>
|
(cluster: KubernetesCluster) => Promise<boolean>
|
||||||
>;
|
>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
isEnabledForClusterMock = asyncFn();
|
isEnabledForClusterMock = asyncFn();
|
||||||
@ -57,10 +57,6 @@ describe("disable workloads overview details when cluster is not relevant", () =
|
|||||||
builder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given not yet known if extension should be enabled for the cluster", () => {
|
describe("given not yet known if extension should be enabled for the cluster", () => {
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.baseElement).toMatchSnapshot();
|
expect(rendered.baseElement).toMatchSnapshot();
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../../test-utils/application-builder";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import getRandomIdInjectable from "../../../../../common/utils/get-random-id.injectable";
|
import getRandomIdInjectable from "../../../../../common/utils/get-random-id.injectable";
|
||||||
import { workloadOverviewDetailInjectionToken } from "../../../../../renderer/components/+workloads-overview/workload-overview-details/workload-overview-detail-injection-token";
|
import { workloadOverviewDetailInjectionToken } from "../../../../../renderer/components/+workloads-overview/workload-overview-details/workload-overview-detail-injection-token";
|
||||||
@ -15,9 +15,9 @@ describe("order of workload overview details", () => {
|
|||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
windowDi.unoverride(getRandomIdInjectable);
|
windowDi.unoverride(getRandomIdInjectable);
|
||||||
windowDi.permitSideEffects(getRandomIdInjectable);
|
windowDi.permitSideEffects(getRandomIdInjectable);
|
||||||
@ -80,10 +80,6 @@ describe("order of workload overview details", () => {
|
|||||||
builder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("shows items in correct order", () => {
|
it("shows items in correct order", () => {
|
||||||
const actual = rendered.queryAllByTestId("workload-overview-detail").map(x => x.id);
|
const actual = rendered.queryAllByTestId("workload-overview-detail").map(x => x.id);
|
||||||
|
|
||||||
|
|||||||
@ -7,17 +7,17 @@ import type { IObservableValue } from "mobx";
|
|||||||
import { computed, observable, runInAction } from "mobx";
|
import { computed, observable, runInAction } from "mobx";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import navigateToWorkloadsOverviewInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/overview/navigate-to-workloads-overview.injectable";
|
import navigateToWorkloadsOverviewInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/overview/navigate-to-workloads-overview.injectable";
|
||||||
import type { ApplicationBuilder } from "../../../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../../test-utils/application-builder";
|
||||||
|
|
||||||
describe("reactively hide workloads overview details item", () => {
|
describe("reactively hide workloads overview details item", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let someObservable: IObservableValue<boolean>;
|
let someObservable: IObservableValue<boolean>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
someObservable = observable.box(false);
|
someObservable = observable.box(false);
|
||||||
@ -54,10 +54,6 @@ describe("reactively hide workloads overview details item", () => {
|
|||||||
builder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does not show the workload overview detail item", () => {
|
it("does not show the workload overview detail item", () => {
|
||||||
const actual = rendered.queryByTestId("some-workload-overview-detail-item");
|
const actual = rendered.queryByTestId("some-workload-overview-detail-item");
|
||||||
|
|
||||||
|
|||||||
@ -6,19 +6,13 @@
|
|||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import userEvent from "@testing-library/user-event";
|
import userEvent from "@testing-library/user-event";
|
||||||
import platformInjectable from "../../common/vars/platform.injectable";
|
import platformInjectable from "../../common/vars/platform.injectable";
|
||||||
import { type ApplicationBuilder, getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { type ApplicationBuilder, setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
|
|
||||||
describe("Command Pallet: keyboard shortcut tests", () => {
|
describe("Command Pallet: keyboard shortcut tests", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when on macOS", () => {
|
describe("when on macOS", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import currentPathInjectable from "../renderer/routes/current-path.injectable";
|
import currentPathInjectable from "../renderer/routes/current-path.injectable";
|
||||||
import type { ApplicationBuilder } from "../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "./test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "./test-utils/application-builder";
|
||||||
import type { DiContainer } from "@ogre-tools/injectable";
|
import type { DiContainer } from "@ogre-tools/injectable";
|
||||||
import type { FakeExtensionOptions } from "../renderer/components/test-utils/get-extension-fake";
|
import type { FakeExtensionOptions } from "../renderer/components/test-utils/get-extension-fake";
|
||||||
|
|
||||||
@ -15,9 +15,9 @@ describe("extension special characters in page registrations", () => {
|
|||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let windowDi: DiContainer;
|
let windowDi: DiContainer;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
|
|
||||||
builder.extensions.enable(extensionWithPagesHavingSpecialCharacters);
|
builder.extensions.enable(extensionWithPagesHavingSpecialCharacters);
|
||||||
@ -25,10 +25,6 @@ describe("extension special characters in page registrations", () => {
|
|||||||
windowDi = builder.applicationWindow.only.di;
|
windowDi = builder.applicationWindow.only.di;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.container).toMatchSnapshot();
|
expect(rendered.container).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import focusWindowInjectable from "../../renderer/navigation/focus-window.injectable";
|
import focusWindowInjectable from "../../renderer/navigation/focus-window.injectable";
|
||||||
|
|
||||||
// TODO: Make components free of side effects by making them deterministic
|
// TODO: Make components free of side effects by making them deterministic
|
||||||
@ -16,9 +16,9 @@ describe("extensions - navigation using application menu", () => {
|
|||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let focusWindowMock: jest.Mock;
|
let focusWindowMock: jest.Mock;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
focusWindowMock = jest.fn();
|
focusWindowMock = jest.fn();
|
||||||
|
|
||||||
@ -28,10 +28,6 @@ describe("extensions - navigation using application menu", () => {
|
|||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.container).toMatchSnapshot();
|
expect(rendered.container).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import { fireEvent } from "@testing-library/react";
|
import { fireEvent } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { ExecFile } from "../../common/fs/exec-file.injectable";
|
import type { ExecFile } from "../../common/fs/exec-file.injectable";
|
||||||
@ -28,11 +28,9 @@ describe("add custom helm repository in preferences", () => {
|
|||||||
let execFileMock: AsyncFnMock<ExecFile>;
|
let execFileMock: AsyncFnMock<ExecFile>;
|
||||||
let getActiveHelmRepositoriesMock: AsyncFnMock<() => Promise<AsyncResult<HelmRepo[]>>>;
|
let getActiveHelmRepositoriesMock: AsyncFnMock<() => Promise<AsyncResult<HelmRepo[]>>>;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
jest.useFakeTimers();
|
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
testUsingFakeTime("2021-01-01 12:00:00");
|
testUsingFakeTime("2021-01-01 12:00:00");
|
||||||
|
|
||||||
execFileMock = asyncFn();
|
execFileMock = asyncFn();
|
||||||
@ -58,10 +56,6 @@ describe("add custom helm repository in preferences", () => {
|
|||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when navigating to preferences containing helm repositories", () => {
|
describe("when navigating to preferences containing helm repositories", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder.preferences.navigate();
|
builder.preferences.navigate();
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { ExecFile } from "../../common/fs/exec-file.injectable";
|
import type { ExecFile } from "../../common/fs/exec-file.injectable";
|
||||||
@ -26,9 +26,9 @@ describe("add helm repository from list in preferences", () => {
|
|||||||
let getActiveHelmRepositoriesMock: AsyncFnMock<() => Promise<AsyncResult<HelmRepo[]>>>;
|
let getActiveHelmRepositoriesMock: AsyncFnMock<() => Promise<AsyncResult<HelmRepo[]>>>;
|
||||||
let callForPublicHelmRepositoriesMock: AsyncFnMock<() => Promise<HelmRepo[]>>;
|
let callForPublicHelmRepositoriesMock: AsyncFnMock<() => Promise<HelmRepo[]>>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
execFileMock = asyncFn();
|
execFileMock = asyncFn();
|
||||||
getActiveHelmRepositoriesMock = asyncFn();
|
getActiveHelmRepositoriesMock = asyncFn();
|
||||||
callForPublicHelmRepositoriesMock = asyncFn();
|
callForPublicHelmRepositoriesMock = asyncFn();
|
||||||
@ -50,10 +50,6 @@ describe("add helm repository from list in preferences", () => {
|
|||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when navigating to preferences containing helm repositories", () => {
|
describe("when navigating to preferences containing helm repositories", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
builder.preferences.navigate();
|
builder.preferences.navigate();
|
||||||
|
|||||||
@ -6,8 +6,8 @@ import type { AsyncFnMock } from "@async-fn/jest";
|
|||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import { fireEvent } from "@testing-library/react";
|
import { fireEvent } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { HelmChart } from "../../../common/k8s-api/endpoints/helm-charts.api";
|
import { HelmChart } from "../../../common/k8s-api/endpoints/helm-charts.api";
|
||||||
import getRandomInstallChartTabIdInjectable from "../../../renderer/components/dock/install-chart/get-random-install-chart-tab-id.injectable";
|
import getRandomInstallChartTabIdInjectable from "../../../renderer/components/dock/install-chart/get-random-install-chart-tab-id.injectable";
|
||||||
import type { RequestCreateHelmRelease } from "../../../common/k8s-api/endpoints/helm-releases.api/request-create.injectable";
|
import type { RequestCreateHelmRelease } from "../../../common/k8s-api/endpoints/helm-releases.api/request-create.injectable";
|
||||||
@ -38,9 +38,9 @@ describe("installing helm chart from new tab", () => {
|
|||||||
let requestHelmChartValuesMock: AsyncFnMock<RequestHelmChartValues>;
|
let requestHelmChartValuesMock: AsyncFnMock<RequestHelmChartValues>;
|
||||||
let requestCreateHelmReleaseMock: AsyncFnMock<RequestCreateHelmRelease>;
|
let requestCreateHelmReleaseMock: AsyncFnMock<RequestCreateHelmRelease>;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
requestDetailedHelmReleaseMock = asyncFn();
|
requestDetailedHelmReleaseMock = asyncFn();
|
||||||
@ -71,10 +71,6 @@ describe("installing helm chart from new tab", () => {
|
|||||||
builder.namespaces.add("some-other-namespace");
|
builder.namespaces.add("some-other-namespace");
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given tab for installing chart was not previously opened and application is started", () => {
|
describe("given tab for installing chart was not previously opened and application is started", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let windowDi: DiContainer;
|
let windowDi: DiContainer;
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { HelmChart } from "../../../common/k8s-api/endpoints/helm-charts.api";
|
import { HelmChart } from "../../../common/k8s-api/endpoints/helm-charts.api";
|
||||||
import getRandomInstallChartTabIdInjectable from "../../../renderer/components/dock/install-chart/get-random-install-chart-tab-id.injectable";
|
import getRandomInstallChartTabIdInjectable from "../../../renderer/components/dock/install-chart/get-random-install-chart-tab-id.injectable";
|
||||||
import writeJsonFileInjectable from "../../../common/fs/write-json-file.injectable";
|
import writeJsonFileInjectable from "../../../common/fs/write-json-file.injectable";
|
||||||
@ -23,9 +23,9 @@ describe("installing helm chart from previously opened tab", () => {
|
|||||||
let requestHelmChartVersionsMock: AsyncFnMock<RequestHelmChartVersions>;
|
let requestHelmChartVersionsMock: AsyncFnMock<RequestHelmChartVersions>;
|
||||||
let requestHelmChartValuesMock: AsyncFnMock<RequestHelmChartValues>;
|
let requestHelmChartValuesMock: AsyncFnMock<RequestHelmChartValues>;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
requestHelmChartVersionsMock = asyncFn();
|
requestHelmChartVersionsMock = asyncFn();
|
||||||
@ -48,10 +48,6 @@ describe("installing helm chart from previously opened tab", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given tab for installing chart was previously opened, when application is started", () => {
|
describe("given tab for installing chart was previously opened, when application is started", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
|||||||
@ -6,8 +6,8 @@ import type { AsyncFnMock } from "@async-fn/jest";
|
|||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import { fireEvent } from "@testing-library/react";
|
import { fireEvent } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { HelmChart } from "../../../common/k8s-api/endpoints/helm-charts.api";
|
import { HelmChart } from "../../../common/k8s-api/endpoints/helm-charts.api";
|
||||||
import getRandomInstallChartTabIdInjectable from "../../../renderer/components/dock/install-chart/get-random-install-chart-tab-id.injectable";
|
import getRandomInstallChartTabIdInjectable from "../../../renderer/components/dock/install-chart/get-random-install-chart-tab-id.injectable";
|
||||||
import requestCreateHelmReleaseInjectable from "../../../common/k8s-api/endpoints/helm-releases.api/request-create.injectable";
|
import requestCreateHelmReleaseInjectable from "../../../common/k8s-api/endpoints/helm-releases.api/request-create.injectable";
|
||||||
@ -30,9 +30,9 @@ describe("opening dock tab for installing helm chart", () => {
|
|||||||
let requestHelmChartReadmeMock: AsyncFnMock<RequestHelmChartReadme>;
|
let requestHelmChartReadmeMock: AsyncFnMock<RequestHelmChartReadme>;
|
||||||
let requestHelmChartValuesMock: jest.Mock;
|
let requestHelmChartValuesMock: jest.Mock;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
requestHelmChartsMock = asyncFn();
|
requestHelmChartsMock = asyncFn();
|
||||||
requestHelmChartVersionsMock = asyncFn();
|
requestHelmChartVersionsMock = asyncFn();
|
||||||
requestHelmChartReadmeMock = asyncFn();
|
requestHelmChartReadmeMock = asyncFn();
|
||||||
@ -56,10 +56,6 @@ describe("opening dock tab for installing helm chart", () => {
|
|||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given application is started, when navigating to helm charts", () => {
|
describe("given application is started, when navigating to helm charts", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { ReadYamlFile } from "../../common/fs/read-yaml-file.injectable";
|
import type { ReadYamlFile } from "../../common/fs/read-yaml-file.injectable";
|
||||||
import readYamlFileInjectable from "../../common/fs/read-yaml-file.injectable";
|
import readYamlFileInjectable from "../../common/fs/read-yaml-file.injectable";
|
||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
@ -27,9 +27,9 @@ describe("listing active helm repositories in preferences", () => {
|
|||||||
let loggerStub: Logger;
|
let loggerStub: Logger;
|
||||||
let showErrorNotificationMock: jest.Mock;
|
let showErrorNotificationMock: jest.Mock;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
readYamlFileMock = asyncFn();
|
readYamlFileMock = asyncFn();
|
||||||
execFileMock = asyncFn();
|
execFileMock = asyncFn();
|
||||||
showErrorNotificationMock = jest.fn();
|
showErrorNotificationMock = jest.fn();
|
||||||
@ -57,10 +57,6 @@ describe("listing active helm repositories in preferences", () => {
|
|||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when navigating to preferences containing helm repositories", () => {
|
describe("when navigating to preferences containing helm repositories", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder.preferences.navigate();
|
builder.preferences.navigate();
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import { fireEvent } from "@testing-library/react";
|
import { fireEvent } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { ExecFile } from "../../common/fs/exec-file.injectable";
|
import type { ExecFile } from "../../common/fs/exec-file.injectable";
|
||||||
@ -22,9 +22,9 @@ describe("remove helm repository from list of active repositories in preferences
|
|||||||
let getActiveHelmRepositoriesMock: AsyncFnMock<() => Promise<AsyncResult<HelmRepo[]>>>;
|
let getActiveHelmRepositoriesMock: AsyncFnMock<() => Promise<AsyncResult<HelmRepo[]>>>;
|
||||||
let execFileMock: AsyncFnMock<ExecFile>;
|
let execFileMock: AsyncFnMock<ExecFile>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
execFileMock = asyncFn();
|
execFileMock = asyncFn();
|
||||||
getActiveHelmRepositoriesMock = asyncFn();
|
getActiveHelmRepositoriesMock = asyncFn();
|
||||||
|
|
||||||
@ -41,10 +41,6 @@ describe("remove helm repository from list of active repositories in preferences
|
|||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when navigating to preferences containing helm repositories", () => {
|
describe("when navigating to preferences containing helm repositories", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder.preferences.navigate();
|
builder.preferences.navigate();
|
||||||
|
|||||||
@ -19,8 +19,8 @@ import type { RequestHelmReleases } from "../../../common/k8s-api/endpoints/helm
|
|||||||
import requestHelmReleasesInjectable from "../../../common/k8s-api/endpoints/helm-releases.api/request-releases.injectable";
|
import requestHelmReleasesInjectable from "../../../common/k8s-api/endpoints/helm-releases.api/request-releases.injectable";
|
||||||
import { advanceFakeTime, testUsingFakeTime } from "../../../common/test-utils/use-fake-time";
|
import { advanceFakeTime, testUsingFakeTime } from "../../../common/test-utils/use-fake-time";
|
||||||
import dockStoreInjectable from "../../../renderer/components/dock/dock/store.injectable";
|
import dockStoreInjectable from "../../../renderer/components/dock/dock/store.injectable";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
|
|
||||||
describe("New Upgrade Helm Chart Dock Tab", () => {
|
describe("New Upgrade Helm Chart Dock Tab", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
@ -31,8 +31,9 @@ describe("New Upgrade Helm Chart Dock Tab", () => {
|
|||||||
let requestHelmChartVersionsMock: AsyncFnMock<RequestHelmChartVersions>;
|
let requestHelmChartVersionsMock: AsyncFnMock<RequestHelmChartVersions>;
|
||||||
let navigateToHelmReleases: NavigateToHelmReleases;
|
let navigateToHelmReleases: NavigateToHelmReleases;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
@ -64,10 +65,6 @@ describe("New Upgrade Helm Chart Dock Tab", () => {
|
|||||||
dockStore.closeTab("terminal");
|
dockStore.closeTab("terminal");
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given a namespace is selected", () => {
|
describe("given a namespace is selected", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
builder.namespaces.select("my-second-namespace");
|
builder.namespaces.select("my-second-namespace");
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import navigateToHelmReleasesInjectable from "../../common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable";
|
import navigateToHelmReleasesInjectable from "../../common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import { fireEvent } from "@testing-library/react";
|
import { fireEvent } from "@testing-library/react";
|
||||||
@ -44,11 +44,11 @@ describe("showing details for helm release", () => {
|
|||||||
let showSuccessNotificationMock: jest.Mock;
|
let showSuccessNotificationMock: jest.Mock;
|
||||||
let showCheckedErrorNotificationMock: jest.Mock;
|
let showCheckedErrorNotificationMock: jest.Mock;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
testUsingFakeTime("2015-10-21T07:28:00Z");
|
testUsingFakeTime("2015-10-21T07:28:00Z");
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
requestHelmReleasesMock = asyncFn();
|
requestHelmReleasesMock = asyncFn();
|
||||||
@ -83,10 +83,6 @@ describe("showing details for helm release", () => {
|
|||||||
builder.namespaces.select("some-other-namespace");
|
builder.namespaces.select("some-other-namespace");
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given application is started", () => {
|
describe("given application is started", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
|||||||
@ -9,8 +9,8 @@ import isEmpty from "lodash/isEmpty";
|
|||||||
import queryParametersInjectable from "../renderer/routes/query-parameters.injectable";
|
import queryParametersInjectable from "../renderer/routes/query-parameters.injectable";
|
||||||
import currentPathInjectable from "../renderer/routes/current-path.injectable";
|
import currentPathInjectable from "../renderer/routes/current-path.injectable";
|
||||||
import type { IComputedValue } from "mobx";
|
import type { IComputedValue } from "mobx";
|
||||||
import type { ApplicationBuilder } from "../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "./test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "./test-utils/application-builder";
|
||||||
import type { FakeExtensionOptions } from "../renderer/components/test-utils/get-extension-fake";
|
import type { FakeExtensionOptions } from "../renderer/components/test-utils/get-extension-fake";
|
||||||
import type { LensRendererExtension } from "../extensions/lens-renderer-extension";
|
import type { LensRendererExtension } from "../extensions/lens-renderer-extension";
|
||||||
|
|
||||||
@ -21,9 +21,9 @@ describe("navigate to extension page", () => {
|
|||||||
let currentPath: IComputedValue<string>;
|
let currentPath: IComputedValue<string>;
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.extensions.enable(extensionWithPagesHavingParameters);
|
builder.extensions.enable(extensionWithPagesHavingParameters);
|
||||||
|
|
||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
@ -37,10 +37,6 @@ describe("navigate to extension page", () => {
|
|||||||
currentPath = windowDi.inject(currentPathInjectable);
|
currentPath = windowDi.inject(currentPathInjectable);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.container).toMatchSnapshot();
|
expect(rendered.container).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -11,8 +11,8 @@ import { routeSpecificComponentInjectionToken } from "../renderer/routes/route-s
|
|||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import type { Route } from "../common/front-end-routing/front-end-route-injection-token";
|
import type { Route } from "../common/front-end-routing/front-end-route-injection-token";
|
||||||
import { frontEndRouteInjectionToken } from "../common/front-end-routing/front-end-route-injection-token";
|
import { frontEndRouteInjectionToken } from "../common/front-end-routing/front-end-route-injection-token";
|
||||||
import type { ApplicationBuilder } from "../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "./test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "./test-utils/application-builder";
|
||||||
import currentRouteInjectable from "../renderer/routes/current-route.injectable";
|
import currentRouteInjectable from "../renderer/routes/current-route.injectable";
|
||||||
import currentPathInjectable from "../renderer/routes/current-path.injectable";
|
import currentPathInjectable from "../renderer/routes/current-path.injectable";
|
||||||
import queryParametersInjectable from "../renderer/routes/query-parameters.injectable";
|
import queryParametersInjectable from "../renderer/routes/query-parameters.injectable";
|
||||||
@ -23,13 +23,7 @@ describe("navigating between routes", () => {
|
|||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given route without path parameters", () => {
|
describe("given route without path parameters", () => {
|
||||||
let windowDi: DiContainer;
|
let windowDi: DiContainer;
|
||||||
|
|||||||
@ -8,8 +8,8 @@ import { act, waitFor } from "@testing-library/react";
|
|||||||
import getPodByIdInjectable from "../../renderer/components/+workloads-pods/get-pod-by-id.injectable";
|
import getPodByIdInjectable from "../../renderer/components/+workloads-pods/get-pod-by-id.injectable";
|
||||||
import getPodsByOwnerIdInjectable from "../../renderer/components/+workloads-pods/get-pods-by-owner-id.injectable";
|
import getPodsByOwnerIdInjectable from "../../renderer/components/+workloads-pods/get-pods-by-owner-id.injectable";
|
||||||
import openSaveFileDialogInjectable from "../../renderer/utils/save-file.injectable";
|
import openSaveFileDialogInjectable from "../../renderer/utils/save-file.injectable";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import dockStoreInjectable from "../../renderer/components/dock/dock/store.injectable";
|
import dockStoreInjectable from "../../renderer/components/dock/dock/store.injectable";
|
||||||
import areLogsPresentInjectable from "../../renderer/components/dock/logs/are-logs-present.injectable";
|
import areLogsPresentInjectable from "../../renderer/components/dock/logs/are-logs-present.injectable";
|
||||||
import type { CallForLogs } from "../../renderer/components/dock/logs/call-for-logs.injectable";
|
import type { CallForLogs } from "../../renderer/components/dock/logs/call-for-logs.injectable";
|
||||||
@ -46,11 +46,11 @@ describe("download logs options in logs dock tab", () => {
|
|||||||
image: "docker.io/prom/node-exporter:v1.0.0-rc.0",
|
image: "docker.io/prom/node-exporter:v1.0.0-rc.0",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
const selectedPod = dockerPod;
|
const selectedPod = dockerPod;
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
callForLogsMock = jest.fn();
|
callForLogsMock = jest.fn();
|
||||||
@ -95,10 +95,6 @@ describe("download logs options in logs dock tab", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("opening pod logs", () => {
|
describe("opening pod logs", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
import type { DiContainer } from "@ogre-tools/injectable";
|
import type { DiContainer } from "@ogre-tools/injectable";
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import currentPathInjectable from "../../renderer/routes/current-path.injectable";
|
import currentPathInjectable from "../../renderer/routes/current-path.injectable";
|
||||||
import { frontEndRouteInjectionToken } from "../../common/front-end-routing/front-end-route-injection-token";
|
import { frontEndRouteInjectionToken } from "../../common/front-end-routing/front-end-route-injection-token";
|
||||||
import { computed, runInAction } from "mobx";
|
import { computed, runInAction } from "mobx";
|
||||||
@ -21,9 +21,9 @@ import historyInjectable from "../../renderer/navigation/history.injectable";
|
|||||||
describe("preferences - closing-preferences", () => {
|
describe("preferences - closing-preferences", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
runInAction(() => {
|
runInAction(() => {
|
||||||
windowDi.register(
|
windowDi.register(
|
||||||
@ -47,10 +47,6 @@ describe("preferences - closing-preferences", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given already in a page", () => {
|
describe("given already in a page", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let windowDi: DiContainer;
|
let windowDi: DiContainer;
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { IObservableValue } from "mobx";
|
import type { IObservableValue } from "mobx";
|
||||||
import { runInAction, computed, observable } from "mobx";
|
import { runInAction, computed, observable } from "mobx";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
@ -14,13 +14,7 @@ import React from "react";
|
|||||||
describe("preferences: extension adding preference tabs", () => {
|
describe("preferences: extension adding preference tabs", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given in preferences, when extension with preference tabs is enabled", () => {
|
describe("given in preferences, when extension with preference tabs is enabled", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|||||||
@ -7,8 +7,8 @@ import type { DiContainer } from "@ogre-tools/injectable";
|
|||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import { runInAction } from "mobx";
|
import { runInAction } from "mobx";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { preferenceItemInjectionToken } from "./renderer/preference-items/preference-item-injection-token";
|
import { preferenceItemInjectionToken } from "./renderer/preference-items/preference-item-injection-token";
|
||||||
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
@ -19,16 +19,14 @@ describe("preferences - hiding-of-empty-branches, given in preferences page", ()
|
|||||||
let windowDi: DiContainer;
|
let windowDi: DiContainer;
|
||||||
let discover: Discover;
|
let discover: Discover;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
|
|
||||||
discover = discoverFor(() => rendered);
|
discover = discoverFor(() => rendered);
|
||||||
|
windowDi = builder.applicationWindow.only.di;
|
||||||
|
|
||||||
builder.preferences.navigate();
|
builder.preferences.navigate();
|
||||||
|
|
||||||
windowDi = builder.applicationWindow.only.di;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("given tab group and empty tabs", () => {
|
describe("given tab group and empty tabs", () => {
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import navigateToProxyPreferencesInjectable from "./common/navigate-to-proxy-preferences.injectable";
|
import navigateToProxyPreferencesInjectable from "./common/navigate-to-proxy-preferences.injectable";
|
||||||
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
@ -14,13 +14,7 @@ import type { FakeExtensionOptions } from "../../renderer/components/test-utils/
|
|||||||
describe("preferences - navigation to application preferences", () => {
|
describe("preferences - navigation to application preferences", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given in preferences, when rendered", () => {
|
describe("given in preferences, when rendered", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
|
|
||||||
@ -12,13 +12,7 @@ describe("preferences - navigation to editor preferences", () => {
|
|||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let discover: Discover;
|
let discover: Discover;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given in preferences, when rendered", () => {
|
describe("given in preferences, when rendered", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import "@testing-library/jest-dom/extend-expect";
|
import "@testing-library/jest-dom/extend-expect";
|
||||||
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
||||||
@ -15,13 +15,7 @@ import logErrorInjectable from "../../common/log-error.injectable";
|
|||||||
describe("preferences - navigation to extension specific preferences", () => {
|
describe("preferences - navigation to extension specific preferences", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given in preferences, when rendered", () => {
|
describe("given in preferences, when rendered", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import requestPublicHelmRepositoriesInjectable from "../helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/public-helm-repositories/request-public-helm-repositories.injectable";
|
import requestPublicHelmRepositoriesInjectable from "../helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/public-helm-repositories/request-public-helm-repositories.injectable";
|
||||||
import getActiveHelmRepositoriesInjectable from "../../main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable";
|
import getActiveHelmRepositoriesInjectable from "../../main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable";
|
||||||
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
@ -13,13 +13,7 @@ import { discoverFor } from "../../renderer/components/test-utils/discovery-of-h
|
|||||||
describe("preferences - navigation to kubernetes preferences", () => {
|
describe("preferences - navigation to kubernetes preferences", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given in preferences, when rendered", () => {
|
describe("given in preferences, when rendered", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|||||||
@ -3,21 +3,15 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
|
|
||||||
describe("preferences - navigation to proxy preferences", () => {
|
describe("preferences - navigation to proxy preferences", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given in preferences, when rendered", () => {
|
describe("given in preferences, when rendered", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import navigateToTelemetryPreferencesInjectable from "./common/navigate-to-telemetry-preferences.injectable";
|
import navigateToTelemetryPreferencesInjectable from "./common/navigate-to-telemetry-preferences.injectable";
|
||||||
import sentryDataSourceNameInjectable from "../../common/vars/sentry-dsn-url.injectable";
|
import sentryDataSourceNameInjectable from "../../common/vars/sentry-dsn-url.injectable";
|
||||||
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
||||||
@ -15,13 +15,7 @@ import { discoverFor } from "../../renderer/components/test-utils/discovery-of-h
|
|||||||
describe("preferences - navigation to telemetry preferences", () => {
|
describe("preferences - navigation to telemetry preferences", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given in preferences, when rendered", () => {
|
describe("given in preferences, when rendered", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|||||||
@ -3,21 +3,15 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
|
|
||||||
describe("preferences - navigation to terminal preferences", () => {
|
describe("preferences - navigation to terminal preferences", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given in preferences, when rendered", () => {
|
describe("given in preferences, when rendered", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
|
|
||||||
@ -13,18 +13,14 @@ describe("preferences - navigation using application menu", () => {
|
|||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let discover: Discover;
|
let discover: Discover;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
discover = discoverFor(() => rendered);
|
discover = discoverFor(() => rendered);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.container).toMatchSnapshot();
|
expect(rendered.container).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
|
|
||||||
@ -13,17 +13,13 @@ describe("show-about-using-tray", () => {
|
|||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let discover: Discover;
|
let discover: Discover;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
discover = discoverFor(() => rendered);
|
discover = discoverFor(() => rendered);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.baseElement).toMatchSnapshot();
|
expect(rendered.baseElement).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
@ -14,13 +14,7 @@ import navigateInjectable from "../../renderer/navigation/navigate.injectable";
|
|||||||
describe("preferences: URLs of legacy extensions", () => {
|
describe("preferences: URLs of legacy extensions", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given extension with custom preferences and a custom preference tab", () => {
|
describe("given extension with custom preferences and a custom preference tab", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { LensWindow } from "../../main/start-main-application/lens-window/application-window/create-lens-window.injectable";
|
import type { LensWindow } from "../../main/start-main-application/lens-window/application-window/create-lens-window.injectable";
|
||||||
@ -17,8 +17,11 @@ import staticFilesDirectoryInjectable from "../../common/vars/static-files-direc
|
|||||||
import { matches } from "jest-mock-extended";
|
import { matches } from "jest-mock-extended";
|
||||||
|
|
||||||
describe("opening application window using tray", () => {
|
describe("opening application window using tray", () => {
|
||||||
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
describe("given application has started", () => {
|
describe("given application has started", () => {
|
||||||
let builder: ApplicationBuilder;
|
|
||||||
let createElectronWindowMock: jest.Mock;
|
let createElectronWindowMock: jest.Mock;
|
||||||
let expectWindowsToBeOpen: (windowIds: string[]) => void;
|
let expectWindowsToBeOpen: (windowIds: string[]) => void;
|
||||||
let callForSplashWindowHtmlMock: AsyncFnMock<() => Promise<void>>;
|
let callForSplashWindowHtmlMock: AsyncFnMock<() => Promise<void>>;
|
||||||
@ -31,8 +34,6 @@ describe("opening application window using tray", () => {
|
|||||||
|
|
||||||
focusApplicationMock = jest.fn();
|
focusApplicationMock = jest.fn();
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.beforeApplicationStart((mainDi) => {
|
builder.beforeApplicationStart((mainDi) => {
|
||||||
mainDi.override(focusApplicationInjectable, () => focusApplicationMock);
|
mainDi.override(focusApplicationInjectable, () => focusApplicationMock);
|
||||||
|
|
||||||
@ -76,10 +77,6 @@ describe("opening application window using tray", () => {
|
|||||||
await builder.render();
|
await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("only the first application window is open", () => {
|
it("only the first application window is open", () => {
|
||||||
expectWindowsToBeOpen(["first-application-window"]);
|
expectWindowsToBeOpen(["first-application-window"]);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { ClusterManager } from "../../main/cluster/manager";
|
import type { ClusterManager } from "../../main/cluster/manager";
|
||||||
import exitAppInjectable from "../../main/electron-app/features/exit-app.injectable";
|
import exitAppInjectable from "../../main/electron-app/features/exit-app.injectable";
|
||||||
import clusterManagerInjectable from "../../main/cluster/manager.injectable";
|
import clusterManagerInjectable from "../../main/cluster/manager.injectable";
|
||||||
@ -12,16 +12,17 @@ import stopServicesAndExitAppInjectable from "../../main/stop-services-and-exit-
|
|||||||
import { advanceFakeTime, testUsingFakeTime } from "../../common/test-utils/use-fake-time";
|
import { advanceFakeTime, testUsingFakeTime } from "../../common/test-utils/use-fake-time";
|
||||||
|
|
||||||
describe("quitting the app using application menu", () => {
|
describe("quitting the app using application menu", () => {
|
||||||
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
describe("given application has started", () => {
|
describe("given application has started", () => {
|
||||||
let builder: ApplicationBuilder;
|
|
||||||
let clusterManagerStub: ClusterManager;
|
let clusterManagerStub: ClusterManager;
|
||||||
let exitAppMock: jest.Mock;
|
let exitAppMock: jest.Mock;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
testUsingFakeTime("2015-10-21T07:28:00Z");
|
testUsingFakeTime("2015-10-21T07:28:00Z");
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.beforeApplicationStart(
|
builder.beforeApplicationStart(
|
||||||
(mainDi) => {
|
(mainDi) => {
|
||||||
mainDi.unoverride(stopServicesAndExitAppInjectable);
|
mainDi.unoverride(stopServicesAndExitAppInjectable);
|
||||||
@ -37,10 +38,6 @@ describe("quitting the app using application menu", () => {
|
|||||||
await builder.render();
|
await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("first application window is open", () => {
|
it("first application window is open", () => {
|
||||||
const windows = builder.applicationWindow.getAll();
|
const windows = builder.applicationWindow.getAll();
|
||||||
|
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
import type { AsyncFnMock } from "@async-fn/jest";
|
import type { AsyncFnMock } from "@async-fn/jest";
|
||||||
import asyncFn from "@async-fn/jest";
|
import asyncFn from "@async-fn/jest";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { ResolveSystemProxy } from "../../common/utils/resolve-system-proxy/resolve-system-proxy-injection-token";
|
import type { ResolveSystemProxy } from "../../common/utils/resolve-system-proxy/resolve-system-proxy-injection-token";
|
||||||
import { resolveSystemProxyInjectionToken } from "../../common/utils/resolve-system-proxy/resolve-system-proxy-injection-token";
|
import { resolveSystemProxyInjectionToken } from "../../common/utils/resolve-system-proxy/resolve-system-proxy-injection-token";
|
||||||
import resolveSystemProxyFromElectronInjectable from "../../main/utils/resolve-system-proxy/resolve-system-proxy-from-electron.injectable";
|
import resolveSystemProxyFromElectronInjectable from "../../main/utils/resolve-system-proxy/resolve-system-proxy-from-electron.injectable";
|
||||||
@ -16,9 +16,9 @@ describe("resolve-system-proxy", () => {
|
|||||||
let actualPromise: Promise<string>;
|
let actualPromise: Promise<string>;
|
||||||
let resolveSystemProxyFromElectronMock: AsyncFnMock<ResolveSystemProxy>;
|
let resolveSystemProxyFromElectronMock: AsyncFnMock<ResolveSystemProxy>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
resolveSystemProxyFromElectronMock = asyncFn();
|
resolveSystemProxyFromElectronMock = asyncFn();
|
||||||
|
|
||||||
builder.beforeApplicationStart((mainDi) => {
|
builder.beforeApplicationStart((mainDi) => {
|
||||||
@ -31,10 +31,6 @@ describe("resolve-system-proxy", () => {
|
|||||||
await builder.render();
|
await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given in main, when called with URL", () => {
|
describe("given in main, when called with URL", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const resolveSystemProxyInMain = builder.mainDi.inject(
|
const resolveSystemProxyInMain = builder.mainDi.inject(
|
||||||
|
|||||||
@ -7,8 +7,8 @@ import type { IObservableValue } from "mobx";
|
|||||||
import { observable, runInAction, computed } from "mobx";
|
import { observable, runInAction, computed } from "mobx";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import type { TestExtensionRenderer } from "../../../renderer/components/test-utils/get-extension-fake";
|
import type { TestExtensionRenderer } from "../../../renderer/components/test-utils/get-extension-fake";
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
|
|
||||||
describe("reactively disable global pages", () => {
|
describe("reactively disable global pages", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
@ -16,9 +16,9 @@ describe("reactively disable global pages", () => {
|
|||||||
let someObservable: IObservableValue<boolean>;
|
let someObservable: IObservableValue<boolean>;
|
||||||
let rendererTestExtension: TestExtensionRenderer;
|
let rendererTestExtension: TestExtensionRenderer;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
someObservable = observable.box(false);
|
someObservable = observable.box(false);
|
||||||
|
|
||||||
const testExtension = {
|
const testExtension = {
|
||||||
@ -43,10 +43,6 @@ describe("reactively disable global pages", () => {
|
|||||||
rendererTestExtension = builder.extensions.get("test-extension-id").applicationWindows.only;
|
rendererTestExtension = builder.extensions.get("test-extension-id").applicationWindows.only;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("when navigating to the page, does not show the page", () => {
|
it("when navigating to the page, does not show the page", () => {
|
||||||
rendererTestExtension.navigate();
|
rendererTestExtension.navigate();
|
||||||
|
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import getRandomIdInjectable from "../../common/utils/get-random-id.injectable";
|
import getRandomIdInjectable from "../../common/utils/get-random-id.injectable";
|
||||||
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
||||||
import { computed } from "mobx";
|
import { computed } from "mobx";
|
||||||
@ -13,19 +13,15 @@ import { computed } from "mobx";
|
|||||||
describe("status-bar-items-originating-from-extensions", () => {
|
describe("status-bar-items-originating-from-extensions", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
windowDi.unoverride(getRandomIdInjectable);
|
windowDi.unoverride(getRandomIdInjectable);
|
||||||
windowDi.permitSideEffects(getRandomIdInjectable);
|
windowDi.permitSideEffects(getRandomIdInjectable);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when application starts", () => {
|
describe("when application starts", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
|||||||
@ -14,8 +14,8 @@ import createKubeconfigManagerInjectable from "../../main/kubeconfig-manager/cre
|
|||||||
import type { KubeconfigManager } from "../../main/kubeconfig-manager/kubeconfig-manager";
|
import type { KubeconfigManager } from "../../main/kubeconfig-manager/kubeconfig-manager";
|
||||||
import type { SpawnPty } from "../../main/shell-session/spawn-pty.injectable";
|
import type { SpawnPty } from "../../main/shell-session/spawn-pty.injectable";
|
||||||
import spawnPtyInjectable from "../../main/shell-session/spawn-pty.injectable";
|
import spawnPtyInjectable from "../../main/shell-session/spawn-pty.injectable";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { FindByTextWithMarkup } from "../../test-utils/findByTextWithMarkup";
|
import type { FindByTextWithMarkup } from "../../test-utils/findByTextWithMarkup";
|
||||||
import { findByTextWithMarkupFor } from "../../test-utils/findByTextWithMarkup";
|
import { findByTextWithMarkupFor } from "../../test-utils/findByTextWithMarkup";
|
||||||
|
|
||||||
@ -25,6 +25,8 @@ describe("test for opening terminal tab within cluster frame", () => {
|
|||||||
let findByTextWithMarkup: FindByTextWithMarkup;
|
let findByTextWithMarkup: FindByTextWithMarkup;
|
||||||
let spawnPtyMock: jest.MockedFunction<SpawnPty>;
|
let spawnPtyMock: jest.MockedFunction<SpawnPty>;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
jest.spyOn(window, "requestAnimationFrame").mockImplementation(function IAmAMockRequestAnimationFrame(cb) {
|
jest.spyOn(window, "requestAnimationFrame").mockImplementation(function IAmAMockRequestAnimationFrame(cb) {
|
||||||
return window.setTimeout(() => cb(Date.now()));
|
return window.setTimeout(() => cb(Date.now()));
|
||||||
@ -32,8 +34,6 @@ describe("test for opening terminal tab within cluster frame", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.mainDi.override(createKubeconfigManagerInjectable, () => (cluster) => {
|
builder.mainDi.override(createKubeconfigManagerInjectable, () => (cluster) => {
|
||||||
return {
|
return {
|
||||||
getPath: async () => `/some-kubeconfig-managed-path-for-${cluster.id}`,
|
getPath: async () => `/some-kubeconfig-managed-path-for-${cluster.id}`,
|
||||||
@ -50,10 +50,6 @@ describe("test for opening terminal tab within cluster frame", () => {
|
|||||||
findByTextWithMarkup = findByTextWithMarkupFor(result);
|
findByTextWithMarkup = findByTextWithMarkupFor(result);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when new terminal tab is opened", () => {
|
describe("when new terminal tab is opened", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
result.getByTestId("dock-tab-for-terminal").click();
|
result.getByTestId("dock-tab-for-terminal").click();
|
||||||
|
|||||||
941
src/features/test-utils/application-builder.tsx
Normal file
941
src/features/test-utils/application-builder.tsx
Normal file
@ -0,0 +1,941 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import type { LensRendererExtension } from "../../extensions/lens-renderer-extension";
|
||||||
|
import rendererExtensionsInjectable from "../../extensions/renderer-extensions.injectable";
|
||||||
|
import currentlyInClusterFrameInjectable from "../../renderer/routes/currently-in-cluster-frame.injectable";
|
||||||
|
import type { IComputedValue, ObservableMap } from "mobx";
|
||||||
|
import { action, computed, observable, runInAction } from "mobx";
|
||||||
|
import React from "react";
|
||||||
|
import { Router } from "react-router";
|
||||||
|
import type { RenderResult } from "@testing-library/react";
|
||||||
|
import { fireEvent, queryByText } from "@testing-library/react";
|
||||||
|
import type { KubeApiResourceDescriptor } from "../../common/rbac";
|
||||||
|
import { apiResourceRecord, formatKubeApiResource } from "../../common/rbac";
|
||||||
|
import type { DiContainer, Injectable } from "@ogre-tools/injectable";
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import mainExtensionsInjectable from "../../extensions/main-extensions.injectable";
|
||||||
|
import { pipeline } from "@ogre-tools/fp";
|
||||||
|
import { filter, first, join, last, map, matches } from "lodash/fp";
|
||||||
|
import navigateToPreferencesInjectable from "../preferences/common/navigate-to-preferences.injectable";
|
||||||
|
import type { NavigateToHelmCharts } from "../../common/front-end-routing/routes/cluster/helm/charts/navigate-to-helm-charts.injectable";
|
||||||
|
import navigateToHelmChartsInjectable from "../../common/front-end-routing/routes/cluster/helm/charts/navigate-to-helm-charts.injectable";
|
||||||
|
import type { Cluster } from "../../common/cluster/cluster";
|
||||||
|
import startMainApplicationInjectable from "../../main/start-main-application/start-main-application.injectable";
|
||||||
|
import startFrameInjectable from "../../renderer/start-frame/start-frame.injectable";
|
||||||
|
import type { NamespaceStore } from "../../renderer/components/+namespaces/store";
|
||||||
|
import historyInjectable from "../../renderer/navigation/history.injectable";
|
||||||
|
import type { MinimalTrayMenuItem } from "../../main/tray/electron-tray/electron-tray.injectable";
|
||||||
|
import electronTrayInjectable from "../../main/tray/electron-tray/electron-tray.injectable";
|
||||||
|
import { getDiForUnitTesting as getRendererDi } from "../../renderer/getDiForUnitTesting";
|
||||||
|
import { getDiForUnitTesting as getMainDi } from "../../main/getDiForUnitTesting";
|
||||||
|
import { overrideChannels } from "../../test-utils/channel-fakes/override-channels";
|
||||||
|
import assert from "assert";
|
||||||
|
import { openMenu } from "react-select-event";
|
||||||
|
import userEvent from "@testing-library/user-event";
|
||||||
|
import type { Route } from "../../common/front-end-routing/front-end-route-injection-token";
|
||||||
|
import type { NavigateToRouteOptions } from "../../common/front-end-routing/navigate-to-route-injection-token";
|
||||||
|
import { navigateToRouteInjectionToken } from "../../common/front-end-routing/navigate-to-route-injection-token";
|
||||||
|
import type { LensMainExtension } from "../../extensions/lens-main-extension";
|
||||||
|
import type { LensExtension } from "../../extensions/lens-extension";
|
||||||
|
import extensionInjectable from "../../extensions/extension-loader/extension/extension.injectable";
|
||||||
|
import { renderFor } from "../../renderer/components/test-utils/renderFor";
|
||||||
|
import { RootFrame } from "../../renderer/frames/root-frame/root-frame";
|
||||||
|
import { ClusterFrame } from "../../renderer/frames/cluster-frame/cluster-frame";
|
||||||
|
import hostedClusterIdInjectable from "../../renderer/cluster-frame-context/hosted-cluster-id.injectable";
|
||||||
|
import namespaceStoreInjectable from "../../renderer/components/+namespaces/store.injectable";
|
||||||
|
import createApplicationWindowInjectable from "../../main/start-main-application/lens-window/application-window/create-application-window.injectable";
|
||||||
|
import type { CreateElectronWindow } from "../../main/start-main-application/lens-window/application-window/create-electron-window.injectable";
|
||||||
|
import createElectronWindowInjectable from "../../main/start-main-application/lens-window/application-window/create-electron-window.injectable";
|
||||||
|
import { applicationWindowInjectionToken } from "../../main/start-main-application/lens-window/application-window/application-window-injection-token";
|
||||||
|
import closeAllWindowsInjectable from "../../main/start-main-application/lens-window/hide-all-windows/close-all-windows.injectable";
|
||||||
|
import type { LensWindow } from "../../main/start-main-application/lens-window/application-window/create-lens-window.injectable";
|
||||||
|
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
||||||
|
import { getExtensionFakeForMain, getExtensionFakeForRenderer } from "../../renderer/components/test-utils/get-extension-fake";
|
||||||
|
import namespaceApiInjectable from "../../common/k8s-api/endpoints/namespace.api.injectable";
|
||||||
|
import { Namespace } from "../../common/k8s-api/endpoints";
|
||||||
|
import { getOverrideFsWithFakes } from "../../test-utils/override-fs-with-fakes";
|
||||||
|
import applicationMenuItemCompositeInjectable from "../application-menu/main/application-menu-item-composite.injectable";
|
||||||
|
import { getCompositePaths } from "../../common/utils/composite/get-composite-paths/get-composite-paths";
|
||||||
|
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
|
||||||
|
import { findComposite } from "../../common/utils/composite/find-composite/find-composite";
|
||||||
|
import shouldStartHiddenInjectable from "../../main/electron-app/features/should-start-hidden.injectable";
|
||||||
|
import fsInjectable from "../../common/fs/fs.injectable";
|
||||||
|
import joinPathsInjectable from "../../common/path/join-paths.injectable";
|
||||||
|
import homeDirectoryPathInjectable from "../../common/os/home-directory-path.injectable";
|
||||||
|
import type { ClusterId } from "../../common/cluster-types";
|
||||||
|
import getClusterByIdInjectable from "../../common/cluster-store/get-by-id.injectable";
|
||||||
|
import createClusterInjectable from "../../main/create-cluster/create-cluster.injectable";
|
||||||
|
import { onLoadOfApplicationInjectionToken } from "../../main/start-main-application/runnable-tokens/on-load-of-application-injection-token";
|
||||||
|
import currentLocationInjectable from "../../renderer/api/current-location.injectable";
|
||||||
|
import lensProxyPortInjectable from "../../main/lens-proxy/lens-proxy-port.injectable";
|
||||||
|
import { beforeQuitOfBackEndInjectionToken } from "../../main/start-main-application/runnable-tokens/before-quit-of-back-end-injection-token";
|
||||||
|
import { KubernetesCluster, LensKubernetesClusterStatus } from "../../common/catalog-entities";
|
||||||
|
import listNamespacesForInjectable from "../../common/cluster/list-namespaces.injectable";
|
||||||
|
import requestApiResourcesInjectable from "../../main/cluster/request-api-resources.injectable";
|
||||||
|
import requestNamespaceListPermissionsForInjectable from "../../common/cluster/request-namespace-list-permissions.injectable";
|
||||||
|
import { beforeQuitOfFrontEndInjectionToken } from "../../main/start-main-application/runnable-tokens/before-quit-of-front-end-injection-token";
|
||||||
|
import { runManySyncFor } from "../../common/runnable/run-many-sync-for";
|
||||||
|
import type { MemoryHistory } from "history";
|
||||||
|
import { object } from "../../common/utils";
|
||||||
|
import catalogEntityRegistryInjectable from "../../renderer/api/catalog/entity/registry.injectable";
|
||||||
|
import { testUsingFakeTime } from "../../common/test-utils/use-fake-time";
|
||||||
|
|
||||||
|
type Callback = (di: DiContainer) => void | Promise<void>;
|
||||||
|
|
||||||
|
type LensWindowWithHelpers = LensWindow & { rendered: RenderResult; di: DiContainer };
|
||||||
|
|
||||||
|
const createNamespacesFor = (namespaces: Set<string>): Namespace[] => (
|
||||||
|
Array.from(namespaces, (namespace) => new Namespace({
|
||||||
|
apiVersion: "v1",
|
||||||
|
kind: "Namespace",
|
||||||
|
metadata: {
|
||||||
|
name: namespace,
|
||||||
|
resourceVersion: "1",
|
||||||
|
selfLink: `/api/v1/namespaces/${namespace}`,
|
||||||
|
uid: `namespace-${namespace}`,
|
||||||
|
},
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
|
||||||
|
export interface ApplicationBuilder {
|
||||||
|
mainDi: DiContainer;
|
||||||
|
setEnvironmentToClusterFrame: () => ApplicationBuilder;
|
||||||
|
|
||||||
|
extensions: {
|
||||||
|
enable: (...extensions: FakeExtensionOptions[]) => void;
|
||||||
|
disable: (...extensions: FakeExtensionOptions[]) => void;
|
||||||
|
|
||||||
|
get: (id: string) => {
|
||||||
|
main: LensMainExtension;
|
||||||
|
|
||||||
|
applicationWindows: Record<string, LensRendererExtension> & {
|
||||||
|
only: LensRendererExtension;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
applicationWindow: {
|
||||||
|
closeAll: () => void;
|
||||||
|
only: LensWindowWithHelpers;
|
||||||
|
get: (id: string) => LensWindowWithHelpers;
|
||||||
|
getAll: () => LensWindowWithHelpers[];
|
||||||
|
create: (id: string) => LensWindowWithHelpers;
|
||||||
|
};
|
||||||
|
|
||||||
|
allowKubeResource: (resourceName: KubeApiResourceDescriptor) => ApplicationBuilder;
|
||||||
|
beforeApplicationStart: (callback: Callback) => ApplicationBuilder;
|
||||||
|
afterApplicationStart: (callback: Callback) => ApplicationBuilder;
|
||||||
|
beforeWindowStart: (callback: Callback) => ApplicationBuilder;
|
||||||
|
afterWindowStart: (callback: Callback) => ApplicationBuilder;
|
||||||
|
|
||||||
|
startHidden: () => Promise<void>;
|
||||||
|
render: () => Promise<RenderResult>;
|
||||||
|
quit: () => void;
|
||||||
|
|
||||||
|
tray: {
|
||||||
|
click: (id: string) => Promise<void>;
|
||||||
|
get: (id: string) => MinimalTrayMenuItem | null;
|
||||||
|
getIconPath: () => string;
|
||||||
|
};
|
||||||
|
|
||||||
|
applicationMenu: {
|
||||||
|
click: (...path: string[]) => void;
|
||||||
|
items: string[][];
|
||||||
|
};
|
||||||
|
preferences: {
|
||||||
|
close: () => void;
|
||||||
|
navigate: () => void;
|
||||||
|
navigateTo: (route: Route<any>, params: Partial<NavigateToRouteOptions<any>>) => void;
|
||||||
|
navigation: {
|
||||||
|
click: (id: string) => void;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
namespaces: {
|
||||||
|
add: (namespace: string) => void;
|
||||||
|
select: (namespace: string) => void;
|
||||||
|
};
|
||||||
|
helmCharts: {
|
||||||
|
navigate: NavigateToHelmCharts;
|
||||||
|
};
|
||||||
|
navigateWith: (token: Injectable<() => void, any, void>) => void;
|
||||||
|
select: {
|
||||||
|
openMenu: (id: string) => { selectOption: (labelText: string) => void };
|
||||||
|
selectOption: (menuId: string, labelText: string) => void;
|
||||||
|
getValue: (menuId: string) => string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Environment {
|
||||||
|
RootComponent: React.ElementType;
|
||||||
|
onAllowKubeResource: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const setupInitializingApplicationBuilder = (init: (builder: ApplicationBuilder) => void): void => {
|
||||||
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
const mainDi = getMainDi({
|
||||||
|
doGeneralOverrides: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
runInAction(() => {
|
||||||
|
mainDi.register(mainExtensionsStateInjectable);
|
||||||
|
});
|
||||||
|
|
||||||
|
testUsingFakeTime();
|
||||||
|
|
||||||
|
const { overrideForWindow, sendToWindow } = overrideChannels(mainDi);
|
||||||
|
|
||||||
|
const beforeApplicationStartCallbacks: Callback[] = [];
|
||||||
|
const afterApplicationStartCallbacks: Callback[] = [];
|
||||||
|
const beforeWindowStartCallbacks: Callback[] = [];
|
||||||
|
const afterWindowStartCallbacks: Callback[] = [];
|
||||||
|
|
||||||
|
const overrideFsWithFakes = getOverrideFsWithFakes();
|
||||||
|
|
||||||
|
overrideFsWithFakes(mainDi);
|
||||||
|
|
||||||
|
// Set up ~/.kube as existing as a folder
|
||||||
|
{
|
||||||
|
const { ensureDirSync } = mainDi.inject(fsInjectable);
|
||||||
|
const joinPaths = mainDi.inject(joinPathsInjectable);
|
||||||
|
const homeDirectoryPath = mainDi.inject(homeDirectoryPathInjectable);
|
||||||
|
|
||||||
|
ensureDirSync(joinPaths(homeDirectoryPath, ".kube"));
|
||||||
|
}
|
||||||
|
|
||||||
|
let environment = environments.application;
|
||||||
|
|
||||||
|
mainDi.override(mainExtensionsInjectable, (di) => {
|
||||||
|
const mainExtensionsState = di.inject(mainExtensionsStateInjectable);
|
||||||
|
|
||||||
|
return computed(() =>
|
||||||
|
[...mainExtensionsState.values()],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
let trayMenuIconPath: string;
|
||||||
|
|
||||||
|
const traySetMenuItemsMock = jest.fn<any, [MinimalTrayMenuItem[]]>();
|
||||||
|
|
||||||
|
mainDi.override(electronTrayInjectable, () => ({
|
||||||
|
start: () => {},
|
||||||
|
stop: () => {},
|
||||||
|
setMenuItems: traySetMenuItemsMock,
|
||||||
|
setIconPath: (path) => {
|
||||||
|
trayMenuIconPath = path;
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
|
const allowedResourcesState = observable.set<string>();
|
||||||
|
const windowHelpers = new Map<string, { di: DiContainer; getRendered: () => RenderResult }>();
|
||||||
|
|
||||||
|
const createElectronWindowFake: CreateElectronWindow = (configuration) => {
|
||||||
|
const windowId = configuration.id;
|
||||||
|
|
||||||
|
const windowDi = getRendererDi({ doGeneralOverrides: true });
|
||||||
|
|
||||||
|
overrideForWindow(windowDi, windowId);
|
||||||
|
overrideFsWithFakes(windowDi);
|
||||||
|
|
||||||
|
runInAction(() => {
|
||||||
|
windowDi.register(rendererExtensionsStateInjectable);
|
||||||
|
});
|
||||||
|
|
||||||
|
windowDi.override(
|
||||||
|
currentlyInClusterFrameInjectable,
|
||||||
|
() => environment === environments.clusterFrame,
|
||||||
|
);
|
||||||
|
|
||||||
|
windowDi.override(rendererExtensionsInjectable, (di) => {
|
||||||
|
const rendererExtensionState = di.inject(rendererExtensionsStateInjectable);
|
||||||
|
|
||||||
|
return computed(() => [...rendererExtensionState.values()]);
|
||||||
|
});
|
||||||
|
|
||||||
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
windowHelpers.set(windowId, { di: windowDi, getRendered: () => rendered });
|
||||||
|
|
||||||
|
return {
|
||||||
|
show: () => {},
|
||||||
|
close: () => {},
|
||||||
|
loadFile: async () => {},
|
||||||
|
loadUrl: async () => {
|
||||||
|
for (const callback of beforeWindowStartCallbacks) {
|
||||||
|
await callback(windowDi);
|
||||||
|
}
|
||||||
|
|
||||||
|
const startFrame = windowDi.inject(startFrameInjectable);
|
||||||
|
|
||||||
|
await startFrame();
|
||||||
|
|
||||||
|
for (const callback of afterWindowStartCallbacks) {
|
||||||
|
await callback(windowDi);
|
||||||
|
}
|
||||||
|
|
||||||
|
const history = windowDi.inject(historyInjectable);
|
||||||
|
const render = renderFor(windowDi);
|
||||||
|
|
||||||
|
rendered = render((
|
||||||
|
<>
|
||||||
|
<div id="terminal-init" />
|
||||||
|
<Router history={history}>
|
||||||
|
<environment.RootComponent />
|
||||||
|
</Router>
|
||||||
|
</>
|
||||||
|
));
|
||||||
|
},
|
||||||
|
send: (arg) => {
|
||||||
|
sendToWindow(windowId, arg);
|
||||||
|
},
|
||||||
|
canGoBack: () => {
|
||||||
|
const history = windowDi.inject(historyInjectable) as MemoryHistory;
|
||||||
|
|
||||||
|
return history.canGo(-1);
|
||||||
|
},
|
||||||
|
canGoForward: () => {
|
||||||
|
const history = windowDi.inject(historyInjectable) as MemoryHistory;
|
||||||
|
|
||||||
|
return history.canGo(1);
|
||||||
|
},
|
||||||
|
reload: () => {
|
||||||
|
throw new Error("Tried to reload application window which is not implemented yet.");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mainDi.override(createElectronWindowInjectable, () => createElectronWindowFake);
|
||||||
|
|
||||||
|
let applicationHasStarted = false;
|
||||||
|
|
||||||
|
const namespaces = observable.set<string>();
|
||||||
|
const namespaceItems = observable.array<Namespace>();
|
||||||
|
const selectedNamespaces = observable.set<string>();
|
||||||
|
const clusters = observable.map<ClusterId, Cluster>();
|
||||||
|
const clusterId = "some-cluster-id";
|
||||||
|
const clusterEntity = new KubernetesCluster({
|
||||||
|
metadata: {
|
||||||
|
labels: {},
|
||||||
|
name: "some-context-name",
|
||||||
|
uid: clusterId,
|
||||||
|
},
|
||||||
|
spec: {
|
||||||
|
kubeconfigContext: "some-context-name",
|
||||||
|
kubeconfigPath: "/some-kube-config-path",
|
||||||
|
},
|
||||||
|
status: {
|
||||||
|
phase: LensKubernetesClusterStatus.DISCONNECTED,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const startMainApplication = mainDi.inject(startMainApplicationInjectable);
|
||||||
|
|
||||||
|
const startApplication = async ({ shouldStartHidden }: { shouldStartHidden: boolean }) => {
|
||||||
|
for (const callback of beforeApplicationStartCallbacks) {
|
||||||
|
await callback(mainDi);
|
||||||
|
}
|
||||||
|
|
||||||
|
mainDi.override(shouldStartHiddenInjectable, () => shouldStartHidden);
|
||||||
|
await startMainApplication();
|
||||||
|
|
||||||
|
for (const callback of afterApplicationStartCallbacks) {
|
||||||
|
await callback(mainDi);
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationHasStarted = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
mainDi.override(getClusterByIdInjectable, () => (id) => clusters.get(id));
|
||||||
|
|
||||||
|
beforeWindowStartCallbacks.push((windowDi) => {
|
||||||
|
windowDi.override(getClusterByIdInjectable, () => (id) => clusters.get(id));
|
||||||
|
windowDi.override(currentLocationInjectable, () => ({
|
||||||
|
hostname: "localhost",
|
||||||
|
port: `${mainDi.inject(lensProxyPortInjectable).get()}`,
|
||||||
|
protocol: "http",
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
afterWindowStartCallbacks.push((windowDi) => {
|
||||||
|
windowDi.inject(catalogEntityRegistryInjectable).updateItems([clusterEntity]);
|
||||||
|
});
|
||||||
|
|
||||||
|
mainDi.override(listNamespacesForInjectable, () => () => async () => [...namespaces]);
|
||||||
|
mainDi.override(requestApiResourcesInjectable, () => async () => (
|
||||||
|
object.entries(apiResourceRecord)
|
||||||
|
.map(([apiName, data]) => ({ apiName, ...data }))
|
||||||
|
));
|
||||||
|
mainDi.override(requestNamespaceListPermissionsForInjectable, () => () => async () => (resource) => allowedResourcesState.has(formatKubeApiResource(resource)));
|
||||||
|
|
||||||
|
|
||||||
|
runInAction(() => {
|
||||||
|
mainDi.register(getInjectable({
|
||||||
|
id: "create-fake-cluster",
|
||||||
|
instantiate: (di) => ({
|
||||||
|
id: "create-fake-cluster",
|
||||||
|
run: () => {
|
||||||
|
const createCluster = di.inject(createClusterInjectable);
|
||||||
|
const cluster = createCluster({
|
||||||
|
contextName: "some-context-name",
|
||||||
|
id: clusterId,
|
||||||
|
kubeConfigPath: "/some-kube-config-path",
|
||||||
|
}, {
|
||||||
|
clusterServerUrl: "https://some-url.com:8797",
|
||||||
|
});
|
||||||
|
|
||||||
|
clusters.set(clusterId, cluster);
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
injectionToken: onLoadOfApplicationInjectionToken,
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
builder = {
|
||||||
|
mainDi,
|
||||||
|
applicationWindow: {
|
||||||
|
closeAll: () => {
|
||||||
|
const closeAll = mainDi.inject(closeAllWindowsInjectable);
|
||||||
|
|
||||||
|
closeAll();
|
||||||
|
|
||||||
|
document.documentElement.innerHTML = "";
|
||||||
|
},
|
||||||
|
|
||||||
|
get only() {
|
||||||
|
const applicationWindows = builder.applicationWindow.getAll();
|
||||||
|
|
||||||
|
if (applicationWindows.length > 1) {
|
||||||
|
throw new Error(
|
||||||
|
"Tried to get only application window when there are multiple windows.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const applicationWindow = first(applicationWindows);
|
||||||
|
|
||||||
|
if (!applicationWindow) {
|
||||||
|
throw new Error(
|
||||||
|
"Tried to get only application window when there are no windows.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return applicationWindow;
|
||||||
|
},
|
||||||
|
|
||||||
|
getAll: () =>
|
||||||
|
mainDi
|
||||||
|
.injectMany(applicationWindowInjectionToken)
|
||||||
|
.map(toWindowWithHelpersFor(windowHelpers)),
|
||||||
|
|
||||||
|
get: (id) => {
|
||||||
|
const applicationWindow = builder.applicationWindow
|
||||||
|
.getAll()
|
||||||
|
.find((window) => window.id === id);
|
||||||
|
|
||||||
|
if (!applicationWindow) {
|
||||||
|
throw new Error(`Tried to get application window with ID "${id}" but it was not found.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return applicationWindow;
|
||||||
|
},
|
||||||
|
|
||||||
|
create: (id) => {
|
||||||
|
const createApplicationWindow = mainDi.inject(createApplicationWindowInjectable);
|
||||||
|
|
||||||
|
createApplicationWindow(id);
|
||||||
|
|
||||||
|
return builder.applicationWindow.get(id);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
namespaces: {
|
||||||
|
add: action((namespace) => {
|
||||||
|
namespaces.add(namespace);
|
||||||
|
namespaceItems.replace(createNamespacesFor(namespaces));
|
||||||
|
}),
|
||||||
|
select: action((namespace) => selectedNamespaces.add(namespace)),
|
||||||
|
},
|
||||||
|
applicationMenu: {
|
||||||
|
get items() {
|
||||||
|
const composite = mainDi.inject(
|
||||||
|
applicationMenuItemCompositeInjectable,
|
||||||
|
).get();
|
||||||
|
|
||||||
|
return getCompositePaths(composite);
|
||||||
|
},
|
||||||
|
|
||||||
|
click: (...path: string[]) => {
|
||||||
|
const composite = mainDi.inject(
|
||||||
|
applicationMenuItemCompositeInjectable,
|
||||||
|
).get();
|
||||||
|
|
||||||
|
const clickableMenuItem = findComposite(...path)(composite).value;
|
||||||
|
|
||||||
|
if(clickableMenuItem.kind === "clickable-menu-item") {
|
||||||
|
// Todo: prevent leaking of Electron
|
||||||
|
(clickableMenuItem.onClick as any)();
|
||||||
|
} else {
|
||||||
|
throw new Error(`Tried to trigger clicking of an application menu item, but item at path '${path.join(" -> ")}' isn't clickable.`);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
tray: {
|
||||||
|
get: (id: string) => {
|
||||||
|
const lastCall = last(traySetMenuItemsMock.mock.calls);
|
||||||
|
|
||||||
|
assert(lastCall);
|
||||||
|
|
||||||
|
return lastCall[0].find(matches({ id })) ?? null;
|
||||||
|
},
|
||||||
|
|
||||||
|
getIconPath: () => trayMenuIconPath,
|
||||||
|
|
||||||
|
click: async (id: string) => {
|
||||||
|
const lastCall = last(traySetMenuItemsMock.mock.calls);
|
||||||
|
|
||||||
|
assert(lastCall);
|
||||||
|
|
||||||
|
const trayMenuItems = lastCall[0];
|
||||||
|
|
||||||
|
const menuItem = trayMenuItems.find(matches({ id })) ?? null;
|
||||||
|
|
||||||
|
if (!menuItem) {
|
||||||
|
const availableIds = pipeline(
|
||||||
|
trayMenuItems,
|
||||||
|
filter(item => !!item.click),
|
||||||
|
map(item => item.id),
|
||||||
|
join(", "),
|
||||||
|
);
|
||||||
|
|
||||||
|
throw new Error(`Tried to click tray menu item with ID ${id} which does not exist. Available IDs are: "${availableIds}"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!menuItem.enabled) {
|
||||||
|
throw new Error(`Tried to click tray menu item with ID ${id} which is disabled.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
await menuItem.click?.();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
preferences: {
|
||||||
|
close: () => {
|
||||||
|
const rendered = builder.applicationWindow.only.rendered;
|
||||||
|
|
||||||
|
const link = rendered.getByTestId("close-preferences");
|
||||||
|
|
||||||
|
fireEvent.click(link);
|
||||||
|
},
|
||||||
|
|
||||||
|
navigate: () => {
|
||||||
|
const windowDi = builder.applicationWindow.only.di;
|
||||||
|
|
||||||
|
const navigateToPreferences = windowDi.inject(
|
||||||
|
navigateToPreferencesInjectable,
|
||||||
|
);
|
||||||
|
|
||||||
|
navigateToPreferences();
|
||||||
|
},
|
||||||
|
|
||||||
|
navigateTo: (route: Route<any>, params: Partial<NavigateToRouteOptions<any>>) => {
|
||||||
|
const windowDi = builder.applicationWindow.only.di;
|
||||||
|
|
||||||
|
const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken);
|
||||||
|
|
||||||
|
navigateToRoute(route, params);
|
||||||
|
},
|
||||||
|
|
||||||
|
navigation: {
|
||||||
|
click: (pathId: string) => {
|
||||||
|
const { rendered } = builder.applicationWindow.only;
|
||||||
|
|
||||||
|
const discover = discoverFor(() => rendered);
|
||||||
|
|
||||||
|
const { discovered: link } = discover.getSingleElement(
|
||||||
|
"preference-tab-link",
|
||||||
|
pathId,
|
||||||
|
);
|
||||||
|
|
||||||
|
fireEvent.click(link);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
helmCharts: {
|
||||||
|
navigate: (parameters) => {
|
||||||
|
const windowDi = builder.applicationWindow.only.di;
|
||||||
|
|
||||||
|
const navigateToHelmCharts = windowDi.inject(
|
||||||
|
navigateToHelmChartsInjectable,
|
||||||
|
);
|
||||||
|
|
||||||
|
navigateToHelmCharts(parameters);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
navigateWith: (token) => {
|
||||||
|
const windowDi = builder.applicationWindow.only.di;
|
||||||
|
const navigate = windowDi.inject(token);
|
||||||
|
|
||||||
|
navigate();
|
||||||
|
},
|
||||||
|
|
||||||
|
setEnvironmentToClusterFrame: () => {
|
||||||
|
environment = environments.clusterFrame;
|
||||||
|
|
||||||
|
builder.beforeWindowStart((windowDi) => {
|
||||||
|
windowDi.override(hostedClusterIdInjectable, () => clusterId);
|
||||||
|
|
||||||
|
// TODO: Figure out a way to remove this stub.
|
||||||
|
windowDi.override(namespaceStoreInjectable, () => ({
|
||||||
|
isLoaded: true,
|
||||||
|
get contextNamespaces() {
|
||||||
|
return Array.from(selectedNamespaces);
|
||||||
|
},
|
||||||
|
get allowedNamespaces() {
|
||||||
|
return Array.from(namespaces);
|
||||||
|
},
|
||||||
|
contextItems: namespaceItems,
|
||||||
|
api: windowDi.inject(namespaceApiInjectable),
|
||||||
|
items: namespaceItems,
|
||||||
|
selectNamespaces: () => {},
|
||||||
|
selectSingle: () => {},
|
||||||
|
getByPath: () => undefined,
|
||||||
|
pickOnlySelected: () => [],
|
||||||
|
isSelectedAll: () => false,
|
||||||
|
getTotalCount: () => namespaceItems.length,
|
||||||
|
} as Partial<NamespaceStore> as NamespaceStore));
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.afterWindowStart(windowDi => {
|
||||||
|
windowDi.inject(catalogEntityRegistryInjectable).activeEntity = clusterEntity;
|
||||||
|
});
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
},
|
||||||
|
|
||||||
|
extensions: {
|
||||||
|
get: (id: string) => {
|
||||||
|
const windowInstances = pipeline(
|
||||||
|
builder.applicationWindow.getAll(),
|
||||||
|
|
||||||
|
map((window): [string, LensRendererExtension] => [
|
||||||
|
window.id,
|
||||||
|
findExtensionInstance(window.di, rendererExtensionsInjectable, id),
|
||||||
|
]),
|
||||||
|
|
||||||
|
items => Object.fromEntries(items),
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
main: findExtensionInstance(mainDi, mainExtensionsInjectable, id),
|
||||||
|
|
||||||
|
applicationWindows: {
|
||||||
|
get only() {
|
||||||
|
return findExtensionInstance(
|
||||||
|
builder.applicationWindow.only.di,
|
||||||
|
rendererExtensionsInjectable,
|
||||||
|
id,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
...windowInstances,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
enable: (...extensions) => {
|
||||||
|
builder.afterWindowStart((windowDi) => {
|
||||||
|
const enabledExtension = enableExtensionFor(windowDi, rendererExtensionsStateInjectable);
|
||||||
|
|
||||||
|
runInAction(() => {
|
||||||
|
for (const extension of extensions) {
|
||||||
|
enabledExtension(getExtensionFakeForRenderer(
|
||||||
|
windowDi,
|
||||||
|
extension.id,
|
||||||
|
extension.name,
|
||||||
|
extension.rendererOptions ?? {},
|
||||||
|
));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.afterApplicationStart((mainDi) => {
|
||||||
|
const enabledExtension = enableExtensionFor(mainDi, mainExtensionsStateInjectable);
|
||||||
|
|
||||||
|
runInAction(() => {
|
||||||
|
for (const extension of extensions) {
|
||||||
|
enabledExtension(getExtensionFakeForMain(
|
||||||
|
mainDi,
|
||||||
|
extension.id,
|
||||||
|
extension.name,
|
||||||
|
extension.mainOptions ?? {},
|
||||||
|
));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
disable: (...extensions) => {
|
||||||
|
builder.afterWindowStart(windowDi => {
|
||||||
|
extensions
|
||||||
|
.map((ext) => ext.id)
|
||||||
|
.forEach(
|
||||||
|
disableExtensionFor(windowDi, rendererExtensionsStateInjectable),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.afterApplicationStart(mainDi => {
|
||||||
|
extensions
|
||||||
|
.map((ext) => ext.id)
|
||||||
|
.forEach(
|
||||||
|
disableExtensionFor(mainDi, mainExtensionsStateInjectable),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
allowKubeResource: (resource) => {
|
||||||
|
environment.onAllowKubeResource();
|
||||||
|
|
||||||
|
runInAction(() => {
|
||||||
|
allowedResourcesState.add(formatKubeApiResource(resource));
|
||||||
|
});
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeApplicationStart(callback) {
|
||||||
|
if (applicationHasStarted) {
|
||||||
|
callback(mainDi);
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeApplicationStartCallbacks.push(callback);
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
},
|
||||||
|
|
||||||
|
afterApplicationStart(callback) {
|
||||||
|
if (applicationHasStarted) {
|
||||||
|
callback(mainDi);
|
||||||
|
}
|
||||||
|
|
||||||
|
afterApplicationStartCallbacks.push(callback);
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeWindowStart(callback) {
|
||||||
|
const alreadyRenderedWindows = builder.applicationWindow.getAll();
|
||||||
|
|
||||||
|
alreadyRenderedWindows.forEach((window) => {
|
||||||
|
callback(window.di);
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeWindowStartCallbacks.push(callback);
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
},
|
||||||
|
|
||||||
|
afterWindowStart(callback) {
|
||||||
|
const alreadyRenderedWindows = builder.applicationWindow.getAll();
|
||||||
|
|
||||||
|
alreadyRenderedWindows.forEach((window) => {
|
||||||
|
callback(window.di);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterWindowStartCallbacks.push(callback);
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
},
|
||||||
|
|
||||||
|
startHidden: async () => {
|
||||||
|
await startApplication({ shouldStartHidden: true });
|
||||||
|
},
|
||||||
|
|
||||||
|
quit() {
|
||||||
|
const runManySync = runManySyncFor(builder.mainDi);
|
||||||
|
const beforeQuitOfFrontEnd = runManySync(beforeQuitOfFrontEndInjectionToken);
|
||||||
|
const beforeQuitOfBackEnd = runManySync(beforeQuitOfBackEndInjectionToken);
|
||||||
|
|
||||||
|
beforeQuitOfFrontEnd();
|
||||||
|
beforeQuitOfBackEnd();
|
||||||
|
},
|
||||||
|
|
||||||
|
async render() {
|
||||||
|
await startApplication({ shouldStartHidden: false });
|
||||||
|
|
||||||
|
return builder
|
||||||
|
.applicationWindow
|
||||||
|
.get("first-application-window")
|
||||||
|
.rendered;
|
||||||
|
},
|
||||||
|
|
||||||
|
select: {
|
||||||
|
openMenu: (menuId) => {
|
||||||
|
const rendered = builder.applicationWindow.only.rendered;
|
||||||
|
|
||||||
|
const select = rendered.baseElement.querySelector<HTMLElement>(
|
||||||
|
`#${menuId}`,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert(select, `Could not find select with ID "${menuId}"`);
|
||||||
|
|
||||||
|
openMenu(select);
|
||||||
|
|
||||||
|
return {
|
||||||
|
selectOption: selectOptionFor(builder, menuId),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
selectOption: (menuId, labelText) => selectOptionFor(builder, menuId)(labelText),
|
||||||
|
|
||||||
|
getValue: (menuId) => {
|
||||||
|
const rendered = builder.applicationWindow.only.rendered;
|
||||||
|
|
||||||
|
const select = rendered.baseElement.querySelector<HTMLInputElement>(
|
||||||
|
`#${menuId}`,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert(select, `Could not find select with ID "${menuId}"`);
|
||||||
|
|
||||||
|
const controlElement = select.closest(".Select__control");
|
||||||
|
|
||||||
|
assert(controlElement, `Could not find select value for menu with ID "${menuId}"`);
|
||||||
|
|
||||||
|
return controlElement.textContent || "";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
init(builder);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
builder.quit();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const rendererExtensionsStateInjectable = getInjectable({
|
||||||
|
id: "renderer-extensions-state",
|
||||||
|
instantiate: () => observable.map<string, LensRendererExtension>(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const mainExtensionsStateInjectable = getInjectable({
|
||||||
|
id: "main-extensions-state",
|
||||||
|
instantiate: () => observable.map<string, LensMainExtension>(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const findExtensionInstance = <T extends LensExtension> (di: DiContainer, injectable: Injectable<IComputedValue<T[]>, any, any>, id: string) => {
|
||||||
|
const instance = di.inject(injectable).get().find(ext => ext.id === id);
|
||||||
|
|
||||||
|
if (!instance) {
|
||||||
|
throw new Error(`Tried to get extension with ID ${id}, but it didn't exist`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
};
|
||||||
|
|
||||||
|
type ApplicationWindowHelpers = Map<string, { di: DiContainer; getRendered: () => RenderResult }>;
|
||||||
|
|
||||||
|
const toWindowWithHelpersFor =
|
||||||
|
(windowHelpers: ApplicationWindowHelpers) => (applicationWindow: LensWindow) => ({
|
||||||
|
...applicationWindow,
|
||||||
|
|
||||||
|
get rendered() {
|
||||||
|
const helpers = windowHelpers.get(applicationWindow.id);
|
||||||
|
|
||||||
|
if (!helpers) {
|
||||||
|
throw new Error(
|
||||||
|
`Tried to get rendered for application window "${applicationWindow.id}" before it was started.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return helpers.getRendered();
|
||||||
|
},
|
||||||
|
|
||||||
|
get di() {
|
||||||
|
const helpers = windowHelpers.get(applicationWindow.id);
|
||||||
|
|
||||||
|
if (!helpers) {
|
||||||
|
throw new Error(
|
||||||
|
`Tried to get di for application window "${applicationWindow.id}" before it was started.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return helpers.di;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const environments = {
|
||||||
|
application: {
|
||||||
|
RootComponent: RootFrame,
|
||||||
|
|
||||||
|
onAllowKubeResource: () => {
|
||||||
|
throw new Error(
|
||||||
|
"Tried to allow kube resource when environment is not cluster frame.",
|
||||||
|
);
|
||||||
|
},
|
||||||
|
} as Environment,
|
||||||
|
|
||||||
|
clusterFrame: {
|
||||||
|
RootComponent: ClusterFrame,
|
||||||
|
onAllowKubeResource: () => {},
|
||||||
|
} as Environment,
|
||||||
|
};
|
||||||
|
|
||||||
|
const selectOptionFor = (builder: ApplicationBuilder, menuId: string) => (labelText: string) => {
|
||||||
|
const rendered = builder.applicationWindow.only.rendered;
|
||||||
|
|
||||||
|
const menuOptions = rendered.baseElement.querySelector<HTMLElement>(
|
||||||
|
`.${menuId}-options`,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert(menuOptions, `Could not find select options for menu with ID "${menuId}"`);
|
||||||
|
|
||||||
|
const option = queryByText(menuOptions, labelText);
|
||||||
|
|
||||||
|
assert(option, `Could not find select option with label "${labelText}" for menu with ID "${menuId}"`);
|
||||||
|
|
||||||
|
userEvent.click(option);
|
||||||
|
};
|
||||||
|
|
||||||
|
const enableExtensionFor = (
|
||||||
|
di: DiContainer,
|
||||||
|
stateInjectable: Injectable<ObservableMap<string, any>, any, any>,
|
||||||
|
) => {
|
||||||
|
const extensionState = di.inject(stateInjectable);
|
||||||
|
|
||||||
|
return (extensionInstance: LensExtension) => {
|
||||||
|
const extension = di.inject(extensionInjectable, extensionInstance);
|
||||||
|
|
||||||
|
runInAction(() => {
|
||||||
|
extension.register();
|
||||||
|
extensionState.set(extensionInstance.id, extensionInstance);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const disableExtensionFor =
|
||||||
|
(
|
||||||
|
di: DiContainer,
|
||||||
|
stateInjectable: Injectable<ObservableMap<string, any>, unknown, void>,
|
||||||
|
) =>
|
||||||
|
(id: string) => {
|
||||||
|
const extensionsState = di.inject(stateInjectable);
|
||||||
|
const instance = extensionsState.get(id);
|
||||||
|
|
||||||
|
if (!instance) {
|
||||||
|
throw new Error(
|
||||||
|
`Tried to disable extension with ID "${id}", but it wasn't enabled`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const extension = di.inject(extensionInjectable, instance);
|
||||||
|
|
||||||
|
runInAction(() => {
|
||||||
|
extension.deregister();
|
||||||
|
extensionsState.delete(id);
|
||||||
|
});
|
||||||
|
};
|
||||||
@ -5,18 +5,18 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
|
|
||||||
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../test-utils/application-builder";
|
||||||
import type { FakeExtensionOptions } from "../../../renderer/components/test-utils/get-extension-fake";
|
import type { FakeExtensionOptions } from "../../../renderer/components/test-utils/get-extension-fake";
|
||||||
|
|
||||||
describe("extendability-using-extension-api", () => {
|
describe("extendability-using-extension-api", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
let applicationBuilder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
applicationBuilder = getApplicationBuilder();
|
rendered = await builder.render();
|
||||||
|
|
||||||
rendered = await applicationBuilder.render();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
@ -48,7 +48,7 @@ describe("extendability-using-extension-api", () => {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
applicationBuilder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
@ -61,7 +61,7 @@ describe("extendability-using-extension-api", () => {
|
|||||||
|
|
||||||
describe("when the extension is disabled", () => {
|
describe("when the extension is disabled", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
applicationBuilder.extensions.disable(testExtension);
|
builder.extensions.disable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
@ -98,7 +98,7 @@ describe("extendability-using-extension-api", () => {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
applicationBuilder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("renders without blowing up", () => {
|
it("renders without blowing up", () => {
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
||||||
import getRandomIdInjectable from "../../common/utils/get-random-id.injectable";
|
import getRandomIdInjectable from "../../common/utils/get-random-id.injectable";
|
||||||
import logErrorInjectable from "../../common/log-error.injectable";
|
import logErrorInjectable from "../../common/log-error.injectable";
|
||||||
@ -12,9 +12,9 @@ describe("clicking tray menu item originating from extension", () => {
|
|||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let logErrorMock: jest.Mock;
|
let logErrorMock: jest.Mock;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.beforeApplicationStart((mainDi) => {
|
builder.beforeApplicationStart((mainDi) => {
|
||||||
logErrorMock = jest.fn();
|
logErrorMock = jest.fn();
|
||||||
|
|
||||||
@ -25,10 +25,6 @@ describe("clicking tray menu item originating from extension", () => {
|
|||||||
await builder.render();
|
await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("when extension is enabled", () => {
|
describe("when extension is enabled", () => {
|
||||||
let someExtension: FakeExtensionOptions;
|
let someExtension: FakeExtensionOptions;
|
||||||
let clickMock: jest.Mock;
|
let clickMock: jest.Mock;
|
||||||
|
|||||||
@ -5,19 +5,20 @@
|
|||||||
import type { IObservableArray, IObservableValue } from "mobx";
|
import type { IObservableArray, IObservableValue } from "mobx";
|
||||||
import { computed, runInAction, observable } from "mobx";
|
import { computed, runInAction, observable } from "mobx";
|
||||||
import type { TrayMenuRegistration } from "../../main/tray/tray-menu-registration";
|
import type { TrayMenuRegistration } from "../../main/tray/tray-menu-registration";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
|
|
||||||
describe("preferences: extension adding tray items", () => {
|
describe("preferences: extension adding tray items", () => {
|
||||||
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
describe("when extension with tray items are statically defined", () => {
|
describe("when extension with tray items are statically defined", () => {
|
||||||
let builder: ApplicationBuilder;
|
|
||||||
let someObservableForVisibility: IObservableValue<boolean>;
|
let someObservableForVisibility: IObservableValue<boolean>;
|
||||||
let someObservableForEnabled: IObservableValue<boolean>;
|
let someObservableForEnabled: IObservableValue<boolean>;
|
||||||
let someObservableLabel: IObservableValue<string>;
|
let someObservableLabel: IObservableValue<string>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
await builder.render();
|
await builder.render();
|
||||||
|
|
||||||
builder.preferences.navigate();
|
builder.preferences.navigate();
|
||||||
@ -85,10 +86,6 @@ describe("preferences: extension adding tray items", () => {
|
|||||||
builder.extensions.enable(testExtension);
|
builder.extensions.enable(testExtension);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given controlled label", () => {
|
describe("given controlled label", () => {
|
||||||
it("has the label", () => {
|
it("has the label", () => {
|
||||||
const item = builder.tray.get(
|
const item = builder.tray.get(
|
||||||
@ -197,12 +194,9 @@ describe("preferences: extension adding tray items", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("when extension with tray items are dynamically defined", () => {
|
describe("when extension with tray items are dynamically defined", () => {
|
||||||
let builder: ApplicationBuilder;
|
|
||||||
let menuItems: IObservableArray<TrayMenuRegistration>;
|
let menuItems: IObservableArray<TrayMenuRegistration>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
await builder.render();
|
await builder.render();
|
||||||
|
|
||||||
builder.preferences.navigate();
|
builder.preferences.navigate();
|
||||||
|
|||||||
@ -2,16 +2,16 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import getRandomIdInjectable from "../../common/utils/get-random-id.injectable";
|
import getRandomIdInjectable from "../../common/utils/get-random-id.injectable";
|
||||||
|
|
||||||
describe("multiple separators originating from extension", () => {
|
describe("multiple separators originating from extension", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
beforeEach(async () => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
builder.beforeApplicationStart((mainDi) => {
|
builder.beforeApplicationStart((mainDi) => {
|
||||||
mainDi.unoverride(getRandomIdInjectable);
|
mainDi.unoverride(getRandomIdInjectable);
|
||||||
mainDi.permitSideEffects(getRandomIdInjectable);
|
mainDi.permitSideEffects(getRandomIdInjectable);
|
||||||
@ -20,10 +20,6 @@ describe("multiple separators originating from extension", () => {
|
|||||||
await builder.render();
|
await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("given extension with multiple separators, when extension is enabled, does not throw", () => {
|
it("given extension with multiple separators, when extension is enabled, does not throw", () => {
|
||||||
const someExtension = {
|
const someExtension = {
|
||||||
id: "some-extension-id",
|
id: "some-extension-id",
|
||||||
|
|||||||
@ -4,23 +4,19 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
|
|
||||||
describe("welcome - navigation using application menu", () => {
|
describe("welcome - navigation using application menu", () => {
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
rendered = await builder.render();
|
rendered = await builder.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("renders", () => {
|
it("renders", () => {
|
||||||
expect(rendered.container).toMatchSnapshot();
|
expect(rendered.container).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
|
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../test-utils/application-builder";
|
||||||
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
|
||||||
import welcomeRouteConfigInjectable from "../../common/front-end-routing/routes/welcome/welcome-route-config.injectable";
|
import welcomeRouteConfigInjectable from "../../common/front-end-routing/routes/welcome/welcome-route-config.injectable";
|
||||||
import welcomeRouteInjectable from "../../common/front-end-routing/routes/welcome/welcome-route.injectable";
|
import welcomeRouteInjectable from "../../common/front-end-routing/routes/welcome/welcome-route.injectable";
|
||||||
@ -18,13 +18,7 @@ describe("setting-welcome-page", () => {
|
|||||||
let rendered : RenderResult;
|
let rendered : RenderResult;
|
||||||
let welcomeRoute: Route;
|
let welcomeRoute: Route;
|
||||||
|
|
||||||
beforeEach(() => {
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
builder = getApplicationBuilder();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given configuration of welcome page route is the default", () => {
|
describe("given configuration of welcome page route is the default", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
|
|||||||
@ -10,19 +10,19 @@ import { computed, observable } from "mobx";
|
|||||||
import type { StatusBarItems } from "./status-bar-items.injectable";
|
import type { StatusBarItems } from "./status-bar-items.injectable";
|
||||||
import statusBarItemsInjectable from "./status-bar-items.injectable";
|
import statusBarItemsInjectable from "./status-bar-items.injectable";
|
||||||
import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable";
|
import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable";
|
||||||
import type { ApplicationBuilder } from "../test-utils/get-application-builder";
|
import type { ApplicationBuilder } from "../../../features/test-utils/application-builder";
|
||||||
import { getApplicationBuilder } from "../test-utils/get-application-builder";
|
import { setupInitializingApplicationBuilder } from "../../../features/test-utils/application-builder";
|
||||||
import getRandomIdInjectable from "../../../common/utils/get-random-id.injectable";
|
import getRandomIdInjectable from "../../../common/utils/get-random-id.injectable";
|
||||||
|
|
||||||
describe("<StatusBar />", () => {
|
describe("<StatusBar />", () => {
|
||||||
let statusBarItems: IObservableArray<any>;
|
let statusBarItems: IObservableArray<any>;
|
||||||
let builder: ApplicationBuilder;
|
let builder: ApplicationBuilder;
|
||||||
|
|
||||||
|
setupInitializingApplicationBuilder(b => builder = b);
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
statusBarItems = observable.array([]);
|
statusBarItems = observable.array([]);
|
||||||
|
|
||||||
builder = getApplicationBuilder();
|
|
||||||
|
|
||||||
builder.beforeWindowStart((windowDi) => {
|
builder.beforeWindowStart((windowDi) => {
|
||||||
windowDi.unoverride(getRandomIdInjectable);
|
windowDi.unoverride(getRandomIdInjectable);
|
||||||
windowDi.permitSideEffects(getRandomIdInjectable);
|
windowDi.permitSideEffects(getRandomIdInjectable);
|
||||||
@ -39,10 +39,6 @@ describe("<StatusBar />", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
builder.quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("renders w/o errors", async () => {
|
it("renders w/o errors", async () => {
|
||||||
const { container } = await builder.render();
|
const { container } = await builder.render();
|
||||||
|
|
||||||
|
|||||||
@ -1,932 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
||||||
*/
|
|
||||||
import type { LensRendererExtension } from "../../../extensions/lens-renderer-extension";
|
|
||||||
import rendererExtensionsInjectable from "../../../extensions/renderer-extensions.injectable";
|
|
||||||
import currentlyInClusterFrameInjectable from "../../routes/currently-in-cluster-frame.injectable";
|
|
||||||
import type { IComputedValue, ObservableMap } from "mobx";
|
|
||||||
import { action, computed, observable, runInAction } from "mobx";
|
|
||||||
import React from "react";
|
|
||||||
import { Router } from "react-router";
|
|
||||||
import type { RenderResult } from "@testing-library/react";
|
|
||||||
import { fireEvent, queryByText } from "@testing-library/react";
|
|
||||||
import type { KubeApiResourceDescriptor } from "../../../common/rbac";
|
|
||||||
import { apiResourceRecord, formatKubeApiResource } from "../../../common/rbac";
|
|
||||||
import type { DiContainer, Injectable } from "@ogre-tools/injectable";
|
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
|
||||||
import mainExtensionsInjectable from "../../../extensions/main-extensions.injectable";
|
|
||||||
import { pipeline } from "@ogre-tools/fp";
|
|
||||||
import { filter, first, join, last, map, matches } from "lodash/fp";
|
|
||||||
import navigateToPreferencesInjectable from "../../../features/preferences/common/navigate-to-preferences.injectable";
|
|
||||||
import type { NavigateToHelmCharts } from "../../../common/front-end-routing/routes/cluster/helm/charts/navigate-to-helm-charts.injectable";
|
|
||||||
import navigateToHelmChartsInjectable from "../../../common/front-end-routing/routes/cluster/helm/charts/navigate-to-helm-charts.injectable";
|
|
||||||
import type { Cluster } from "../../../common/cluster/cluster";
|
|
||||||
import startMainApplicationInjectable from "../../../main/start-main-application/start-main-application.injectable";
|
|
||||||
import startFrameInjectable from "../../start-frame/start-frame.injectable";
|
|
||||||
import type { NamespaceStore } from "../+namespaces/store";
|
|
||||||
import historyInjectable from "../../navigation/history.injectable";
|
|
||||||
import type { MinimalTrayMenuItem } from "../../../main/tray/electron-tray/electron-tray.injectable";
|
|
||||||
import electronTrayInjectable from "../../../main/tray/electron-tray/electron-tray.injectable";
|
|
||||||
import { getDiForUnitTesting as getRendererDi } from "../../getDiForUnitTesting";
|
|
||||||
import { getDiForUnitTesting as getMainDi } from "../../../main/getDiForUnitTesting";
|
|
||||||
import { overrideChannels } from "../../../test-utils/channel-fakes/override-channels";
|
|
||||||
import assert from "assert";
|
|
||||||
import { openMenu } from "react-select-event";
|
|
||||||
import userEvent from "@testing-library/user-event";
|
|
||||||
import type { Route } from "../../../common/front-end-routing/front-end-route-injection-token";
|
|
||||||
import type { NavigateToRouteOptions } from "../../../common/front-end-routing/navigate-to-route-injection-token";
|
|
||||||
import { navigateToRouteInjectionToken } from "../../../common/front-end-routing/navigate-to-route-injection-token";
|
|
||||||
import type { LensMainExtension } from "../../../extensions/lens-main-extension";
|
|
||||||
import type { LensExtension } from "../../../extensions/lens-extension";
|
|
||||||
import extensionInjectable from "../../../extensions/extension-loader/extension/extension.injectable";
|
|
||||||
import { renderFor } from "./renderFor";
|
|
||||||
import { RootFrame } from "../../frames/root-frame/root-frame";
|
|
||||||
import { ClusterFrame } from "../../frames/cluster-frame/cluster-frame";
|
|
||||||
import hostedClusterIdInjectable from "../../cluster-frame-context/hosted-cluster-id.injectable";
|
|
||||||
import namespaceStoreInjectable from "../+namespaces/store.injectable";
|
|
||||||
import createApplicationWindowInjectable from "../../../main/start-main-application/lens-window/application-window/create-application-window.injectable";
|
|
||||||
import type { CreateElectronWindow } from "../../../main/start-main-application/lens-window/application-window/create-electron-window.injectable";
|
|
||||||
import createElectronWindowInjectable from "../../../main/start-main-application/lens-window/application-window/create-electron-window.injectable";
|
|
||||||
import { applicationWindowInjectionToken } from "../../../main/start-main-application/lens-window/application-window/application-window-injection-token";
|
|
||||||
import closeAllWindowsInjectable from "../../../main/start-main-application/lens-window/hide-all-windows/close-all-windows.injectable";
|
|
||||||
import type { LensWindow } from "../../../main/start-main-application/lens-window/application-window/create-lens-window.injectable";
|
|
||||||
import type { FakeExtensionOptions } from "./get-extension-fake";
|
|
||||||
import { getExtensionFakeForMain, getExtensionFakeForRenderer } from "./get-extension-fake";
|
|
||||||
import namespaceApiInjectable from "../../../common/k8s-api/endpoints/namespace.api.injectable";
|
|
||||||
import { Namespace } from "../../../common/k8s-api/endpoints";
|
|
||||||
import { getOverrideFsWithFakes } from "../../../test-utils/override-fs-with-fakes";
|
|
||||||
import applicationMenuItemCompositeInjectable from "../../../features/application-menu/main/application-menu-item-composite.injectable";
|
|
||||||
import { getCompositePaths } from "../../../common/utils/composite/get-composite-paths/get-composite-paths";
|
|
||||||
import { discoverFor } from "./discovery-of-html-elements";
|
|
||||||
import { findComposite } from "../../../common/utils/composite/find-composite/find-composite";
|
|
||||||
import shouldStartHiddenInjectable from "../../../main/electron-app/features/should-start-hidden.injectable";
|
|
||||||
import fsInjectable from "../../../common/fs/fs.injectable";
|
|
||||||
import joinPathsInjectable from "../../../common/path/join-paths.injectable";
|
|
||||||
import homeDirectoryPathInjectable from "../../../common/os/home-directory-path.injectable";
|
|
||||||
import { testUsingFakeTime } from "../../../common/test-utils/use-fake-time";
|
|
||||||
import type { ClusterId } from "../../../common/cluster-types";
|
|
||||||
import getClusterByIdInjectable from "../../../common/cluster-store/get-by-id.injectable";
|
|
||||||
import createClusterInjectable from "../../../main/create-cluster/create-cluster.injectable";
|
|
||||||
import { onLoadOfApplicationInjectionToken } from "../../../main/start-main-application/runnable-tokens/on-load-of-application-injection-token";
|
|
||||||
import currentLocationInjectable from "../../api/current-location.injectable";
|
|
||||||
import lensProxyPortInjectable from "../../../main/lens-proxy/lens-proxy-port.injectable";
|
|
||||||
import { beforeQuitOfBackEndInjectionToken } from "../../../main/start-main-application/runnable-tokens/before-quit-of-back-end-injection-token";
|
|
||||||
import catalogEntityRegistryInjectable from "../../api/catalog/entity/registry.injectable";
|
|
||||||
import { KubernetesCluster, LensKubernetesClusterStatus } from "../../../common/catalog-entities";
|
|
||||||
import listNamespacesForInjectable from "../../../common/cluster/list-namespaces.injectable";
|
|
||||||
import requestApiResourcesInjectable from "../../../common/cluster/request-api-resources.injectable";
|
|
||||||
import { object } from "../../utils";
|
|
||||||
import requestNamespaceListPermissionsForInjectable from "../../../common/cluster/request-namespace-list-permissions.injectable";
|
|
||||||
import { beforeQuitOfFrontEndInjectionToken } from "../../../main/start-main-application/runnable-tokens/before-quit-of-front-end-injection-token";
|
|
||||||
import { runManySyncFor } from "../../../common/runnable/run-many-sync-for";
|
|
||||||
import type { MemoryHistory } from "history";
|
|
||||||
|
|
||||||
type Callback = (di: DiContainer) => void | Promise<void>;
|
|
||||||
|
|
||||||
type LensWindowWithHelpers = LensWindow & { rendered: RenderResult; di: DiContainer };
|
|
||||||
|
|
||||||
const createNamespacesFor = (namespaces: Set<string>): Namespace[] => (
|
|
||||||
Array.from(namespaces, (namespace) => new Namespace({
|
|
||||||
apiVersion: "v1",
|
|
||||||
kind: "Namespace",
|
|
||||||
metadata: {
|
|
||||||
name: namespace,
|
|
||||||
resourceVersion: "1",
|
|
||||||
selfLink: `/api/v1/namespaces/${namespace}`,
|
|
||||||
uid: `namespace-${namespace}`,
|
|
||||||
},
|
|
||||||
}))
|
|
||||||
);
|
|
||||||
|
|
||||||
export interface ApplicationBuilder {
|
|
||||||
mainDi: DiContainer;
|
|
||||||
setEnvironmentToClusterFrame: () => ApplicationBuilder;
|
|
||||||
|
|
||||||
extensions: {
|
|
||||||
enable: (...extensions: FakeExtensionOptions[]) => void;
|
|
||||||
disable: (...extensions: FakeExtensionOptions[]) => void;
|
|
||||||
|
|
||||||
get: (id: string) => {
|
|
||||||
main: LensMainExtension;
|
|
||||||
|
|
||||||
applicationWindows: Record<string, LensRendererExtension> & {
|
|
||||||
only: LensRendererExtension;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
applicationWindow: {
|
|
||||||
closeAll: () => void;
|
|
||||||
only: LensWindowWithHelpers;
|
|
||||||
get: (id: string) => LensWindowWithHelpers;
|
|
||||||
getAll: () => LensWindowWithHelpers[];
|
|
||||||
create: (id: string) => LensWindowWithHelpers;
|
|
||||||
};
|
|
||||||
|
|
||||||
allowKubeResource: (resource: KubeApiResourceDescriptor) => ApplicationBuilder;
|
|
||||||
beforeApplicationStart: (callback: Callback) => ApplicationBuilder;
|
|
||||||
afterApplicationStart: (callback: Callback) => ApplicationBuilder;
|
|
||||||
beforeWindowStart: (callback: Callback) => ApplicationBuilder;
|
|
||||||
afterWindowStart: (callback: Callback) => ApplicationBuilder;
|
|
||||||
|
|
||||||
startHidden: () => Promise<void>;
|
|
||||||
render: () => Promise<RenderResult>;
|
|
||||||
quit: () => void;
|
|
||||||
|
|
||||||
tray: {
|
|
||||||
click: (id: string) => Promise<void>;
|
|
||||||
get: (id: string) => MinimalTrayMenuItem | null;
|
|
||||||
getIconPath: () => string;
|
|
||||||
};
|
|
||||||
|
|
||||||
applicationMenu: {
|
|
||||||
click: (...path: string[]) => void;
|
|
||||||
items: string[][];
|
|
||||||
};
|
|
||||||
preferences: {
|
|
||||||
close: () => void;
|
|
||||||
navigate: () => void;
|
|
||||||
navigateTo: (route: Route<any>, params: Partial<NavigateToRouteOptions<any>>) => void;
|
|
||||||
navigation: {
|
|
||||||
click: (id: string) => void;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
namespaces: {
|
|
||||||
add: (namespace: string) => void;
|
|
||||||
select: (namespace: string) => void;
|
|
||||||
};
|
|
||||||
helmCharts: {
|
|
||||||
navigate: NavigateToHelmCharts;
|
|
||||||
};
|
|
||||||
navigateWith: (token: Injectable<() => void, any, void>) => void;
|
|
||||||
select: {
|
|
||||||
openMenu: (id: string) => { selectOption: (labelText: string) => void };
|
|
||||||
selectOption: (menuId: string, labelText: string) => void;
|
|
||||||
getValue: (menuId: string) => string;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Environment {
|
|
||||||
RootComponent: React.ElementType;
|
|
||||||
onAllowKubeResource: () => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const getApplicationBuilder = () => {
|
|
||||||
const mainDi = getMainDi({
|
|
||||||
doGeneralOverrides: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
runInAction(() => {
|
|
||||||
mainDi.register(mainExtensionsStateInjectable);
|
|
||||||
});
|
|
||||||
|
|
||||||
testUsingFakeTime();
|
|
||||||
|
|
||||||
const { overrideForWindow, sendToWindow } = overrideChannels(mainDi);
|
|
||||||
|
|
||||||
const beforeApplicationStartCallbacks: Callback[] = [];
|
|
||||||
const afterApplicationStartCallbacks: Callback[] = [];
|
|
||||||
const beforeWindowStartCallbacks: Callback[] = [];
|
|
||||||
const afterWindowStartCallbacks: Callback[] = [];
|
|
||||||
|
|
||||||
const overrideFsWithFakes = getOverrideFsWithFakes();
|
|
||||||
|
|
||||||
overrideFsWithFakes(mainDi);
|
|
||||||
|
|
||||||
// Set up ~/.kube as existing as a folder
|
|
||||||
{
|
|
||||||
const { ensureDirSync } = mainDi.inject(fsInjectable);
|
|
||||||
const joinPaths = mainDi.inject(joinPathsInjectable);
|
|
||||||
const homeDirectoryPath = mainDi.inject(homeDirectoryPathInjectable);
|
|
||||||
|
|
||||||
ensureDirSync(joinPaths(homeDirectoryPath, ".kube"));
|
|
||||||
}
|
|
||||||
|
|
||||||
let environment = environments.application;
|
|
||||||
|
|
||||||
mainDi.override(mainExtensionsInjectable, (di) => {
|
|
||||||
const mainExtensionsState = di.inject(mainExtensionsStateInjectable);
|
|
||||||
|
|
||||||
return computed(() =>
|
|
||||||
[...mainExtensionsState.values()],
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
let trayMenuIconPath: string;
|
|
||||||
|
|
||||||
const traySetMenuItemsMock = jest.fn<any, [MinimalTrayMenuItem[]]>();
|
|
||||||
|
|
||||||
mainDi.override(electronTrayInjectable, () => ({
|
|
||||||
start: () => {},
|
|
||||||
stop: () => {},
|
|
||||||
setMenuItems: traySetMenuItemsMock,
|
|
||||||
setIconPath: (path) => {
|
|
||||||
trayMenuIconPath = path;
|
|
||||||
},
|
|
||||||
}));
|
|
||||||
|
|
||||||
const allowedResourcesState = observable.set<string>();
|
|
||||||
const windowHelpers = new Map<string, { di: DiContainer; getRendered: () => RenderResult }>();
|
|
||||||
|
|
||||||
const createElectronWindowFake: CreateElectronWindow = (configuration) => {
|
|
||||||
const windowId = configuration.id;
|
|
||||||
|
|
||||||
const windowDi = getRendererDi({ doGeneralOverrides: true });
|
|
||||||
|
|
||||||
overrideForWindow(windowDi, windowId);
|
|
||||||
overrideFsWithFakes(windowDi);
|
|
||||||
|
|
||||||
runInAction(() => {
|
|
||||||
windowDi.register(rendererExtensionsStateInjectable);
|
|
||||||
});
|
|
||||||
|
|
||||||
windowDi.override(
|
|
||||||
currentlyInClusterFrameInjectable,
|
|
||||||
() => environment === environments.clusterFrame,
|
|
||||||
);
|
|
||||||
|
|
||||||
windowDi.override(rendererExtensionsInjectable, (di) => {
|
|
||||||
const rendererExtensionState = di.inject(rendererExtensionsStateInjectable);
|
|
||||||
|
|
||||||
return computed(() => [...rendererExtensionState.values()]);
|
|
||||||
});
|
|
||||||
|
|
||||||
let rendered: RenderResult;
|
|
||||||
|
|
||||||
windowHelpers.set(windowId, { di: windowDi, getRendered: () => rendered });
|
|
||||||
|
|
||||||
return {
|
|
||||||
show: () => {},
|
|
||||||
close: () => {},
|
|
||||||
loadFile: async () => {},
|
|
||||||
loadUrl: async () => {
|
|
||||||
for (const callback of beforeWindowStartCallbacks) {
|
|
||||||
await callback(windowDi);
|
|
||||||
}
|
|
||||||
|
|
||||||
const startFrame = windowDi.inject(startFrameInjectable);
|
|
||||||
|
|
||||||
await startFrame();
|
|
||||||
|
|
||||||
for (const callback of afterWindowStartCallbacks) {
|
|
||||||
await callback(windowDi);
|
|
||||||
}
|
|
||||||
|
|
||||||
const history = windowDi.inject(historyInjectable);
|
|
||||||
const render = renderFor(windowDi);
|
|
||||||
|
|
||||||
rendered = render((
|
|
||||||
<>
|
|
||||||
<div id="terminal-init" />
|
|
||||||
<Router history={history}>
|
|
||||||
<environment.RootComponent />
|
|
||||||
</Router>
|
|
||||||
</>
|
|
||||||
));
|
|
||||||
},
|
|
||||||
send: (arg) => {
|
|
||||||
sendToWindow(windowId, arg);
|
|
||||||
},
|
|
||||||
canGoBack: () => {
|
|
||||||
const history = windowDi.inject(historyInjectable) as MemoryHistory;
|
|
||||||
|
|
||||||
return history.canGo(-1);
|
|
||||||
},
|
|
||||||
canGoForward: () => {
|
|
||||||
const history = windowDi.inject(historyInjectable) as MemoryHistory;
|
|
||||||
|
|
||||||
return history.canGo(1);
|
|
||||||
},
|
|
||||||
reload: () => {
|
|
||||||
throw new Error("Tried to reload application window which is not implemented yet.");
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
mainDi.override(createElectronWindowInjectable, () => createElectronWindowFake);
|
|
||||||
|
|
||||||
let applicationHasStarted = false;
|
|
||||||
|
|
||||||
const namespaces = observable.set<string>();
|
|
||||||
const namespaceItems = observable.array<Namespace>();
|
|
||||||
const selectedNamespaces = observable.set<string>();
|
|
||||||
const clusters = observable.map<ClusterId, Cluster>();
|
|
||||||
const clusterId = "some-cluster-id";
|
|
||||||
const startMainApplication = mainDi.inject(startMainApplicationInjectable);
|
|
||||||
|
|
||||||
const startApplication = async ({ shouldStartHidden }: { shouldStartHidden: boolean }) => {
|
|
||||||
for (const callback of beforeApplicationStartCallbacks) {
|
|
||||||
await callback(mainDi);
|
|
||||||
}
|
|
||||||
|
|
||||||
mainDi.override(shouldStartHiddenInjectable, () => shouldStartHidden);
|
|
||||||
await startMainApplication();
|
|
||||||
|
|
||||||
for (const callback of afterApplicationStartCallbacks) {
|
|
||||||
await callback(mainDi);
|
|
||||||
}
|
|
||||||
|
|
||||||
applicationHasStarted = true;
|
|
||||||
};
|
|
||||||
const clusterEntity = new KubernetesCluster({
|
|
||||||
metadata: {
|
|
||||||
labels: {},
|
|
||||||
name: "some-context-name",
|
|
||||||
uid: clusterId,
|
|
||||||
},
|
|
||||||
spec: {
|
|
||||||
kubeconfigContext: "some-context-name",
|
|
||||||
kubeconfigPath: "/some-kube-config-path",
|
|
||||||
},
|
|
||||||
status: {
|
|
||||||
phase: LensKubernetesClusterStatus.DISCONNECTED,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
mainDi.override(getClusterByIdInjectable, () => (id) => clusters.get(id));
|
|
||||||
|
|
||||||
beforeWindowStartCallbacks.push((windowDi) => {
|
|
||||||
windowDi.override(getClusterByIdInjectable, () => (id) => clusters.get(id));
|
|
||||||
windowDi.override(currentLocationInjectable, () => ({
|
|
||||||
hostname: "localhost",
|
|
||||||
port: `${mainDi.inject(lensProxyPortInjectable).get()}`,
|
|
||||||
protocol: "http",
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
|
|
||||||
afterWindowStartCallbacks.push((windowDi) => {
|
|
||||||
windowDi.inject(catalogEntityRegistryInjectable).updateItems([clusterEntity]);
|
|
||||||
});
|
|
||||||
|
|
||||||
mainDi.override(listNamespacesForInjectable, () => () => async () => [...namespaces]);
|
|
||||||
mainDi.override(requestApiResourcesInjectable, () => async () => (
|
|
||||||
object.entries(apiResourceRecord)
|
|
||||||
.map(([apiName, data]) => ({ apiName, ...data }))
|
|
||||||
));
|
|
||||||
mainDi.override(requestNamespaceListPermissionsForInjectable, () => () => async () => (resource) => allowedResourcesState.has(formatKubeApiResource(resource)));
|
|
||||||
|
|
||||||
runInAction(() => {
|
|
||||||
mainDi.register(getInjectable({
|
|
||||||
id: "create-fake-cluster",
|
|
||||||
instantiate: (di) => ({
|
|
||||||
id: "create-fake-cluster",
|
|
||||||
run: () => {
|
|
||||||
const createCluster = di.inject(createClusterInjectable);
|
|
||||||
const cluster = createCluster({
|
|
||||||
contextName: "some-context-name",
|
|
||||||
id: clusterId,
|
|
||||||
kubeConfigPath: "/some-kube-config-path",
|
|
||||||
}, {
|
|
||||||
clusterServerUrl: "https://some-url.com:8797",
|
|
||||||
});
|
|
||||||
|
|
||||||
clusters.set(clusterId, cluster);
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
injectionToken: onLoadOfApplicationInjectionToken,
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
|
|
||||||
const builder: ApplicationBuilder = {
|
|
||||||
mainDi,
|
|
||||||
applicationWindow: {
|
|
||||||
closeAll: () => {
|
|
||||||
const closeAll = mainDi.inject(closeAllWindowsInjectable);
|
|
||||||
|
|
||||||
closeAll();
|
|
||||||
|
|
||||||
document.documentElement.innerHTML = "";
|
|
||||||
},
|
|
||||||
|
|
||||||
get only() {
|
|
||||||
const applicationWindows = builder.applicationWindow.getAll();
|
|
||||||
|
|
||||||
if (applicationWindows.length > 1) {
|
|
||||||
throw new Error(
|
|
||||||
"Tried to get only application window when there are multiple windows.",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const applicationWindow = first(applicationWindows);
|
|
||||||
|
|
||||||
if (!applicationWindow) {
|
|
||||||
throw new Error(
|
|
||||||
"Tried to get only application window when there are no windows.",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return applicationWindow;
|
|
||||||
},
|
|
||||||
|
|
||||||
getAll: () =>
|
|
||||||
mainDi
|
|
||||||
.injectMany(applicationWindowInjectionToken)
|
|
||||||
.map(toWindowWithHelpersFor(windowHelpers)),
|
|
||||||
|
|
||||||
get: (id) => {
|
|
||||||
const applicationWindow = builder.applicationWindow
|
|
||||||
.getAll()
|
|
||||||
.find((window) => window.id === id);
|
|
||||||
|
|
||||||
if (!applicationWindow) {
|
|
||||||
throw new Error(`Tried to get application window with ID "${id}" but it was not found.`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return applicationWindow;
|
|
||||||
},
|
|
||||||
|
|
||||||
create: (id) => {
|
|
||||||
const createApplicationWindow = mainDi.inject(createApplicationWindowInjectable);
|
|
||||||
|
|
||||||
createApplicationWindow(id);
|
|
||||||
|
|
||||||
return builder.applicationWindow.get(id);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
namespaces: {
|
|
||||||
add: action((namespace) => {
|
|
||||||
namespaces.add(namespace);
|
|
||||||
namespaceItems.replace(createNamespacesFor(namespaces));
|
|
||||||
}),
|
|
||||||
select: action((namespace) => selectedNamespaces.add(namespace)),
|
|
||||||
},
|
|
||||||
applicationMenu: {
|
|
||||||
get items() {
|
|
||||||
const composite = mainDi.inject(
|
|
||||||
applicationMenuItemCompositeInjectable,
|
|
||||||
).get();
|
|
||||||
|
|
||||||
return getCompositePaths(composite);
|
|
||||||
},
|
|
||||||
|
|
||||||
click: (...path: string[]) => {
|
|
||||||
const composite = mainDi.inject(
|
|
||||||
applicationMenuItemCompositeInjectable,
|
|
||||||
).get();
|
|
||||||
|
|
||||||
const clickableMenuItem = findComposite(...path)(composite).value;
|
|
||||||
|
|
||||||
if(clickableMenuItem.kind === "clickable-menu-item") {
|
|
||||||
// Todo: prevent leaking of Electron
|
|
||||||
(clickableMenuItem.onClick as any)();
|
|
||||||
} else {
|
|
||||||
throw new Error(`Tried to trigger clicking of an application menu item, but item at path '${path.join(" -> ")}' isn't clickable.`);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
tray: {
|
|
||||||
get: (id: string) => {
|
|
||||||
const lastCall = last(traySetMenuItemsMock.mock.calls);
|
|
||||||
|
|
||||||
assert(lastCall);
|
|
||||||
|
|
||||||
return lastCall[0].find(matches({ id })) ?? null;
|
|
||||||
},
|
|
||||||
|
|
||||||
getIconPath: () => trayMenuIconPath,
|
|
||||||
|
|
||||||
click: async (id: string) => {
|
|
||||||
const lastCall = last(traySetMenuItemsMock.mock.calls);
|
|
||||||
|
|
||||||
assert(lastCall);
|
|
||||||
|
|
||||||
const trayMenuItems = lastCall[0];
|
|
||||||
|
|
||||||
const menuItem = trayMenuItems.find(matches({ id })) ?? null;
|
|
||||||
|
|
||||||
if (!menuItem) {
|
|
||||||
const availableIds = pipeline(
|
|
||||||
trayMenuItems,
|
|
||||||
filter(item => !!item.click),
|
|
||||||
map(item => item.id),
|
|
||||||
join(", "),
|
|
||||||
);
|
|
||||||
|
|
||||||
throw new Error(`Tried to click tray menu item with ID ${id} which does not exist. Available IDs are: "${availableIds}"`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!menuItem.enabled) {
|
|
||||||
throw new Error(`Tried to click tray menu item with ID ${id} which is disabled.`);
|
|
||||||
}
|
|
||||||
|
|
||||||
await menuItem.click?.();
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
preferences: {
|
|
||||||
close: () => {
|
|
||||||
const rendered = builder.applicationWindow.only.rendered;
|
|
||||||
|
|
||||||
const link = rendered.getByTestId("close-preferences");
|
|
||||||
|
|
||||||
fireEvent.click(link);
|
|
||||||
},
|
|
||||||
|
|
||||||
navigate: () => {
|
|
||||||
const windowDi = builder.applicationWindow.only.di;
|
|
||||||
|
|
||||||
const navigateToPreferences = windowDi.inject(
|
|
||||||
navigateToPreferencesInjectable,
|
|
||||||
);
|
|
||||||
|
|
||||||
navigateToPreferences();
|
|
||||||
},
|
|
||||||
|
|
||||||
navigateTo: (route: Route<any>, params: Partial<NavigateToRouteOptions<any>>) => {
|
|
||||||
const windowDi = builder.applicationWindow.only.di;
|
|
||||||
|
|
||||||
const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken);
|
|
||||||
|
|
||||||
navigateToRoute(route, params);
|
|
||||||
},
|
|
||||||
|
|
||||||
navigation: {
|
|
||||||
click: (pathId: string) => {
|
|
||||||
const { rendered } = builder.applicationWindow.only;
|
|
||||||
|
|
||||||
const discover = discoverFor(() => rendered);
|
|
||||||
|
|
||||||
const { discovered: link } = discover.getSingleElement(
|
|
||||||
"preference-tab-link",
|
|
||||||
pathId,
|
|
||||||
);
|
|
||||||
|
|
||||||
fireEvent.click(link);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
helmCharts: {
|
|
||||||
navigate: (parameters) => {
|
|
||||||
const windowDi = builder.applicationWindow.only.di;
|
|
||||||
|
|
||||||
const navigateToHelmCharts = windowDi.inject(
|
|
||||||
navigateToHelmChartsInjectable,
|
|
||||||
);
|
|
||||||
|
|
||||||
navigateToHelmCharts(parameters);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
navigateWith: (token) => {
|
|
||||||
const windowDi = builder.applicationWindow.only.di;
|
|
||||||
const navigate = windowDi.inject(token);
|
|
||||||
|
|
||||||
navigate();
|
|
||||||
},
|
|
||||||
|
|
||||||
setEnvironmentToClusterFrame: () => {
|
|
||||||
environment = environments.clusterFrame;
|
|
||||||
|
|
||||||
builder.beforeWindowStart((windowDi) => {
|
|
||||||
windowDi.override(hostedClusterIdInjectable, () => clusterId);
|
|
||||||
|
|
||||||
// TODO: Figure out a way to remove this stub.
|
|
||||||
windowDi.override(namespaceStoreInjectable, () => ({
|
|
||||||
isLoaded: true,
|
|
||||||
get contextNamespaces() {
|
|
||||||
return Array.from(selectedNamespaces);
|
|
||||||
},
|
|
||||||
get allowedNamespaces() {
|
|
||||||
return Array.from(namespaces);
|
|
||||||
},
|
|
||||||
contextItems: namespaceItems,
|
|
||||||
api: windowDi.inject(namespaceApiInjectable),
|
|
||||||
items: namespaceItems,
|
|
||||||
selectNamespaces: () => {},
|
|
||||||
selectSingle: () => {},
|
|
||||||
getByPath: () => undefined,
|
|
||||||
pickOnlySelected: () => [],
|
|
||||||
isSelectedAll: () => false,
|
|
||||||
getTotalCount: () => namespaceItems.length,
|
|
||||||
} as Partial<NamespaceStore> as NamespaceStore));
|
|
||||||
});
|
|
||||||
|
|
||||||
builder.afterWindowStart(windowDi => {
|
|
||||||
windowDi.inject(catalogEntityRegistryInjectable).activeEntity = clusterEntity;
|
|
||||||
});
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
},
|
|
||||||
|
|
||||||
extensions: {
|
|
||||||
get: (id: string) => {
|
|
||||||
const windowInstances = pipeline(
|
|
||||||
builder.applicationWindow.getAll(),
|
|
||||||
|
|
||||||
map((window): [string, LensRendererExtension] => [
|
|
||||||
window.id,
|
|
||||||
findExtensionInstance(window.di, rendererExtensionsInjectable, id),
|
|
||||||
]),
|
|
||||||
|
|
||||||
items => Object.fromEntries(items),
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
main: findExtensionInstance(mainDi, mainExtensionsInjectable, id),
|
|
||||||
|
|
||||||
applicationWindows: {
|
|
||||||
get only() {
|
|
||||||
return findExtensionInstance(
|
|
||||||
builder.applicationWindow.only.di,
|
|
||||||
rendererExtensionsInjectable,
|
|
||||||
id,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
|
|
||||||
...windowInstances,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
enable: (...extensions) => {
|
|
||||||
builder.afterWindowStart((windowDi) => {
|
|
||||||
const enabledExtension = enableExtensionFor(windowDi, rendererExtensionsStateInjectable);
|
|
||||||
|
|
||||||
runInAction(() => {
|
|
||||||
for (const extension of extensions) {
|
|
||||||
enabledExtension(getExtensionFakeForRenderer(
|
|
||||||
windowDi,
|
|
||||||
extension.id,
|
|
||||||
extension.name,
|
|
||||||
extension.rendererOptions ?? {},
|
|
||||||
));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
builder.afterApplicationStart((mainDi) => {
|
|
||||||
const enabledExtension = enableExtensionFor(mainDi, mainExtensionsStateInjectable);
|
|
||||||
|
|
||||||
runInAction(() => {
|
|
||||||
for (const extension of extensions) {
|
|
||||||
enabledExtension(getExtensionFakeForMain(
|
|
||||||
mainDi,
|
|
||||||
extension.id,
|
|
||||||
extension.name,
|
|
||||||
extension.mainOptions ?? {},
|
|
||||||
));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
disable: (...extensions) => {
|
|
||||||
builder.afterWindowStart(windowDi => {
|
|
||||||
extensions
|
|
||||||
.map((ext) => ext.id)
|
|
||||||
.forEach(
|
|
||||||
disableExtensionFor(windowDi, rendererExtensionsStateInjectable),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
builder.afterApplicationStart(mainDi => {
|
|
||||||
extensions
|
|
||||||
.map((ext) => ext.id)
|
|
||||||
.forEach(
|
|
||||||
disableExtensionFor(mainDi, mainExtensionsStateInjectable),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
allowKubeResource: (resource) => {
|
|
||||||
environment.onAllowKubeResource();
|
|
||||||
|
|
||||||
runInAction(() => {
|
|
||||||
allowedResourcesState.add(formatKubeApiResource(resource));
|
|
||||||
});
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
},
|
|
||||||
|
|
||||||
beforeApplicationStart(callback) {
|
|
||||||
if (applicationHasStarted) {
|
|
||||||
callback(mainDi);
|
|
||||||
}
|
|
||||||
|
|
||||||
beforeApplicationStartCallbacks.push(callback);
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
},
|
|
||||||
|
|
||||||
afterApplicationStart(callback) {
|
|
||||||
if (applicationHasStarted) {
|
|
||||||
callback(mainDi);
|
|
||||||
}
|
|
||||||
|
|
||||||
afterApplicationStartCallbacks.push(callback);
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
},
|
|
||||||
|
|
||||||
beforeWindowStart(callback) {
|
|
||||||
const alreadyRenderedWindows = builder.applicationWindow.getAll();
|
|
||||||
|
|
||||||
alreadyRenderedWindows.forEach((window) => {
|
|
||||||
callback(window.di);
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeWindowStartCallbacks.push(callback);
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
},
|
|
||||||
|
|
||||||
afterWindowStart(callback) {
|
|
||||||
const alreadyRenderedWindows = builder.applicationWindow.getAll();
|
|
||||||
|
|
||||||
alreadyRenderedWindows.forEach((window) => {
|
|
||||||
callback(window.di);
|
|
||||||
});
|
|
||||||
|
|
||||||
afterWindowStartCallbacks.push(callback);
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
},
|
|
||||||
|
|
||||||
startHidden: async () => {
|
|
||||||
await startApplication({ shouldStartHidden: true });
|
|
||||||
},
|
|
||||||
|
|
||||||
quit() {
|
|
||||||
const runManySync = runManySyncFor(builder.mainDi);
|
|
||||||
const beforeQuitOfFrontEnd = runManySync(beforeQuitOfFrontEndInjectionToken);
|
|
||||||
const beforeQuitOfBackEnd = runManySync(beforeQuitOfBackEndInjectionToken);
|
|
||||||
|
|
||||||
beforeQuitOfFrontEnd();
|
|
||||||
beforeQuitOfBackEnd();
|
|
||||||
},
|
|
||||||
|
|
||||||
async render() {
|
|
||||||
await startApplication({ shouldStartHidden: false });
|
|
||||||
|
|
||||||
return builder
|
|
||||||
.applicationWindow
|
|
||||||
.get("first-application-window")
|
|
||||||
.rendered;
|
|
||||||
},
|
|
||||||
|
|
||||||
select: {
|
|
||||||
openMenu: (menuId) => {
|
|
||||||
const rendered = builder.applicationWindow.only.rendered;
|
|
||||||
|
|
||||||
const select = rendered.baseElement.querySelector<HTMLElement>(
|
|
||||||
`#${menuId}`,
|
|
||||||
);
|
|
||||||
|
|
||||||
assert(select, `Could not find select with ID "${menuId}"`);
|
|
||||||
|
|
||||||
openMenu(select);
|
|
||||||
|
|
||||||
return {
|
|
||||||
selectOption: selectOptionFor(builder, menuId),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
selectOption: (menuId, labelText) => selectOptionFor(builder, menuId)(labelText),
|
|
||||||
|
|
||||||
getValue: (menuId) => {
|
|
||||||
const rendered = builder.applicationWindow.only.rendered;
|
|
||||||
|
|
||||||
const select = rendered.baseElement.querySelector<HTMLInputElement>(
|
|
||||||
`#${menuId}`,
|
|
||||||
);
|
|
||||||
|
|
||||||
assert(select, `Could not find select with ID "${menuId}"`);
|
|
||||||
|
|
||||||
const controlElement = select.closest(".Select__control");
|
|
||||||
|
|
||||||
assert(controlElement, `Could not find select value for menu with ID "${menuId}"`);
|
|
||||||
|
|
||||||
return controlElement.textContent || "";
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const rendererExtensionsStateInjectable = getInjectable({
|
|
||||||
id: "renderer-extensions-state",
|
|
||||||
instantiate: () => observable.map<string, LensRendererExtension>(),
|
|
||||||
});
|
|
||||||
|
|
||||||
const mainExtensionsStateInjectable = getInjectable({
|
|
||||||
id: "main-extensions-state",
|
|
||||||
instantiate: () => observable.map<string, LensMainExtension>(),
|
|
||||||
});
|
|
||||||
|
|
||||||
const findExtensionInstance = <T extends LensExtension> (di: DiContainer, injectable: Injectable<IComputedValue<T[]>, any, any>, id: string) => {
|
|
||||||
const instance = di.inject(injectable).get().find(ext => ext.id === id);
|
|
||||||
|
|
||||||
if (!instance) {
|
|
||||||
throw new Error(`Tried to get extension with ID ${id}, but it didn't exist`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return instance;
|
|
||||||
};
|
|
||||||
|
|
||||||
type ApplicationWindowHelpers = Map<string, { di: DiContainer; getRendered: () => RenderResult }>;
|
|
||||||
|
|
||||||
const toWindowWithHelpersFor =
|
|
||||||
(windowHelpers: ApplicationWindowHelpers) => (applicationWindow: LensWindow) => ({
|
|
||||||
...applicationWindow,
|
|
||||||
|
|
||||||
get rendered() {
|
|
||||||
const helpers = windowHelpers.get(applicationWindow.id);
|
|
||||||
|
|
||||||
if (!helpers) {
|
|
||||||
throw new Error(
|
|
||||||
`Tried to get rendered for application window "${applicationWindow.id}" before it was started.`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return helpers.getRendered();
|
|
||||||
},
|
|
||||||
|
|
||||||
get di() {
|
|
||||||
const helpers = windowHelpers.get(applicationWindow.id);
|
|
||||||
|
|
||||||
if (!helpers) {
|
|
||||||
throw new Error(
|
|
||||||
`Tried to get di for application window "${applicationWindow.id}" before it was started.`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return helpers.di;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const environments = {
|
|
||||||
application: {
|
|
||||||
RootComponent: RootFrame,
|
|
||||||
|
|
||||||
onAllowKubeResource: () => {
|
|
||||||
throw new Error(
|
|
||||||
"Tried to allow kube resource when environment is not cluster frame.",
|
|
||||||
);
|
|
||||||
},
|
|
||||||
} as Environment,
|
|
||||||
|
|
||||||
clusterFrame: {
|
|
||||||
RootComponent: ClusterFrame,
|
|
||||||
onAllowKubeResource: () => {},
|
|
||||||
} as Environment,
|
|
||||||
};
|
|
||||||
|
|
||||||
const selectOptionFor = (builder: ApplicationBuilder, menuId: string) => (labelText: string) => {
|
|
||||||
const rendered = builder.applicationWindow.only.rendered;
|
|
||||||
|
|
||||||
const menuOptions = rendered.baseElement.querySelector<HTMLElement>(
|
|
||||||
`.${menuId}-options`,
|
|
||||||
);
|
|
||||||
|
|
||||||
assert(menuOptions, `Could not find select options for menu with ID "${menuId}"`);
|
|
||||||
|
|
||||||
const option = queryByText(menuOptions, labelText);
|
|
||||||
|
|
||||||
assert(option, `Could not find select option with label "${labelText}" for menu with ID "${menuId}"`);
|
|
||||||
|
|
||||||
userEvent.click(option);
|
|
||||||
};
|
|
||||||
|
|
||||||
const enableExtensionFor = (
|
|
||||||
di: DiContainer,
|
|
||||||
stateInjectable: Injectable<ObservableMap<string, any>, any, any>,
|
|
||||||
) => {
|
|
||||||
const extensionState = di.inject(stateInjectable);
|
|
||||||
|
|
||||||
return (extensionInstance: LensExtension) => {
|
|
||||||
const extension = di.inject(extensionInjectable, extensionInstance);
|
|
||||||
|
|
||||||
runInAction(() => {
|
|
||||||
extension.register();
|
|
||||||
extensionState.set(extensionInstance.id, extensionInstance);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
const disableExtensionFor =
|
|
||||||
(
|
|
||||||
di: DiContainer,
|
|
||||||
stateInjectable: Injectable<ObservableMap<string, any>, unknown, void>,
|
|
||||||
) =>
|
|
||||||
(id: string) => {
|
|
||||||
const extensionsState = di.inject(stateInjectable);
|
|
||||||
const instance = extensionsState.get(id);
|
|
||||||
|
|
||||||
if (!instance) {
|
|
||||||
throw new Error(
|
|
||||||
`Tried to disable extension with ID "${id}", but it wasn't enabled`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const extension = di.inject(extensionInjectable, instance);
|
|
||||||
|
|
||||||
runInAction(() => {
|
|
||||||
extension.deregister();
|
|
||||||
extensionsState.delete(id);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
Loading…
Reference in New Issue
Block a user