diff --git a/Makefile b/Makefile index 9dfb2cf512..d04b3febe1 100644 --- a/Makefile +++ b/Makefile @@ -17,8 +17,7 @@ else endif node_modules: yarn.lock - yarn install --frozen-lockfile --network-timeout=100000 - yarn check --verify-tree --integrity + yarn install --check-files --frozen-lockfile --network-timeout=100000 binaries/client: node_modules yarn download:binaries diff --git a/package.json b/package.json index 63cc014d5b..1ee08c8017 100644 --- a/package.json +++ b/package.json @@ -207,6 +207,9 @@ "role": "Viewer" } }, + "resolutions": { + "@astronautlabs/jsonpath/underscore": "^1.12.1" + }, "dependencies": { "@astronautlabs/jsonpath": "^1.1.0", "@hapi/call": "^9.0.0", @@ -257,7 +260,7 @@ "moment-timezone": "^0.5.34", "monaco-editor": "^0.29.1", "monaco-editor-webpack-plugin": "^5.0.0", - "node-fetch": "lensapp/node-fetch#2.x", + "node-fetch": "^2.6.7", "node-pty": "0.10.1", "npm": "^6.14.17", "p-limit": "^3.1.0", @@ -343,7 +346,7 @@ "@types/request": "^2.48.7", "@types/request-promise-native": "^1.0.18", "@types/semver": "^7.3.10", - "@types/sharp": "^0.30.4", + "@types/sharp": "^0.30.5", "@types/spdy": "^3.4.5", "@types/tar": "^4.0.5", "@types/tar-stream": "^2.2.2", @@ -399,7 +402,7 @@ "node-loader": "^2.0.0", "nodemon": "^2.0.19", "playwright": "^1.24.2", - "postcss": "^8.4.14", + "postcss": "^8.4.16", "postcss-loader": "^6.2.1", "randomcolor": "^0.6.2", "react-beautiful-dnd": "^13.1.0", @@ -413,7 +416,7 @@ "sass-loader": "^12.6.0", "sharp": "^0.30.7", "style-loader": "^3.3.1", - "tailwindcss": "^3.1.6", + "tailwindcss": "^3.1.8", "tar-stream": "^2.2.0", "ts-loader": "^9.3.1", "ts-node": "^10.9.1", diff --git a/src/behaviours/helm-charts/installing-chart/installing-helm-chart-from-new-tab.test.ts b/src/behaviours/helm-charts/installing-chart/installing-helm-chart-from-new-tab.test.ts deleted file mode 100644 index 4da41f669d..0000000000 --- a/src/behaviours/helm-charts/installing-chart/installing-helm-chart-from-new-tab.test.ts +++ /dev/null @@ -1,1019 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { AsyncFnMock } from "@async-fn/jest"; -import asyncFn from "@async-fn/jest"; -import type { RenderResult } from "@testing-library/react"; -import { fireEvent } from "@testing-library/react"; -import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; -import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; -import type { CallForHelmCharts } from "../../../renderer/components/+helm-charts/helm-charts/call-for-helm-charts.injectable"; -import callForHelmChartsInjectable from "../../../renderer/components/+helm-charts/helm-charts/call-for-helm-charts.injectable"; -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 type { CallForHelmChartValues } from "../../../renderer/components/dock/install-chart/chart-data/call-for-helm-chart-values.injectable"; -import callForHelmChartValuesInjectable from "../../../renderer/components/dock/install-chart/chart-data/call-for-helm-chart-values.injectable"; -import type { CallForCreateHelmRelease } from "../../../renderer/components/+helm-releases/create-release/call-for-create-helm-release.injectable"; -import callForCreateHelmReleaseInjectable from "../../../renderer/components/+helm-releases/create-release/call-for-create-helm-release.injectable"; -import currentPathInjectable from "../../../renderer/routes/current-path.injectable"; -import namespaceStoreInjectable from "../../../renderer/components/+namespaces/store.injectable"; -import type { NamespaceStore } from "../../../renderer/components/+namespaces/store"; -import type { CallForHelmChartReadme } from "../../../renderer/components/+helm-charts/details/readme/call-for-helm-chart-readme.injectable"; -import callForHelmChartReadmeInjectable from "../../../renderer/components/+helm-charts/details/readme/call-for-helm-chart-readme.injectable"; -import type { CallForHelmChartVersions } from "../../../renderer/components/+helm-charts/details/versions/call-for-helm-chart-versions.injectable"; -import callForHelmChartVersionsInjectable from "../../../renderer/components/+helm-charts/details/versions/call-for-helm-chart-versions.injectable"; -import { overrideFsWithFakes } from "../../../test-utils/override-fs-with-fakes"; -import writeJsonFileInjectable from "../../../common/fs/write-json-file.injectable"; -import directoryForLensLocalStorageInjectable from "../../../common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable"; -import hostedClusterIdInjectable from "../../../renderer/cluster-frame-context/hosted-cluster-id.injectable"; -import dockStoreInjectable from "../../../renderer/components/dock/dock/store.injectable"; -import readJsonFileInjectable from "../../../common/fs/read-json-file.injectable"; -import type { DiContainer } from "@ogre-tools/injectable"; - -describe("installing helm chart from new tab", () => { - let builder: ApplicationBuilder; - let rendererDi: DiContainer; - let callForHelmChartsMock: AsyncFnMock; - let callForHelmChartVersionsMock: AsyncFnMock; - let callForHelmChartReadmeMock: AsyncFnMock; - let callForHelmChartValuesMock: AsyncFnMock; - let callForCreateHelmReleaseMock: AsyncFnMock; - - beforeEach(() => { - builder = getApplicationBuilder(); - - rendererDi = builder.dis.rendererDi; - - overrideFsWithFakes(rendererDi); - - callForHelmChartsMock = asyncFn(); - callForHelmChartVersionsMock = asyncFn(); - callForHelmChartReadmeMock = asyncFn(); - callForHelmChartValuesMock = asyncFn(); - callForCreateHelmReleaseMock = asyncFn(); - - builder.beforeApplicationStart(({ rendererDi }) => { - rendererDi.override( - directoryForLensLocalStorageInjectable, - () => "/some-directory-for-lens-local-storage", - ); - - rendererDi.override(hostedClusterIdInjectable, () => "some-cluster-id"); - - rendererDi.override( - callForHelmChartsInjectable, - () => callForHelmChartsMock, - ); - - rendererDi.override( - callForHelmChartVersionsInjectable, - () => callForHelmChartVersionsMock, - ); - - rendererDi.override( - callForHelmChartReadmeInjectable, - () => callForHelmChartReadmeMock, - ); - - rendererDi.override( - callForHelmChartValuesInjectable, - () => callForHelmChartValuesMock, - ); - - rendererDi.override( - callForCreateHelmReleaseInjectable, - () => callForCreateHelmReleaseMock, - ); - - // TODO: Replace store mocking with mock for the actual side-effect (where the namespaces are coming from) - rendererDi.override( - namespaceStoreInjectable, - () => - ({ - contextNamespaces: [], - items: [ - { getName: () => "default" }, - { getName: () => "some-other-namespace" }, - ], - selectNamespaces: () => {}, - } as unknown as NamespaceStore), - ); - - rendererDi.override(getRandomInstallChartTabIdInjectable, () => - jest - .fn(() => "some-irrelevant-tab-id") - .mockReturnValueOnce("some-first-tab-id") - .mockReturnValueOnce("some-second-tab-id"), - ); - }); - - builder.setEnvironmentToClusterFrame(); - }); - - describe("given tab for installing chart was not previously opened and application is started, when navigating to helm charts", () => { - let rendered: RenderResult; - - beforeEach(async () => { - rendered = await builder.render(); - - builder.helmCharts.navigate({ - chartName: "some-name", - repo: "some-repository", - }); - - const writeJsonFile = rendererDi.inject(writeJsonFileInjectable); - - writeJsonFile( - "/some-directory-for-lens-local-storage/some-cluster-id.json", - { - dock: { - height: 300, - tabs: [], - isOpen: false, - }, - }, - ); - - const dockStore = rendererDi.inject(dockStoreInjectable); - - // TODO: Make TerminalWindow unit testable to allow realistic behaviour - dockStore.closeTab("terminal"); - - await callForHelmChartsMock.resolve([ - HelmChart.create({ - apiVersion: "some-api-version", - name: "some-name", - version: "some-version", - repo: "some-repository", - created: "2015-10-21T07:28:00Z", - description: "some-description", - keywords: [], - sources: [], - urls: [], - annotations: {}, - dependencies: [], - maintainers: [], - deprecated: false, - }), - - HelmChart.create({ - apiVersion: "some-api-version", - name: "some-other-name", - version: "some-version", - repo: "some-repository", - created: "2015-10-21T07:28:00Z", - description: "some-description", - keywords: [], - sources: [], - urls: [], - annotations: {}, - dependencies: [], - maintainers: [], - deprecated: false, - }), - ]); - - await callForHelmChartVersionsMock.resolve([ - HelmChart.create({ - apiVersion: "some-api-version", - name: "some-name", - version: "some-version", - repo: "some-repository", - created: "2015-10-21T07:28:00Z", - description: "some-description", - keywords: [], - sources: [], - urls: [], - annotations: {}, - dependencies: [], - maintainers: [], - deprecated: false, - }), - - HelmChart.create({ - apiVersion: "some-api-version", - name: "some-name", - version: "some-other-version", - repo: "some-repository", - created: "2015-10-21T07:28:00Z", - description: "some-description", - keywords: [], - sources: [], - urls: [], - annotations: {}, - dependencies: [], - maintainers: [], - deprecated: false, - }), - ]); - - await callForHelmChartReadmeMock.resolve("some-readme"); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - describe("when selecting to install the chart", () => { - beforeEach(() => { - callForHelmChartVersionsMock.mockClear(); - - const installButton = rendered.getByTestId( - "install-chart-for-some-repository-some-name", - ); - - fireEvent.click(installButton); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("shows dock tab for installing the chart", () => { - expect( - rendered.getByTestId("dock-tab-content-for-some-first-tab-id"), - ).toBeInTheDocument(); - }); - - it("calls for default configuration of the chart", () => { - expect(callForHelmChartValuesMock).toHaveBeenCalledWith( - "some-repository", - "some-name", - "some-version", - ); - }); - - it("calls for available versions", () => { - expect(callForHelmChartVersionsMock).toHaveBeenCalledWith( - "some-repository", - "some-name", - ); - }); - - it("shows spinner in dock tab", () => { - expect( - rendered.getByTestId("install-chart-tab-spinner"), - ).toBeInTheDocument(); - }); - - it("given default configuration resolves but versions have not resolved yet, still shows the spinner", async () => { - await callForHelmChartValuesMock.resolve( - "some-default-configuration", - ); - - expect( - rendered.getByTestId("install-chart-tab-spinner"), - ).toBeInTheDocument(); - }); - - it("given versions resolve but default configuration has not resolved yet, still shows the spinner", async () => { - await callForHelmChartVersionsMock.resolve([]); - - expect( - rendered.getByTestId("install-chart-tab-spinner"), - ).toBeInTheDocument(); - }); - - describe("when default configuration and versions resolve", () => { - beforeEach(async () => { - await callForHelmChartValuesMock.resolve( - "some-default-configuration", - ); - - await callForHelmChartVersionsMock.resolve([ - HelmChart.create({ - apiVersion: "some-api-version", - name: "some-name", - version: "some-version", - repo: "some-repository", - created: "2015-10-21T07:28:00Z", - description: "some-description", - keywords: [], - sources: [], - urls: [], - annotations: {}, - dependencies: [], - maintainers: [], - deprecated: false, - }), - - HelmChart.create({ - apiVersion: "some-api-version", - name: "some-name", - version: "some-other-version", - repo: "some-repository", - created: "2015-10-21T07:28:00Z", - description: "some-description", - keywords: [], - sources: [], - urls: [], - annotations: {}, - dependencies: [], - maintainers: [], - deprecated: false, - }), - ]); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("does not show spinner anymore", () => { - expect( - rendered.queryByTestId("install-chart-tab-spinner"), - ).not.toBeInTheDocument(); - }); - - describe("when cancelled", () => { - beforeEach(() => { - const cancelButton = rendered.getByTestId( - "cancel-install-chart-from-tab-for-some-first-tab-id", - ); - - fireEvent.click(cancelButton); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("closes the tab", () => { - expect( - rendered.queryByTestId("dock-tab-for-some-first-tab-id"), - ).not.toBeInTheDocument(); - }); - }); - - describe("given no changes in configuration, when installing the chart", () => { - let installButton: HTMLButtonElement; - - beforeEach(() => { - installButton = rendered.getByTestId( - "install-chart-from-tab-for-some-first-tab-id", - ) as HTMLButtonElement; - - fireEvent.click(installButton); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("shows spinner in dock tab", () => { - expect( - rendered.getByTestId( - "installing-chart-from-tab-some-first-tab-id", - ), - ).toBeInTheDocument(); - }); - - it("install button is disabled", () => { - expect(installButton).toHaveAttribute("disabled"); - }); - - it("calls for installation with default configuration", () => { - expect(callForCreateHelmReleaseMock).toHaveBeenCalledWith({ - chart: "some-name", - name: undefined, - namespace: "default", - repo: "some-repository", - values: "some-default-configuration", - version: "some-version", - }); - }); - - describe("when installation resolves", () => { - beforeEach(async () => { - await callForCreateHelmReleaseMock.resolve({ - log: "some-execution-output", - - release: { - resources: [], - name: "some-release", - namespace: "default", - version: "some-version", - config: "some-config", - manifest: "some-manifest", - - info: { - deleted: "some-deleted", - description: "some-description", - first_deployed: "some-first-deployed", - last_deployed: "some-last-deployed", - notes: "some-notes", - status: "some-status", - }, - }, - }); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("does not show spinner anymore", () => { - expect( - rendered.queryByTestId( - "installing-chart-from-tab-some-first-tab-id", - ), - ).not.toBeInTheDocument(); - }); - - describe("when selected to see the installed release", () => { - beforeEach(() => { - const releaseButton = rendered.getByTestId( - "show-release-some-release-for-some-first-tab-id", - ); - - fireEvent.click(releaseButton); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("shows the details of installed release", () => { - const currentPath = rendererDi - .inject(currentPathInjectable) - .get(); - - expect(currentPath).toBe( - "/helm/releases/default/some-release", - ); - }); - - it("closes the dock tab", () => { - expect( - rendered.queryByTestId( - "dock-tab-for-some-first-tab-id", - ), - ).not.toBeInTheDocument(); - }); - }); - - describe("when selected to show execution output", () => { - beforeEach(() => { - const showNotesButton = rendered.getByTestId( - "show-execution-output-for-some-release-in-some-first-tab-id", - ); - - fireEvent.click(showNotesButton); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("shows the execution output", () => { - expect( - rendered.getByTestId( - "logs-dialog-for-helm-chart-install", - ), - ).toHaveTextContent("some-execution-output"); - }); - - it("does not close the dock tab", () => { - expect( - rendered.getByTestId("dock-tab-for-some-first-tab-id"), - ).toBeInTheDocument(); - }); - }); - }); - }); - - describe("given opening details for second chart, when details resolve", () => { - beforeEach(async () => { - callForHelmChartReadmeMock.mockClear(); - callForHelmChartVersionsMock.mockClear(); - - const row = rendered.getByTestId( - "helm-chart-row-for-some-repository-some-other-name", - ); - - fireEvent.click(row); - - await callForHelmChartVersionsMock.resolve([ - HelmChart.create({ - apiVersion: "some-api-version", - name: "some-other-name", - version: "some-version", - repo: "some-repository", - created: "2015-10-21T07:28:00Z", - description: "some-description", - keywords: [], - sources: [], - urls: [], - annotations: {}, - dependencies: [], - maintainers: [], - deprecated: false, - }), - ]); - - await callForHelmChartReadmeMock.resolve("some-readme"); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - describe("when selecting to install second chart", () => { - beforeEach(() => { - callForHelmChartVersionsMock.mockClear(); - - const installButton = rendered.getByTestId( - "install-chart-for-some-repository-some-other-name", - ); - - fireEvent.click(installButton); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("shows dock tab for installing second chart", () => { - expect( - rendered.getByTestId( - "dock-tab-content-for-some-second-tab-id", - ), - ).toBeInTheDocument(); - }); - - it("still has the dock tab for installing first chart", () => { - expect( - rendered.getByTestId("dock-tab-for-some-first-tab-id"), - ).toBeInTheDocument(); - }); - - it("calls for default configuration of the second chart", () => { - expect(callForHelmChartValuesMock).toHaveBeenCalledWith( - "some-repository", - "some-other-name", - "some-version", - ); - }); - - it("calls for available versions for the second chart", () => { - expect(callForHelmChartVersionsMock).toHaveBeenCalledWith( - "some-repository", - "some-other-name", - ); - }); - - it("shows spinner in dock tab", () => { - expect( - rendered.getByTestId("install-chart-tab-spinner"), - ).toBeInTheDocument(); - }); - - describe("when configuration and versions resolve", () => { - beforeEach(async () => { - await callForHelmChartValuesMock.resolve( - "some-other-default-configuration", - ); - - await callForHelmChartVersionsMock.resolve([]); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("does not show spinner anymore", () => { - expect( - rendered.queryByTestId("install-chart-tab-spinner"), - ).not.toBeInTheDocument(); - }); - - it("when installing the second chart, calls for installation of second chart", () => { - const installButton = rendered.getByTestId( - "install-chart-from-tab-for-some-second-tab-id", - ); - - fireEvent.click(installButton); - - expect( - callForCreateHelmReleaseMock, - ).toHaveBeenCalledWith({ - chart: "some-other-name", - name: undefined, - namespace: "default", - repo: "some-repository", - values: "some-other-default-configuration", - version: "some-version", - }); - }); - - describe("when selecting the dock tab for installing first chart", () => { - beforeEach(() => { - callForHelmChartValuesMock.mockClear(); - callForHelmChartVersionsMock.mockClear(); - - const tab = rendered.getByTestId( - "dock-tab-for-some-first-tab-id", - ); - - fireEvent.click(tab); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("does not call for default configuration", () => { - expect( - callForHelmChartValuesMock, - ).not.toHaveBeenCalled(); - }); - - it("does not call for available versions", () => { - expect( - callForHelmChartVersionsMock, - ).not.toHaveBeenCalled(); - }); - - it("does not show spinner", () => { - expect( - rendered.queryByTestId("install-chart-tab-spinner"), - ).not.toBeInTheDocument(); - }); - - it("when installing the first chart, calls for installation of first chart", () => { - const installButton = rendered.getByTestId( - "install-chart-from-tab-for-some-first-tab-id", - ); - - fireEvent.click(installButton); - - expect( - callForCreateHelmReleaseMock, - ).toHaveBeenCalledWith({ - chart: "some-name", - name: undefined, - namespace: "default", - repo: "some-repository", - values: "some-default-configuration", - version: "some-version", - }); - }); - }); - }); - }); - }); - - describe("given changing version to be installed", () => { - let menu: { selectOption: (labelText: string) => void }; - - beforeEach(() => { - callForHelmChartVersionsMock.mockClear(); - callForHelmChartValuesMock.mockClear(); - - const menuId = - "install-chart-version-select-for-some-first-tab-id"; - - menu = builder.select.openMenu(menuId); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - describe("when version is selected", () => { - let installButton: HTMLButtonElement; - - beforeEach(() => { - installButton = rendered.getByTestId( - "install-chart-from-tab-for-some-first-tab-id", - ) as HTMLButtonElement; - - menu.selectOption("some-other-version"); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("calls for default configuration for the version of chart", () => { - expect(callForHelmChartValuesMock).toHaveBeenCalledWith( - "some-repository", - "some-name", - "some-other-version", - ); - }); - - it("shows spinner", () => { - expect( - rendered.getByTestId( - "install-chart-configuration-spinner", - ), - ).toBeInTheDocument(); - }); - - it("does not call for versions again", () => { - expect( - callForHelmChartVersionsMock, - ).not.toHaveBeenCalled(); - }); - - it("install button is disabled", () => { - expect(installButton).toHaveAttribute("disabled"); - }); - - it("stores the selected version", async () => { - const readJsonFile = rendererDi.inject(readJsonFileInjectable); - - const actual = await readJsonFile( - "/some-directory-for-lens-local-storage/some-cluster-id.json", - ) as any; - - const version = actual.install_charts["some-first-tab-id"].version; - - expect(version).toBe("some-other-version"); - }); - - describe("when default configuration resolves", () => { - beforeEach(async () => { - await callForHelmChartValuesMock.resolve( - "some-default-configuration-for-other-version", - ); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("does not show spinner", () => { - expect( - rendered.queryByTestId( - "install-chart-configuration-spinner", - ), - ).not.toBeInTheDocument(); - }); - - it("install button is enabled", () => { - expect(installButton).not.toHaveAttribute("disabled"); - }); - - it("when installing the chart, calls for installation with changed version and default configuration", () => { - fireEvent.click(installButton); - - expect( - callForCreateHelmReleaseMock, - ).toHaveBeenCalledWith({ - chart: "some-name", - name: undefined, - namespace: "default", - repo: "some-repository", - values: - "some-default-configuration-for-other-version", - version: "some-other-version", - }); - }); - }); - }); - }); - - describe("given namespace selection is opened", () => { - let menu: { selectOption: (labelText: string) => void }; - - beforeEach(() => { - const menuId = - "install-chart-namespace-select-for-some-first-tab-id"; - - menu = builder.select.openMenu(menuId); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - describe("when namespace is selected", () => { - beforeEach(() => { - menu.selectOption("some-other-namespace"); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("stores the selected namespace", async () => { - const readJsonFile = rendererDi.inject(readJsonFileInjectable); - - const actual = await readJsonFile( - "/some-directory-for-lens-local-storage/some-cluster-id.json", - ) as any; - - const namespace = actual.install_charts["some-first-tab-id"].namespace; - - expect(namespace).toBe("some-other-namespace"); - }); - - it("when installing the chart, calls for installation with changed namespace", () => { - const installButton = rendered.getByTestId( - "install-chart-from-tab-for-some-first-tab-id", - ); - - fireEvent.click(installButton); - - expect(callForCreateHelmReleaseMock).toHaveBeenCalledWith( - { - chart: "some-name", - name: undefined, - namespace: "some-other-namespace", - repo: "some-repository", - values: "some-default-configuration", - version: "some-version", - }, - ); - }); - }); - }); - - describe("given invalid change in configuration", () => { - let installButton: HTMLButtonElement; - let input: HTMLInputElement; - - beforeEach(() => { - installButton = rendered.getByTestId( - "install-chart-from-tab-for-some-first-tab-id", - ) as HTMLButtonElement; - - input = rendered.getByTestId( - "monaco-editor-for-some-first-tab-id", - ) as HTMLInputElement; - - fireEvent.change(input, { - target: { value: "@some-invalid-configuration@" }, - }); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("updates the editor with the changed value", () => { - const input = rendered.getByTestId( - "monaco-editor-for-some-first-tab-id", - ); - - expect(input).toHaveValue("@some-invalid-configuration@"); - }); - - it("install button is disabled", () => { - expect(installButton).toHaveAttribute("disabled"); - }); - - it("when valid change in configuration, install button is enabled", () => { - fireEvent.change(input, { - target: { value: "some-valid-configuration" }, - }); - - expect(installButton).not.toHaveAttribute("disabled"); - }); - - it("given change in version, when default configuration resolves, install button is enabled", async () => { - builder.select - .openMenu( - "install-chart-version-select-for-some-first-tab-id", - ) - .selectOption("some-other-version"); - - await callForHelmChartValuesMock.resolve( - "some-default-configuration-for-other-version", - ); - - expect(installButton).not.toHaveAttribute("disabled"); - }); - }); - - describe("given valid change in configuration", () => { - beforeEach(() => { - const input = rendered.getByTestId( - "monaco-editor-for-some-first-tab-id", - ); - - fireEvent.change(input, { - target: { value: "some-valid-configuration" }, - }); - }); - - it("updates the editor with the changed value", () => { - const input = rendered.getByTestId( - "monaco-editor-for-some-first-tab-id", - ); - - expect(input).toHaveValue("some-valid-configuration"); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("stores the changed configuration", async () => { - const readJsonFile = rendererDi.inject(readJsonFileInjectable); - - const actual = await readJsonFile( - "/some-directory-for-lens-local-storage/some-cluster-id.json", - ) as any; - - const configuration = actual.install_charts["some-first-tab-id"].values; - - expect(configuration).toBe("some-valid-configuration"); - }); - - it("does not show spinner", () => { - expect( - rendered.queryByTestId("install-chart-tab-spinner"), - ).not.toBeInTheDocument(); - }); - - it("when installing the chart, calls for installation with changed configuration", () => { - const installButton = rendered.getByTestId( - "install-chart-from-tab-for-some-first-tab-id", - ); - - fireEvent.click(installButton); - - expect(callForCreateHelmReleaseMock).toHaveBeenCalledWith({ - chart: "some-name", - name: undefined, - namespace: "default", - repo: "some-repository", - values: "some-valid-configuration", - version: "some-version", - }); - }); - - it("given version is changed, when default configuration resolves, defaults back to default configuration", async () => { - builder.select - .openMenu( - "install-chart-version-select-for-some-first-tab-id", - ) - .selectOption("some-other-version"); - - await callForHelmChartValuesMock.resolve( - "some-default-configuration-for-other-version", - ); - - const input = rendered.getByTestId( - "monaco-editor-for-some-first-tab-id", - ); - - expect(input).toHaveValue( - "some-default-configuration-for-other-version", - ); - }); - }); - - describe("given custom name is inputted", () => { - beforeEach(() => { - const input = rendered.getByTestId( - "install-chart-custom-name-input-for-some-first-tab-id", - ); - - fireEvent.change(input, { - target: { value: "some-custom-name" }, - }); - - }); - - it("stores the changed custom name", async () => { - const readJsonFile = rendererDi.inject(readJsonFileInjectable); - - const actual = await readJsonFile( - "/some-directory-for-lens-local-storage/some-cluster-id.json", - ) as any; - - const customName = actual.install_charts["some-first-tab-id"].releaseName; - - expect(customName).toBe("some-custom-name"); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("when installed, calls for installation with custom name", () => { - const installButton = rendered.getByTestId( - "install-chart-from-tab-for-some-first-tab-id", - ); - - fireEvent.click(installButton); - - expect(callForCreateHelmReleaseMock).toHaveBeenCalledWith({ - chart: "some-name", - name: "some-custom-name", - namespace: "default", - repo: "some-repository", - values: "some-default-configuration", - version: "some-version", - }); - }); - }); - }); - }); - }); -}); diff --git a/src/behaviours/tray/multiple-separators-originating-from-extension.test.ts b/src/behaviours/tray/multiple-separators-originating-from-extension.test.ts deleted file mode 100644 index 96b9f18198..0000000000 --- a/src/behaviours/tray/multiple-separators-originating-from-extension.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { LensMainExtension } from "../../extensions/lens-main-extension"; -import type { TrayMenuRegistration } from "../../main/tray/tray-menu-registration"; -import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; -import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; -import getRandomIdInjectable from "../../common/utils/get-random-id.injectable"; - -describe("multiple separators originating from extension", () => { - let applicationBuilder: ApplicationBuilder; - - beforeEach(async () => { - applicationBuilder = getApplicationBuilder(); - - applicationBuilder.beforeApplicationStart(({ mainDi }) => { - mainDi.unoverride(getRandomIdInjectable); - mainDi.permitSideEffects(getRandomIdInjectable); - }); - - await applicationBuilder.render(); - }); - - it("given extension with multiple separators, when extension is enabled, does not throw", () => { - const someExtension = new SomeTestExtension({ - id: "some-extension-id", - trayMenus: [{ type: "separator" }, { type: "separator" } ], - }); - - expect(() => { - applicationBuilder.extensions.main.enable(someExtension); - }).not.toThrow(); - }); -}); - -class SomeTestExtension extends LensMainExtension { - constructor({ id, trayMenus }: { - id: string; - trayMenus: TrayMenuRegistration[]; - }) { - super({ - id, - absolutePath: "irrelevant", - isBundled: false, - isCompatible: false, - isEnabled: false, - manifest: { name: id, version: "some-version", engines: { lens: "^5.5.0" }}, - manifestPath: "irrelevant", - }); - - this.trayMenus = trayMenus; - } -} diff --git a/src/common/app-paths/app-paths.test.ts b/src/common/app-paths/app-paths.test.ts index 5793295e0e..b5ec33059c 100644 --- a/src/common/app-paths/app-paths.test.ts +++ b/src/common/app-paths/app-paths.test.ts @@ -14,15 +14,10 @@ import { getApplicationBuilder } from "../../renderer/components/test-utils/get- import type { DiContainer } from "@ogre-tools/injectable"; describe("app-paths", () => { - let applicationBuilder: ApplicationBuilder; - let rendererDi: DiContainer; - let mainDi: DiContainer; + let builder: ApplicationBuilder; beforeEach(() => { - applicationBuilder = getApplicationBuilder(); - - rendererDi = applicationBuilder.dis.rendererDi; - mainDi = applicationBuilder.dis.mainDi; + builder = getApplicationBuilder(); const defaultAppPathsStub: AppPaths = { appData: "some-app-data", @@ -43,7 +38,7 @@ describe("app-paths", () => { userData: "some-irrelevant-user-data", }; - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { mainDi.override( getElectronAppPathInjectable, () => @@ -64,12 +59,18 @@ describe("app-paths", () => { }); describe("normally", () => { + let windowDi: DiContainer; + let mainDi: DiContainer; + beforeEach(async () => { - await applicationBuilder.render(); + await builder.render(); + + windowDi = builder.applicationWindow.only.di; + mainDi = builder.mainDi; }); it("given in renderer, when injecting app paths, returns application specific app paths", () => { - const actual = rendererDi.inject(appPathsInjectionToken); + const actual = windowDi.inject(appPathsInjectionToken); expect(actual).toEqual({ appData: "some-app-data", @@ -116,19 +117,23 @@ describe("app-paths", () => { }); describe("when running integration tests", () => { + let windowDi: DiContainer; + beforeEach(async () => { - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { mainDi.override( directoryForIntegrationTestingInjectable, () => "some-integration-testing-app-data", ); }); - await applicationBuilder.render(); + await builder.render(); + + windowDi = builder.applicationWindow.only.di; }); it("given in renderer, when injecting path for app data, has integration specific app data path", () => { - const { appData, userData } = rendererDi.inject(appPathsInjectionToken); + const { appData, userData } = windowDi.inject(appPathsInjectionToken); expect({ appData, userData }).toEqual({ appData: "some-integration-testing-app-data", @@ -137,7 +142,7 @@ describe("app-paths", () => { }); it("given in main, when injecting path for app data, has integration specific app data path", () => { - const { appData, userData } = rendererDi.inject(appPathsInjectionToken); + const { appData, userData } = windowDi.inject(appPathsInjectionToken); expect({ appData, userData }).toEqual({ appData: "some-integration-testing-app-data", diff --git a/src/common/cluster-store/cluster-store.global-override-for-injectable.ts b/src/common/cluster-store/cluster-store.global-override-for-injectable.ts new file mode 100644 index 0000000000..32a1ee62a1 --- /dev/null +++ b/src/common/cluster-store/cluster-store.global-override-for-injectable.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getGlobalOverride } from "../test-utils/get-global-override"; +import clusterStoreInjectable from "./cluster-store.injectable"; +import type { Cluster } from "../cluster/cluster"; +import type { ClusterStore } from "./cluster-store"; + +export default getGlobalOverride( + clusterStoreInjectable, + () => + ({ + provideInitialFromMain: () => {}, + getById: (id) => (void id, {}) as Cluster, + } as ClusterStore), +); diff --git a/src/common/utils/channel/channel.test.ts b/src/common/utils/channel/channel.test.ts index 84c1366f35..a3d6a805e2 100644 --- a/src/common/utils/channel/channel.test.ts +++ b/src/common/utils/channel/channel.test.ts @@ -4,13 +4,11 @@ */ import type { DiContainer } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable"; -import type { LensWindow } from "../../../main/start-main-application/lens-window/application-window/lens-window-injection-token"; -import { lensWindowInjectionToken } from "../../../main/start-main-application/lens-window/application-window/lens-window-injection-token"; import type { MessageToChannel } from "./message-to-channel-injection-token"; import { messageToChannelInjectionToken } from "./message-to-channel-injection-token"; +import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; -import createLensWindowInjectable from "../../../main/start-main-application/lens-window/application-window/create-lens-window.injectable"; -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 { messageChannelListenerInjectionToken } from "./message-channel-listener-injection-token"; import type { MessageChannel } from "./message-channel-injection-token"; import type { RequestFromChannel } from "./request-from-channel-injection-token"; @@ -30,12 +28,10 @@ describe("channel", () => { let messageListenerInWindowMock: jest.Mock; let mainDi: DiContainer; let messageToChannel: MessageToChannel; + let builder: ApplicationBuilder; beforeEach(async () => { - const applicationBuilder = getApplicationBuilder(); - - mainDi = applicationBuilder.dis.mainDi; - const rendererDi = applicationBuilder.dis.rendererDi; + builder = getApplicationBuilder(); messageListenerInWindowMock = jest.fn(); @@ -44,37 +40,34 @@ describe("channel", () => { instantiate: (di) => ({ channel: di.inject(testMessageChannelInjectable), - handler: messageListenerInWindowMock, }), injectionToken: messageChannelListenerInjectionToken, }); - rendererDi.register(testChannelListenerInTestWindowInjectable); + builder.beforeApplicationStart((mainDi) => { + mainDi.register(testMessageChannelInjectable); + }); - // Notice how test channel has presence in both DIs, being from common - mainDi.register(testMessageChannelInjectable); - rendererDi.register(testMessageChannelInjectable); + builder.beforeWindowStart((windowDi) => { + windowDi.register(testChannelListenerInTestWindowInjectable); + windowDi.register(testMessageChannelInjectable); + }); + + mainDi = builder.mainDi; + + await builder.startHidden(); testMessageChannel = mainDi.inject(testMessageChannelInjectable); - - messageToChannel = mainDi.inject( - messageToChannelInjectionToken, - ); - - await applicationBuilder.render(); - - const closeAllWindows = mainDi.inject(closeAllWindowsInjectable); - - closeAllWindows(); + messageToChannel = mainDi.inject(messageToChannelInjectionToken); }); describe("given window is started", () => { let someWindowFake: LensWindow; beforeEach(async () => { - someWindowFake = createTestWindow(mainDi, "some-window"); + someWindowFake = builder.applicationWindow.create("some-window"); await someWindowFake.start(); }); @@ -95,8 +88,8 @@ describe("channel", () => { }); it("given multiple started windows, when sending message, triggers listeners in all windows", async () => { - const someWindowFake = createTestWindow(mainDi, "some-window"); - const someOtherWindowFake = createTestWindow(mainDi, "some-other-window"); + const someWindowFake = builder.applicationWindow.create("some-window"); + const someOtherWindowFake = builder.applicationWindow.create("some-other-window"); await someWindowFake.start(); await someOtherWindowFake.start(); @@ -113,16 +106,11 @@ describe("channel", () => { describe("messaging from renderer to main, given listener for channel in a main and application has started", () => { let testMessageChannel: TestMessageChannel; let messageListenerInMainMock: jest.Mock; - let rendererDi: DiContainer; - let mainDi: DiContainer; let messageToChannel: MessageToChannel; beforeEach(async () => { const applicationBuilder = getApplicationBuilder(); - mainDi = applicationBuilder.dis.mainDi; - rendererDi = applicationBuilder.dis.rendererDi; - messageListenerInMainMock = jest.fn(); const testChannelListenerInMainInjectable = getInjectable({ @@ -137,19 +125,21 @@ describe("channel", () => { injectionToken: messageChannelListenerInjectionToken, }); - mainDi.register(testChannelListenerInMainInjectable); + applicationBuilder.beforeApplicationStart((mainDi) => { + mainDi.register(testChannelListenerInMainInjectable); + mainDi.register(testMessageChannelInjectable); + }); - // Notice how test channel has presence in both DIs, being from common - mainDi.register(testMessageChannelInjectable); - rendererDi.register(testMessageChannelInjectable); - - testMessageChannel = rendererDi.inject(testMessageChannelInjectable); - - messageToChannel = rendererDi.inject( - messageToChannelInjectionToken, - ); + applicationBuilder.beforeWindowStart((windowDi) => { + windowDi.register(testMessageChannelInjectable); + }); await applicationBuilder.render(); + + const windowDi = applicationBuilder.applicationWindow.only.di; + + testMessageChannel = windowDi.inject(testMessageChannelInjectable); + messageToChannel = windowDi.inject(messageToChannelInjectionToken); }); it("when sending message, triggers listener in main", () => { @@ -162,16 +152,11 @@ describe("channel", () => { describe("requesting from main in renderer, given listener for channel in a main and application has started", () => { let testRequestChannel: TestRequestChannel; let requestListenerInMainMock: AsyncFnMock<(arg: string) => string>; - let rendererDi: DiContainer; - let mainDi: DiContainer; let requestFromChannel: RequestFromChannel; beforeEach(async () => { const applicationBuilder = getApplicationBuilder(); - mainDi = applicationBuilder.dis.mainDi; - rendererDi = applicationBuilder.dis.rendererDi; - requestListenerInMainMock = asyncFn(); const testChannelListenerInMainInjectable = getInjectable({ @@ -186,19 +171,24 @@ describe("channel", () => { injectionToken: requestChannelListenerInjectionToken, }); - mainDi.register(testChannelListenerInMainInjectable); + applicationBuilder.beforeApplicationStart((mainDi) => { + mainDi.register(testChannelListenerInMainInjectable); + mainDi.register(testRequestChannelInjectable); + }); - // Notice how test channel has presence in both DIs, being from common - mainDi.register(testRequestChannelInjectable); - rendererDi.register(testRequestChannelInjectable); - - testRequestChannel = rendererDi.inject(testRequestChannelInjectable); - - requestFromChannel = rendererDi.inject( - requestFromChannelInjectionToken, - ); + applicationBuilder.beforeWindowStart((windowDi) => { + windowDi.register(testRequestChannelInjectable); + }); await applicationBuilder.render(); + + const windowDi = applicationBuilder.applicationWindow.only.di; + + testRequestChannel = windowDi.inject(testRequestChannelInjectable); + + requestFromChannel = windowDi.inject( + requestFromChannelInjectionToken, + ); }); describe("when requesting from channel", () => { @@ -245,29 +235,3 @@ const testRequestChannelInjectable = getInjectable({ }), }); -const createTestWindow = (di: DiContainer, id: string) => { - const testWindowInjectable = getInjectable({ - id, - - instantiate: (di) => { - const createLensWindow = di.inject(createLensWindowInjectable); - - return createLensWindow({ - id, - title: "Some test window", - defaultHeight: 42, - defaultWidth: 42, - getContentSource: () => ({ url: "some-content-url" }), - resizable: true, - windowFrameUtilitiesAreShown: false, - centered: false, - }); - }, - - injectionToken: lensWindowInjectionToken, - }); - - di.register(testWindowInjectable); - - return di.inject(testWindowInjectable); -}; diff --git a/src/common/utils/sync-box/sync-box.test.ts b/src/common/utils/sync-box/sync-box.test.ts index 2dccbd87a5..cfb8954802 100644 --- a/src/common/utils/sync-box/sync-box.test.ts +++ b/src/common/utils/sync-box/sync-box.test.ts @@ -2,13 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ +import type { DiContainer } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable"; import { observe, runInAction } from "mobx"; import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; import createSyncBoxInjectable from "./create-sync-box.injectable"; -import { flushPromises } from "../../test-utils/flush-promises"; import type { SyncBox } from "./sync-box-injection-token"; +import { syncBoxInjectionToken } from "./sync-box-injection-token"; describe("sync-box", () => { let applicationBuilder: ApplicationBuilder; @@ -16,19 +17,23 @@ describe("sync-box", () => { beforeEach(() => { applicationBuilder = getApplicationBuilder(); - applicationBuilder.dis.mainDi.register(someInjectable); - applicationBuilder.dis.rendererDi.register(someInjectable); + applicationBuilder.beforeApplicationStart(mainDi => { + mainDi.register(someInjectable); + }); + + applicationBuilder.beforeWindowStart((windowDi) => { + windowDi.register(someInjectable); + }); }); - // TODO: Separate starting for main application and starting of window in application builder - xdescribe("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 syncBoxInMain: SyncBox; beforeEach(async () => { - syncBoxInMain = applicationBuilder.dis.mainDi.inject(someInjectable); + await applicationBuilder.startHidden(); - // await applicationBuilder.start(); + syncBoxInMain = applicationBuilder.mainDi.inject(someInjectable); observe(syncBoxInMain.value, ({ newValue }) => { valueInMain = newValue as string; @@ -46,48 +51,28 @@ describe("sync-box", () => { describe("when window starts", () => { let valueInRenderer: string; let syncBoxInRenderer: SyncBox; + let rendererDi: DiContainer; - beforeEach(() => { - // applicationBuilder.renderWindow() + beforeEach(async () => { + const applicationWindow = + applicationBuilder.applicationWindow.create("some-window-id"); - syncBoxInRenderer = applicationBuilder.dis.rendererDi.inject(someInjectable); + await applicationWindow.start(); + + rendererDi = applicationWindow.di; + + syncBoxInRenderer = rendererDi.inject(someInjectable); observe(syncBoxInRenderer.value, ({ newValue }) => { valueInRenderer = newValue as string; }, true); }); - it("does not have the initial value yet", () => { - expect(valueInRenderer).toBe(undefined); + it("has the value from main", () => { + expect(valueInRenderer).toBe("some-value-from-main"); }); - describe("when getting initial value resolves", () => { - beforeEach(async () => { - await flushPromises(); - }); - - it("has value in renderer", () => { - expect(valueInRenderer).toBe("some-value-from-main"); - }); - - describe("when value is set from renderer", () => { - beforeEach(() => { - runInAction(() => { - syncBoxInRenderer.set("some-value-from-renderer"); - }); - }); - - it("has value in main", () => { - expect(valueInMain).toBe("some-value-from-renderer"); - }); - - it("has value in renderer", () => { - expect(valueInRenderer).toBe("some-value-from-renderer"); - }); - }); - }); - - describe("when value is set from renderer before getting initial value from main resolves", () => { + describe("when value is set from renderer", () => { beforeEach(() => { runInAction(() => { syncBoxInRenderer.set("some-value-from-renderer"); @@ -112,11 +97,13 @@ describe("sync-box", () => { let syncBoxInRenderer: SyncBox; beforeEach(async () => { - syncBoxInMain = applicationBuilder.dis.mainDi.inject(someInjectable); - syncBoxInRenderer = applicationBuilder.dis.rendererDi.inject(someInjectable); - await applicationBuilder.render(); + const applicationWindow = applicationBuilder.applicationWindow.only; + + syncBoxInMain = applicationBuilder.mainDi.inject(someInjectable); + syncBoxInRenderer = applicationWindow.di.inject(someInjectable); + observe(syncBoxInRenderer.value, ({ newValue }) => { valueInRenderer = newValue as string; }, true); @@ -176,4 +163,6 @@ const someInjectable = getInjectable({ return createSyncBox("some-sync-box", "some-initial-value"); }, + + injectionToken: syncBoxInjectionToken, }); diff --git a/src/behaviours/__snapshots__/extension-special-characters-in-page-registrations.test.tsx.snap b/src/features/__snapshots__/extension-special-characters-in-page-registrations.test.tsx.snap similarity index 100% rename from src/behaviours/__snapshots__/extension-special-characters-in-page-registrations.test.tsx.snap rename to src/features/__snapshots__/extension-special-characters-in-page-registrations.test.tsx.snap diff --git a/src/behaviours/__snapshots__/navigate-to-extension-page.test.tsx.snap b/src/features/__snapshots__/navigate-to-extension-page.test.tsx.snap similarity index 100% rename from src/behaviours/__snapshots__/navigate-to-extension-page.test.tsx.snap rename to src/features/__snapshots__/navigate-to-extension-page.test.tsx.snap diff --git a/src/behaviours/__snapshots__/navigating-between-routes.test.tsx.snap b/src/features/__snapshots__/navigating-between-routes.test.tsx.snap similarity index 100% rename from src/behaviours/__snapshots__/navigating-between-routes.test.tsx.snap rename to src/features/__snapshots__/navigating-between-routes.test.tsx.snap diff --git a/src/behaviours/add-cluster/__snapshots__/navigation-using-application-menu.test.tsx.snap b/src/features/add-cluster/__snapshots__/navigation-using-application-menu.test.tsx.snap similarity index 100% rename from src/behaviours/add-cluster/__snapshots__/navigation-using-application-menu.test.tsx.snap rename to src/features/add-cluster/__snapshots__/navigation-using-application-menu.test.tsx.snap diff --git a/src/behaviours/add-cluster/navigation-using-application-menu.test.tsx b/src/features/add-cluster/navigation-using-application-menu.test.tsx similarity index 100% rename from src/behaviours/add-cluster/navigation-using-application-menu.test.tsx rename to src/features/add-cluster/navigation-using-application-menu.test.tsx diff --git a/src/behaviours/application-update/__snapshots__/force-user-to-update-when-too-long-time-since-update-was-downloaded.test.ts.snap b/src/features/application-update/__snapshots__/force-user-to-update-when-too-long-time-since-update-was-downloaded.test.ts.snap similarity index 100% rename from src/behaviours/application-update/__snapshots__/force-user-to-update-when-too-long-time-since-update-was-downloaded.test.ts.snap rename to src/features/application-update/__snapshots__/force-user-to-update-when-too-long-time-since-update-was-downloaded.test.ts.snap diff --git a/src/behaviours/application-update/__snapshots__/installing-update-using-topbar-button.test.tsx.snap b/src/features/application-update/__snapshots__/installing-update-using-topbar-button.test.tsx.snap similarity index 100% rename from src/behaviours/application-update/__snapshots__/installing-update-using-topbar-button.test.tsx.snap rename to src/features/application-update/__snapshots__/installing-update-using-topbar-button.test.tsx.snap diff --git a/src/behaviours/application-update/__snapshots__/installing-update-using-tray.test.ts.snap b/src/features/application-update/__snapshots__/installing-update-using-tray.test.ts.snap similarity index 100% rename from src/behaviours/application-update/__snapshots__/installing-update-using-tray.test.ts.snap rename to src/features/application-update/__snapshots__/installing-update-using-tray.test.ts.snap diff --git a/src/behaviours/application-update/__snapshots__/installing-update.test.ts.snap b/src/features/application-update/__snapshots__/installing-update.test.ts.snap similarity index 100% rename from src/behaviours/application-update/__snapshots__/installing-update.test.ts.snap rename to src/features/application-update/__snapshots__/installing-update.test.ts.snap diff --git a/src/behaviours/application-update/__snapshots__/periodical-checking-of-updates.test.ts.snap b/src/features/application-update/__snapshots__/periodical-checking-of-updates.test.ts.snap similarity index 100% rename from src/behaviours/application-update/__snapshots__/periodical-checking-of-updates.test.ts.snap rename to src/features/application-update/__snapshots__/periodical-checking-of-updates.test.ts.snap diff --git a/src/behaviours/application-update/__snapshots__/selection-of-update-stability.test.ts.snap b/src/features/application-update/__snapshots__/selection-of-update-stability.test.ts.snap similarity index 100% rename from src/behaviours/application-update/__snapshots__/selection-of-update-stability.test.ts.snap rename to src/features/application-update/__snapshots__/selection-of-update-stability.test.ts.snap diff --git a/src/behaviours/application-update/analytics-for-installing-update.test.ts b/src/features/application-update/analytics-for-installing-update.test.ts similarity index 95% rename from src/behaviours/application-update/analytics-for-installing-update.test.ts rename to src/features/application-update/analytics-for-installing-update.test.ts index b72946f80d..7f451b0076 100644 --- a/src/behaviours/application-update/analytics-for-installing-update.test.ts +++ b/src/features/application-update/analytics-for-installing-update.test.ts @@ -21,7 +21,7 @@ import periodicalCheckForUpdatesInjectable from "../../main/application-update/p import { advanceFakeTime, useFakeTime } from "../../common/test-utils/use-fake-time"; describe("analytics for installing update", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let checkForPlatformUpdatesMock: AsyncFnMock; let downloadPlatformUpdateMock: AsyncFnMock; let analyticsListenerMock: jest.Mock; @@ -30,11 +30,11 @@ describe("analytics for installing update", () => { beforeEach(async () => { useFakeTime("2015-10-21T07:28:00Z"); - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); analyticsListenerMock = jest.fn(); - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart(mainDi => { mainDi.override(appVersionInjectable, () => "42.0.0"); checkForPlatformUpdatesMock = asyncFn(); @@ -56,7 +56,7 @@ describe("analytics for installing update", () => { eventBus.addListener(analyticsListenerMock); }); - mainDi = applicationBuilder.dis.mainDi; + mainDi = builder.mainDi; }); describe("given application is started and checking updates periodically", () => { @@ -64,7 +64,7 @@ describe("analytics for installing update", () => { mainDi.unoverride(periodicalCheckForUpdatesInjectable); mainDi.permitSideEffects(periodicalCheckForUpdatesInjectable); - await applicationBuilder.render(); + await builder.render(); }); @@ -101,7 +101,7 @@ describe("analytics for installing update", () => { beforeEach(async () => { analyticsListenerMock.mockClear(); - await applicationBuilder.render(); + await builder.render(); }); it("sends event to analytics about the current version", () => { @@ -119,7 +119,7 @@ describe("analytics for installing update", () => { it("when checking for updates using tray, sends event to analytics for being checked from tray", async () => { analyticsListenerMock.mockClear(); - applicationBuilder.tray.click("check-for-updates"); + builder.tray.click("check-for-updates"); expect(analyticsListenerMock.mock.calls).toEqual([ [ @@ -140,7 +140,7 @@ describe("analytics for installing update", () => { it("when checking for updates using application menu, sends event to analytics for being checked from application menu", async () => { analyticsListenerMock.mockClear(); - applicationBuilder.applicationMenu.click("root.check-for-updates"); + builder.applicationMenu.click("root.check-for-updates"); expect(analyticsListenerMock.mock.calls).toEqual([ [ diff --git a/src/behaviours/application-update/downgrading-version-update.test.ts b/src/features/application-update/downgrading-version-update.test.ts similarity index 96% rename from src/behaviours/application-update/downgrading-version-update.test.ts rename to src/features/application-update/downgrading-version-update.test.ts index b50d9c940b..0462bee3d4 100644 --- a/src/behaviours/application-update/downgrading-version-update.test.ts +++ b/src/features/application-update/downgrading-version-update.test.ts @@ -24,7 +24,7 @@ describe("downgrading version update", () => { beforeEach(() => { applicationBuilder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + applicationBuilder.beforeApplicationStart(mainDi => { checkForPlatformUpdatesMock = asyncFn(); mainDi.override( @@ -36,7 +36,7 @@ describe("downgrading version update", () => { mainDi.override(publishIsConfiguredInjectable, () => true); }); - mainDi = applicationBuilder.dis.mainDi; + mainDi = applicationBuilder.mainDi; }); [ diff --git a/src/behaviours/application-update/force-user-to-update-when-too-long-time-since-update-was-downloaded.test.ts b/src/features/application-update/force-user-to-update-when-too-long-time-since-update-was-downloaded.test.ts similarity index 91% rename from src/behaviours/application-update/force-user-to-update-when-too-long-time-since-update-was-downloaded.test.ts rename to src/features/application-update/force-user-to-update-when-too-long-time-since-update-was-downloaded.test.ts index df46617467..ba8380e7b5 100644 --- a/src/behaviours/application-update/force-user-to-update-when-too-long-time-since-update-was-downloaded.test.ts +++ b/src/features/application-update/force-user-to-update-when-too-long-time-since-update-was-downloaded.test.ts @@ -35,10 +35,7 @@ describe("force user to update when too long since update was downloaded", () => applicationBuilder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ mainDi, rendererDi }) => { - rendererDi.unoverride(forceUpdateModalRootFrameComponentInjectable); - rendererDi.permitSideEffects(forceUpdateModalRootFrameComponentInjectable); - + applicationBuilder.beforeApplicationStart(mainDi => { checkForPlatformUpdatesMock = asyncFn(); mainDi.override(checkForPlatformUpdatesInjectable, () => checkForPlatformUpdatesMock); @@ -50,13 +47,17 @@ describe("force user to update when too long since update was downloaded", () => quitAndInstallUpdateMock = jest.fn(); mainDi.override(quitAndInstallUpdateInjectable, () => quitAndInstallUpdateMock); - - rendererDi.override(timeAfterUpdateMustBeInstalledInjectable, () => TIME_AFTER_UPDATE_MUST_BE_INSTALLED); - - rendererDi.override(secondsAfterInstallStartsInjectable, () => TIME_AFTER_INSTALL_STARTS / 1000); }); - mainDi = applicationBuilder.dis.mainDi; + applicationBuilder.beforeWindowStart(windowDi => { + windowDi.unoverride(forceUpdateModalRootFrameComponentInjectable); + windowDi.permitSideEffects(forceUpdateModalRootFrameComponentInjectable); + + windowDi.override(timeAfterUpdateMustBeInstalledInjectable, () => TIME_AFTER_UPDATE_MUST_BE_INSTALLED); + windowDi.override(secondsAfterInstallStartsInjectable, () => TIME_AFTER_INSTALL_STARTS / 1000); + }); + + mainDi = applicationBuilder.mainDi; }); describe("when application is started", () => { diff --git a/src/behaviours/application-update/installing-update-using-topbar-button.test.tsx b/src/features/application-update/installing-update-using-topbar-button.test.tsx similarity index 92% rename from src/behaviours/application-update/installing-update-using-topbar-button.test.tsx rename to src/features/application-update/installing-update-using-topbar-button.test.tsx index c6ff69d145..5e5500498b 100644 --- a/src/behaviours/application-update/installing-update-using-topbar-button.test.tsx +++ b/src/features/application-update/installing-update-using-topbar-button.test.tsx @@ -33,7 +33,7 @@ describe("encourage user to update when sufficient time passed since update was applicationBuilder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + applicationBuilder.beforeApplicationStart((mainDi) => { checkForPlatformUpdatesMock = asyncFn(); downloadPlatformUpdateMock = asyncFn(); @@ -76,7 +76,7 @@ describe("encourage user to update when sufficient time passed since update was let processCheckingForUpdates: (source: string) => Promise<{ updateIsReadyToBeInstalled: boolean }>; beforeEach(async () => { - processCheckingForUpdates = applicationBuilder.dis.mainDi.inject( + processCheckingForUpdates = applicationBuilder.mainDi.inject( processCheckingForUpdatesInjectable, ); @@ -105,8 +105,15 @@ describe("encourage user to update when sufficient time passed since update was expect(button).toHaveAttribute("data-warning-level", "light"); }); - // TODO: Implement after starting main and renderer is separated in ApplicationBuilder - xit("given closing the application window, when starting the application window again, still shows the button", () => { + it("given closing the application window, when starting the application window again, still shows the button", async () => { + applicationBuilder.applicationWindow.closeAll(); + + const window = applicationBuilder.applicationWindow.create("some-window-id"); + + await window.start(); + + const button = window.rendered.queryByTestId("update-button"); + expect(button).toBeInTheDocument(); }); diff --git a/src/behaviours/application-update/installing-update-using-tray.test.ts b/src/features/application-update/installing-update-using-tray.test.ts similarity index 74% rename from src/behaviours/application-update/installing-update-using-tray.test.ts rename to src/features/application-update/installing-update-using-tray.test.ts index 1f8bf8992c..9bcb140638 100644 --- a/src/behaviours/application-update/installing-update-using-tray.test.ts +++ b/src/features/application-update/installing-update-using-tray.test.ts @@ -13,19 +13,18 @@ import type { AsyncFnMock } from "@async-fn/jest"; import asyncFn from "@async-fn/jest"; import type { DownloadPlatformUpdate } from "../../main/application-update/download-platform-update/download-platform-update.injectable"; import downloadPlatformUpdateInjectable from "../../main/application-update/download-platform-update/download-platform-update.injectable"; -import closeAllWindowsInjectable from "../../main/start-main-application/lens-window/hide-all-windows/close-all-windows.injectable"; -import applicationWindowInjectable from "../../main/start-main-application/lens-window/application-window/application-window.injectable"; -import type { LensWindow } from "../../main/start-main-application/lens-window/application-window/lens-window-injection-token"; +import type { LensWindow } from "../../main/start-main-application/lens-window/application-window/create-lens-window.injectable"; +import getCurrentApplicationWindowInjectable from "../../main/start-main-application/lens-window/application-window/get-current-application-window.injectable"; describe("installing update using tray", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let checkForPlatformUpdatesMock: AsyncFnMock; let downloadPlatformUpdateMock: AsyncFnMock; beforeEach(() => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { checkForPlatformUpdatesMock = asyncFn(); downloadPlatformUpdateMock = asyncFn(); @@ -48,7 +47,7 @@ describe("installing update using tray", () => { let rendered: RenderResult; beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders", () => { @@ -56,23 +55,20 @@ describe("installing update using tray", () => { }); it("user cannot install update yet", () => { - expect(applicationBuilder.tray.get("install-update")).toBeNull(); + expect(builder.tray.get("install-update")).toBeNull(); }); describe("given all application windows are closed, when checking for updates", () => { - let applicationWindow: LensWindow; - let closeAllWindows: () => void; + let getCurrentApplicationWindow: () => LensWindow | undefined; beforeEach(() => { - const mainDi = applicationBuilder.dis.mainDi; + getCurrentApplicationWindow = builder.mainDi.inject( + getCurrentApplicationWindowInjectable, + ); - closeAllWindows = mainDi.inject(closeAllWindowsInjectable); + builder.applicationWindow.closeAll(); - applicationWindow = mainDi.inject(applicationWindowInjectable); - - closeAllWindows(); - - applicationBuilder.tray.click("check-for-updates"); + builder.tray.click("check-for-updates"); }); describe("when check for update resolves with new update", () => { @@ -84,37 +80,44 @@ describe("installing update using tray", () => { }); it("does not show application window yet", () => { - expect(applicationWindow.isVisible).toBe(false); + const actual = getCurrentApplicationWindow(); + + expect(actual).toBeUndefined(); }); describe("when download of update resolves with success", () => { beforeEach(async () => { - await downloadPlatformUpdateMock.resolve({ downloadWasSuccessful: true }); }); it("shows the application window", () => { - expect(applicationWindow.isVisible).toBe(true); + const actual = getCurrentApplicationWindow(); + + expect(actual).not.toBeUndefined(); }); it("given closing application window again and checking for updates again using tray, when check resolves with same version that was earlier downloaded, shows the application window", async () => { - closeAllWindows(); + builder.applicationWindow.closeAll(); - applicationBuilder.tray.click("check-for-updates"); + builder.tray.click("check-for-updates"); await checkForPlatformUpdatesMock.resolve({ updateWasDiscovered: true, version: "some-version", }); - expect(applicationWindow.isVisible).toBe(true); + const actual = getCurrentApplicationWindow(); + + expect(actual).not.toBeUndefined(); }); }); it("when download of update resolves with failure, does not show the application window", async () => { await downloadPlatformUpdateMock.resolve({ downloadWasSuccessful: false }); - expect(applicationWindow.isVisible).toBe(false); + const actual = getCurrentApplicationWindow(); + + expect(actual).toBeUndefined(); }); }); @@ -123,29 +126,31 @@ describe("installing update using tray", () => { updateWasDiscovered: false, }); - expect(applicationWindow.isVisible).toBe(false); + const actual = getCurrentApplicationWindow(); + + expect(actual).toBeUndefined(); }); }); describe("when user checks for updates using tray", () => { beforeEach(() => { - applicationBuilder.tray.click("check-for-updates"); + builder.tray.click("check-for-updates"); }); it("user cannot check for updates again", () => { expect( - applicationBuilder.tray.get("check-for-updates")?.enabled, + builder.tray.get("check-for-updates")?.enabled, ).toBe(false); }); it("name of tray item for checking updates indicates that checking is happening", () => { expect( - applicationBuilder.tray.get("check-for-updates")?.label, + builder.tray.get("check-for-updates")?.label, ).toBe("Checking for updates..."); }); it("user cannot install update yet", () => { - expect(applicationBuilder.tray.get("install-update")).toBeNull(); + expect(builder.tray.get("install-update")).toBeNull(); }); it("renders", () => { @@ -160,18 +165,18 @@ describe("installing update using tray", () => { }); it("user cannot install update", () => { - expect(applicationBuilder.tray.get("install-update")).toBeNull(); + expect(builder.tray.get("install-update")).toBeNull(); }); it("user can check for updates again", () => { expect( - applicationBuilder.tray.get("check-for-updates")?.enabled, + builder.tray.get("check-for-updates")?.enabled, ).toBe(true); }); it("name of tray item for checking updates no longer indicates that checking is happening", () => { expect( - applicationBuilder.tray.get("check-for-updates")?.label, + builder.tray.get("check-for-updates")?.label, ).toBe("Check for updates"); }); @@ -190,13 +195,13 @@ describe("installing update using tray", () => { it("user cannot check for updates again yet", () => { expect( - applicationBuilder.tray.get("check-for-updates")?.enabled, + builder.tray.get("check-for-updates")?.enabled, ).toBe(false); }); it("name of tray item for checking updates indicates that downloading is happening", () => { expect( - applicationBuilder.tray.get("check-for-updates")?.label, + builder.tray.get("check-for-updates")?.label, ).toBe("Downloading update some-version (0%)..."); }); @@ -204,12 +209,12 @@ describe("installing update using tray", () => { downloadPlatformUpdateMock.mock.calls[0][0]({ percentage: 42.424242 }); expect( - applicationBuilder.tray.get("check-for-updates")?.label, + builder.tray.get("check-for-updates")?.label, ).toBe("Downloading update some-version (42%)..."); }); it("user still cannot install update", () => { - expect(applicationBuilder.tray.get("install-update")).toBeNull(); + expect(builder.tray.get("install-update")).toBeNull(); }); it("renders", () => { @@ -223,19 +228,19 @@ describe("installing update using tray", () => { it("user cannot install update", () => { expect( - applicationBuilder.tray.get("install-update"), + builder.tray.get("install-update"), ).toBeNull(); }); it("user can check for updates again", () => { expect( - applicationBuilder.tray.get("check-for-updates")?.enabled, + builder.tray.get("check-for-updates")?.enabled, ).toBe(true); }); it("name of tray item for checking updates no longer indicates that downloading is happening", () => { expect( - applicationBuilder.tray.get("check-for-updates")?.label, + builder.tray.get("check-for-updates")?.label, ).toBe("Check for updates"); }); @@ -251,19 +256,19 @@ describe("installing update using tray", () => { it("user can install update", () => { expect( - applicationBuilder.tray.get("install-update")?.label, + builder.tray.get("install-update")?.label, ).toBe("Install update some-version"); }); it("user can check for updates again", () => { expect( - applicationBuilder.tray.get("check-for-updates")?.enabled, + builder.tray.get("check-for-updates")?.enabled, ).toBe(true); }); it("name of tray item for checking updates no longer indicates that downloading is happening", () => { expect( - applicationBuilder.tray.get("check-for-updates")?.label, + builder.tray.get("check-for-updates")?.label, ).toBe("Check for updates"); }); diff --git a/src/behaviours/application-update/installing-update.test.ts b/src/features/application-update/installing-update.test.ts similarity index 90% rename from src/behaviours/application-update/installing-update.test.ts rename to src/features/application-update/installing-update.test.ts index efc7da8498..7063fcfaa1 100644 --- a/src/behaviours/application-update/installing-update.test.ts +++ b/src/features/application-update/installing-update.test.ts @@ -20,7 +20,7 @@ import { useFakeTime } from "../../common/test-utils/use-fake-time"; import staticFilesDirectoryInjectable from "../../common/vars/static-files-directory.injectable"; describe("installing update", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let quitAndInstallUpdateMock: jest.Mock; let checkForPlatformUpdatesMock: AsyncFnMock; let downloadPlatformUpdateMock: AsyncFnMock; @@ -29,9 +29,9 @@ describe("installing update", () => { beforeEach(() => { useFakeTime("2015-10-21T07:28:00Z"); - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { quitAndInstallUpdateMock = jest.fn(); checkForPlatformUpdatesMock = asyncFn(); downloadPlatformUpdateMock = asyncFn(); @@ -66,9 +66,9 @@ describe("installing update", () => { let processCheckingForUpdates: (source: string) => Promise<{ updateIsReadyToBeInstalled: boolean }>; beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); - processCheckingForUpdates = applicationBuilder.dis.mainDi.inject( + processCheckingForUpdates = builder.mainDi.inject( processCheckingForUpdatesInjectable, ); }); @@ -78,7 +78,7 @@ describe("installing update", () => { }); it("shows normal tray icon", () => { - expect(applicationBuilder.tray.getIconPath()).toBe( + expect(builder.tray.getIconPath()).toBe( "/some-static-files-directory/icons/trayIconTemplate.png", ); }); @@ -96,7 +96,7 @@ describe("installing update", () => { }); it("shows tray icon for checking for updates", () => { - expect(applicationBuilder.tray.getIconPath()).toBe( + expect(builder.tray.getIconPath()).toBe( "/some-static-files-directory/icons/trayIconCheckingForUpdatesTemplate.png", ); }); @@ -113,7 +113,7 @@ describe("installing update", () => { }); it("shows tray icon for normal", () => { - expect(applicationBuilder.tray.getIconPath()).toBe( + expect(builder.tray.getIconPath()).toBe( "/some-static-files-directory/icons/trayIconTemplate.png", ); }); @@ -140,7 +140,7 @@ describe("installing update", () => { }); it("still shows tray icon for downloading", () => { - expect(applicationBuilder.tray.getIconPath()).toBe( + expect(builder.tray.getIconPath()).toBe( "/some-static-files-directory/icons/trayIconCheckingForUpdatesTemplate.png", ); }); @@ -159,7 +159,7 @@ describe("installing update", () => { }); it("still shows normal tray icon", () => { - expect(applicationBuilder.tray.getIconPath()).toBe( + expect(builder.tray.getIconPath()).toBe( "/some-static-files-directory/icons/trayIconTemplate.png", ); }); @@ -179,7 +179,7 @@ describe("installing update", () => { }); it("shows tray icon for update being available", () => { - expect(applicationBuilder.tray.getIconPath()).toBe( + expect(builder.tray.getIconPath()).toBe( "/some-static-files-directory/icons/trayIconUpdateAvailableTemplate.png", ); }); @@ -196,7 +196,7 @@ describe("installing update", () => { }); it("shows tray icon for checking for updates", () => { - expect(applicationBuilder.tray.getIconPath()).toBe( + expect(builder.tray.getIconPath()).toBe( "/some-static-files-directory/icons/trayIconCheckingForUpdatesTemplate.png", ); }); @@ -214,7 +214,7 @@ describe("installing update", () => { }); it("shows tray icon for update being available", () => { - expect(applicationBuilder.tray.getIconPath()).toBe( + expect(builder.tray.getIconPath()).toBe( "/some-static-files-directory/icons/trayIconUpdateAvailableTemplate.png", ); }); @@ -233,7 +233,7 @@ describe("installing update", () => { }); it("shows tray icon for downloading update", () => { - expect(applicationBuilder.tray.getIconPath()).toBe( + expect(builder.tray.getIconPath()).toBe( "/some-static-files-directory/icons/trayIconCheckingForUpdatesTemplate.png", ); }); diff --git a/src/behaviours/application-update/periodical-checking-of-updates.test.ts b/src/features/application-update/periodical-checking-of-updates.test.ts similarity index 88% rename from src/behaviours/application-update/periodical-checking-of-updates.test.ts rename to src/features/application-update/periodical-checking-of-updates.test.ts index 997f46f8e9..e5c7b1c17c 100644 --- a/src/behaviours/application-update/periodical-checking-of-updates.test.ts +++ b/src/features/application-update/periodical-checking-of-updates.test.ts @@ -14,15 +14,15 @@ import { advanceFakeTime, useFakeTime } from "../../common/test-utils/use-fake-t const ENOUGH_TIME = 1000 * 60 * 60 * 2; describe("periodical checking of updates", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let processCheckingForUpdatesMock: jest.Mock; beforeEach(() => { useFakeTime("2015-10-21T07:28:00Z"); - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { mainDi.unoverride(periodicalCheckForUpdatesInjectable); mainDi.permitSideEffects(periodicalCheckForUpdatesInjectable); @@ -39,12 +39,12 @@ describe("periodical checking of updates", () => { let rendered: RenderResult; beforeEach(async () => { - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { mainDi.override(electronUpdaterIsActiveInjectable, () => true); mainDi.override(publishIsConfiguredInjectable, () => true); }); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders", () => { @@ -74,12 +74,12 @@ describe("periodical checking of updates", () => { describe("given updater is enabled but no configuration exist, when started", () => { beforeEach(async () => { - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { mainDi.override(electronUpdaterIsActiveInjectable, () => true); mainDi.override(publishIsConfiguredInjectable, () => false); }); - await applicationBuilder.render(); + await builder.render(); }); it("does not check for updates", () => { @@ -95,12 +95,12 @@ describe("periodical checking of updates", () => { describe("given updater is not enabled but and configuration exist, when started", () => { beforeEach(async () => { - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { mainDi.override(electronUpdaterIsActiveInjectable, () => false); mainDi.override(publishIsConfiguredInjectable, () => true); }); - await applicationBuilder.render(); + await builder.render(); }); it("does not check for updates", () => { diff --git a/src/behaviours/application-update/selection-of-update-stability.test.ts b/src/features/application-update/selection-of-update-stability.test.ts similarity index 86% rename from src/behaviours/application-update/selection-of-update-stability.test.ts rename to src/features/application-update/selection-of-update-stability.test.ts index c2407079df..56937ab0b4 100644 --- a/src/behaviours/application-update/selection-of-update-stability.test.ts +++ b/src/features/application-update/selection-of-update-stability.test.ts @@ -22,26 +22,25 @@ import setUpdateOnQuitInjectable from "../../main/electron-app/features/set-upda import showInfoNotificationInjectable from "../../renderer/components/notifications/show-info-notification.injectable"; import processCheckingForUpdatesInjectable from "../../main/application-update/check-for-updates/process-checking-for-updates.injectable"; import appVersionInjectable from "../../common/vars/app-version.injectable"; +import type { DiContainer } from "@ogre-tools/injectable"; describe("selection of update stability", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let quitAndInstallUpdateMock: jest.Mock; let checkForPlatformUpdatesMock: AsyncFnMock; let downloadPlatformUpdateMock: AsyncFnMock; let setUpdateOnQuitMock: jest.Mock; let showInfoNotificationMock: jest.Mock; + let mainDi: DiContainer; beforeEach(() => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ mainDi, rendererDi }) => { + builder.beforeApplicationStart((mainDi) => { quitAndInstallUpdateMock = jest.fn(); checkForPlatformUpdatesMock = asyncFn(); downloadPlatformUpdateMock = asyncFn(); setUpdateOnQuitMock = jest.fn(); - showInfoNotificationMock = jest.fn(() => () => {}); - - rendererDi.override(showInfoNotificationInjectable, () => showInfoNotificationMock); mainDi.override(setUpdateOnQuitInjectable, () => setUpdateOnQuitMock); @@ -63,6 +62,14 @@ describe("selection of update stability", () => { mainDi.override(electronUpdaterIsActiveInjectable, () => true); mainDi.override(publishIsConfiguredInjectable, () => true); }); + + builder.beforeWindowStart((windowDi) => { + showInfoNotificationMock = jest.fn(() => () => {}); + + windowDi.override(showInfoNotificationInjectable, () => showInfoNotificationMock); + }); + + mainDi = builder.mainDi; }); describe("when started", () => { @@ -70,9 +77,9 @@ describe("selection of update stability", () => { let processCheckingForUpdates: (source: string) => Promise<{ updateIsReadyToBeInstalled: boolean }>; beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); - processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); + processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); }); it("renders", () => { @@ -86,7 +93,7 @@ describe("selection of update stability", () => { }; beforeEach(() => { - selectedUpdateChannel = applicationBuilder.dis.mainDi.inject( + selectedUpdateChannel = mainDi.inject( selectedUpdateChannelInjectable, ); @@ -177,7 +184,7 @@ describe("selection of update stability", () => { }; beforeEach(() => { - selectedUpdateChannel = applicationBuilder.dis.mainDi.inject( + selectedUpdateChannel = mainDi.inject( selectedUpdateChannelInjectable, ); @@ -224,7 +231,7 @@ describe("selection of update stability", () => { }); it("given valid update channel selection is stored, when checking for updates, checks for updates from the update channel", async () => { - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { // TODO: Switch to more natural way of setting initial value // TODO: UserStore is currently responsible for getting and setting initial value const selectedUpdateChannel = mainDi.inject(selectedUpdateChannelInjectable); @@ -232,9 +239,9 @@ describe("selection of update stability", () => { selectedUpdateChannel.setValue(updateChannels.beta.id); }); - await applicationBuilder.render(); + await builder.render(); - const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); + const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); processCheckingForUpdates("irrelevant"); @@ -242,7 +249,7 @@ describe("selection of update stability", () => { }); it("given invalid update channel selection is stored, when checking for updates, checks for updates from the update channel", async () => { - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { // TODO: Switch to more natural way of setting initial value // TODO: UserStore is currently responsible for getting and setting initial value const selectedUpdateChannel = mainDi.inject(selectedUpdateChannelInjectable); @@ -250,9 +257,9 @@ describe("selection of update stability", () => { selectedUpdateChannel.setValue("something-invalid" as UpdateChannelId); }); - await applicationBuilder.render(); + await builder.render(); - const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); + const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); processCheckingForUpdates("irrelevant"); @@ -260,13 +267,13 @@ describe("selection of update stability", () => { }); it('given no update channel selection is stored and currently using stable release, when user checks for updates, checks for updates from "latest" update channel by default', async () => { - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { mainDi.override(appVersionInjectable, () => "1.0.0"); }); - await applicationBuilder.render(); + await builder.render(); - const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); + const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); processCheckingForUpdates("irrelevant"); @@ -277,13 +284,13 @@ describe("selection of update stability", () => { }); it('given no update channel selection is stored and currently using alpha release, when checking for updates, checks for updates from "alpha" channel', async () => { - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { mainDi.override(appVersionInjectable, () => "1.0.0-alpha"); }); - await applicationBuilder.render(); + await builder.render(); - const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); + const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); processCheckingForUpdates("irrelevant"); @@ -291,13 +298,13 @@ describe("selection of update stability", () => { }); it('given no update channel selection is stored and currently using beta release, when checking for updates, checks for updates from "beta" channel', async () => { - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { mainDi.override(appVersionInjectable, () => "1.0.0-beta"); }); - await applicationBuilder.render(); + await builder.render(); - const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); + const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); processCheckingForUpdates("irrelevant"); @@ -305,7 +312,7 @@ describe("selection of update stability", () => { }); it("given update channel selection is stored and currently using prerelease, when checking for updates, checks for updates from stored channel", async () => { - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + builder.beforeApplicationStart((mainDi) => { mainDi.override(appVersionInjectable, () => "1.0.0-alpha"); // TODO: Switch to more natural way of setting initial value @@ -315,9 +322,9 @@ describe("selection of update stability", () => { selectedUpdateChannel.setValue(updateChannels.beta.id); }); - await applicationBuilder.render(); + await builder.render(); - const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); + const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); processCheckingForUpdates("irrelevant"); diff --git a/src/behaviours/cluster/__snapshots__/order-of-sidebar-items.test.tsx.snap b/src/features/cluster/__snapshots__/order-of-sidebar-items.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/__snapshots__/order-of-sidebar-items.test.tsx.snap rename to src/features/cluster/__snapshots__/order-of-sidebar-items.test.tsx.snap diff --git a/src/behaviours/cluster/__snapshots__/sidebar-and-tab-navigation-for-core.test.tsx.snap b/src/features/cluster/__snapshots__/sidebar-and-tab-navigation-for-core.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/__snapshots__/sidebar-and-tab-navigation-for-core.test.tsx.snap rename to src/features/cluster/__snapshots__/sidebar-and-tab-navigation-for-core.test.tsx.snap diff --git a/src/behaviours/cluster/__snapshots__/sidebar-and-tab-navigation-for-extensions.test.tsx.snap b/src/features/cluster/__snapshots__/sidebar-and-tab-navigation-for-extensions.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/__snapshots__/sidebar-and-tab-navigation-for-extensions.test.tsx.snap rename to src/features/cluster/__snapshots__/sidebar-and-tab-navigation-for-extensions.test.tsx.snap diff --git a/src/behaviours/cluster/__snapshots__/visibility-of-sidebar-items.test.tsx.snap b/src/features/cluster/__snapshots__/visibility-of-sidebar-items.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/__snapshots__/visibility-of-sidebar-items.test.tsx.snap rename to src/features/cluster/__snapshots__/visibility-of-sidebar-items.test.tsx.snap diff --git a/src/behaviours/cluster/extension-api/__snapshots__/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx.snap b/src/features/cluster/extension-api/__snapshots__/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/extension-api/__snapshots__/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx.snap rename to src/features/cluster/extension-api/__snapshots__/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx.snap diff --git a/src/behaviours/cluster/extension-api/__snapshots__/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx.snap b/src/features/cluster/extension-api/__snapshots__/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/extension-api/__snapshots__/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx.snap rename to src/features/cluster/extension-api/__snapshots__/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx.snap diff --git a/src/behaviours/cluster/extension-api/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx b/src/features/cluster/extension-api/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx similarity index 89% rename from src/behaviours/cluster/extension-api/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx rename to src/features/cluster/extension-api/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx index c6c3cd7fab..0c69f49f80 100644 --- a/src/behaviours/cluster/extension-api/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx +++ b/src/features/cluster/extension-api/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx @@ -8,7 +8,6 @@ import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; import type { TestExtensionRenderer } from "../../../renderer/components/test-utils/get-extension-fake"; -import { getExtensionFakeFor } from "../../../renderer/components/test-utils/get-extension-fake"; import type { KubernetesCluster } from "../../../common/catalog-entities"; import React from "react"; import extensionShouldBeEnabledForClusterFrameInjectable from "../../../renderer/extension-loader/extension-should-be-enabled-for-cluster-frame.injectable"; @@ -24,13 +23,13 @@ describe("disable-cluster-pages-when-cluster-is-not-relevant", () => { builder.setEnvironmentToClusterFrame(); - builder.dis.rendererDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); - - const getExtensionFake = getExtensionFakeFor(builder); + builder.beforeWindowStart((windowDi) => { + windowDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); + }); isEnabledForClusterMock = asyncFn(); - const testExtension = getExtensionFake({ + const testExtension = { id: "test-extension-id", name: "test-extension", @@ -43,13 +42,14 @@ describe("disable-cluster-pages-when-cluster-is-not-relevant", () => { }, }], }, - }); - - rendererTestExtension = testExtension.renderer; + }; rendered = await builder.render(); builder.extensions.enable(testExtension); + + rendererTestExtension = + builder.extensions.get("test-extension-id").applicationWindows.only; }); describe("given not yet known if extension should be enabled for the cluster, when navigating", () => { diff --git a/src/behaviours/cluster/extension-api/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx b/src/features/cluster/extension-api/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx similarity index 91% rename from src/behaviours/cluster/extension-api/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx rename to src/features/cluster/extension-api/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx index 28007355b1..f94a0049d9 100644 --- a/src/behaviours/cluster/extension-api/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx +++ b/src/features/cluster/extension-api/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx @@ -7,7 +7,6 @@ import asyncFn from "@async-fn/jest"; import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; -import { getExtensionFakeFor } from "../../../renderer/components/test-utils/get-extension-fake"; import type { KubernetesCluster } from "../../../common/catalog-entities"; import React from "react"; import extensionShouldBeEnabledForClusterFrameInjectable from "../../../renderer/extension-loader/extension-should-be-enabled-for-cluster-frame.injectable"; @@ -22,13 +21,13 @@ describe("disable sidebar items when cluster is not relevant", () => { builder.setEnvironmentToClusterFrame(); - builder.dis.rendererDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); - - const getExtensionFake = getExtensionFakeFor(builder); + builder.beforeWindowStart((windowDi) => { + windowDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); + }); isEnabledForClusterMock = asyncFn(); - const testExtension = getExtensionFake({ + const testExtension = { id: "test-extension-id", name: "test-extension", @@ -52,7 +51,7 @@ describe("disable sidebar items when cluster is not relevant", () => { }, ], }, - }); + }; rendered = await builder.render(); diff --git a/src/behaviours/cluster/extension-api/reactively-disable-cluster-pages.test.tsx b/src/features/cluster/extension-api/reactively-disable-cluster-pages.test.tsx similarity index 80% rename from src/behaviours/cluster/extension-api/reactively-disable-cluster-pages.test.tsx rename to src/features/cluster/extension-api/reactively-disable-cluster-pages.test.tsx index 4cc5e45576..57dc83d810 100644 --- a/src/behaviours/cluster/extension-api/reactively-disable-cluster-pages.test.tsx +++ b/src/features/cluster/extension-api/reactively-disable-cluster-pages.test.tsx @@ -9,24 +9,21 @@ import React from "react"; import type { TestExtensionRenderer } from "../../../renderer/components/test-utils/get-extension-fake"; import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; -import { getExtensionFakeFor } from "../../../renderer/components/test-utils/get-extension-fake"; describe("reactively disable cluster pages", () => { let builder: ApplicationBuilder; let rendered: RenderResult; let someObservable: IObservableValue; - let rendererTestExtension: TestExtensionRenderer; + let testExtensionInstance: TestExtensionRenderer; beforeEach(async () => { builder = getApplicationBuilder(); builder.setEnvironmentToClusterFrame(); - const getExtensionFake = getExtensionFakeFor(builder); - someObservable = observable.box(false); - const testExtension = getExtensionFake({ + const testExtensionOptions = { id: "test-extension-id", name: "test-extension", @@ -39,17 +36,18 @@ describe("reactively disable cluster pages", () => { enabled: computed(() => someObservable.get()), }], }, - }); + }; rendered = await builder.render(); - builder.extensions.enable(testExtension); + builder.extensions.enable(testExtensionOptions); - rendererTestExtension = testExtension.renderer; + testExtensionInstance = + builder.extensions.get("test-extension-id").applicationWindows.only; }); it("when navigating to the page, does not show the page", () => { - rendererTestExtension.navigate(); + testExtensionInstance.navigate(); const actual = rendered.queryByTestId("some-test-page"); @@ -61,7 +59,7 @@ describe("reactively disable cluster pages", () => { someObservable.set(true); }); - rendererTestExtension.navigate(); + testExtensionInstance.navigate(); const actual = rendered.queryByTestId("some-test-page"); diff --git a/src/behaviours/cluster/kube-object-details/extension-api/__snapshots__/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx.snap b/src/features/cluster/kube-object-details/extension-api/__snapshots__/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/kube-object-details/extension-api/__snapshots__/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx.snap rename to src/features/cluster/kube-object-details/extension-api/__snapshots__/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx.snap diff --git a/src/behaviours/cluster/kube-object-details/extension-api/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx b/src/features/cluster/kube-object-details/extension-api/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx similarity index 88% rename from src/behaviours/cluster/kube-object-details/extension-api/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx rename to src/features/cluster/kube-object-details/extension-api/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx index a81071ad3e..90660f980f 100644 --- a/src/behaviours/cluster/kube-object-details/extension-api/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx +++ b/src/features/cluster/kube-object-details/extension-api/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx @@ -8,7 +8,6 @@ import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; import type { KubernetesCluster } from "../../../../common/catalog-entities"; import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; -import { getExtensionFakeFor } from "../../../../renderer/components/test-utils/get-extension-fake"; import { getInjectable } from "@ogre-tools/injectable"; import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token"; import { computed } from "mobx"; @@ -30,9 +29,10 @@ describe("disable kube object detail items when cluster is not relevant", () => beforeEach(async () => { builder = getApplicationBuilder(); + builder.setEnvironmentToClusterFrame(); - builder.beforeApplicationStart(({ rendererDi }) => { - rendererDi.override( + builder.beforeWindowStart((windowDi) => { + windowDi.override( apiManagerInjectable, () => ({ @@ -42,21 +42,15 @@ describe("disable kube object detail items when cluster is not relevant", () => }), } as unknown as ApiManager), ); + + windowDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); + + windowDi.register(testRouteInjectable, testRouteComponentInjectable); }); - const rendererDi = builder.dis.rendererDi; - - rendererDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); - - rendererDi.register(testRouteInjectable, testRouteComponentInjectable); - - builder.setEnvironmentToClusterFrame(); - - const getExtensionFake = getExtensionFakeFor(builder); - isEnabledForClusterMock = asyncFn(); - const testExtension = getExtensionFake({ + const testExtension = { id: "test-extension-id", name: "test-extension", @@ -77,12 +71,14 @@ describe("disable kube object detail items when cluster is not relevant", () => }, ], }, - }); + }; rendered = await builder.render(); - const navigateToRoute = rendererDi.inject(navigateToRouteInjectionToken); - const testRoute = rendererDi.inject(testRouteInjectable); + const windowDi = builder.applicationWindow.only.di; + + const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken); + const testRoute = windowDi.inject(testRouteInjectable); navigateToRoute(testRoute); diff --git a/src/behaviours/cluster/kube-object-details/extension-api/reactively-hide-kube-object-detail-item.test.tsx b/src/features/cluster/kube-object-details/extension-api/reactively-hide-kube-object-detail-item.test.tsx similarity index 87% rename from src/behaviours/cluster/kube-object-details/extension-api/reactively-hide-kube-object-detail-item.test.tsx rename to src/features/cluster/kube-object-details/extension-api/reactively-hide-kube-object-detail-item.test.tsx index 77c9c24552..5ca5961778 100644 --- a/src/behaviours/cluster/kube-object-details/extension-api/reactively-hide-kube-object-detail-item.test.tsx +++ b/src/features/cluster/kube-object-details/extension-api/reactively-hide-kube-object-detail-item.test.tsx @@ -5,7 +5,6 @@ import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; -import { getExtensionFakeFor } from "../../../../renderer/components/test-utils/get-extension-fake"; import { getInjectable } from "@ogre-tools/injectable"; import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token"; import type { IObservableValue } from "mobx"; @@ -26,8 +25,10 @@ describe("reactively hide kube object detail item", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ rendererDi }) => { - rendererDi.override( + builder.setEnvironmentToClusterFrame(); + + builder.beforeWindowStart((windowDi) => { + windowDi.override( apiManagerInjectable, () => ({ @@ -37,19 +38,13 @@ describe("reactively hide kube object detail item", () => { }), } as unknown as ApiManager), ); + + windowDi.register(testRouteInjectable, testRouteComponentInjectable); }); - const rendererDi = builder.dis.rendererDi; - - rendererDi.register(testRouteInjectable, testRouteComponentInjectable); - - builder.setEnvironmentToClusterFrame(); - - const getExtensionFake = getExtensionFakeFor(builder); - someObservable = observable.box(false); - const testExtension = getExtensionFake({ + const testExtension = { id: "test-extension-id", name: "test-extension", @@ -71,12 +66,14 @@ describe("reactively hide kube object detail item", () => { }, ], }, - }); + }; rendered = await builder.render(); - const navigateToRoute = rendererDi.inject(navigateToRouteInjectionToken); - const testRoute = rendererDi.inject(testRouteInjectable); + const windowDi = builder.applicationWindow.only.di; + + const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken); + const testRoute = windowDi.inject(testRouteInjectable); navigateToRoute(testRoute); diff --git a/src/behaviours/cluster/kube-object-menu/extension-api/__snapshots__/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx.snap b/src/features/cluster/kube-object-menu/extension-api/__snapshots__/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/kube-object-menu/extension-api/__snapshots__/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx.snap rename to src/features/cluster/kube-object-menu/extension-api/__snapshots__/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx.snap diff --git a/src/behaviours/cluster/kube-object-menu/extension-api/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx b/src/features/cluster/kube-object-menu/extension-api/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx similarity index 89% rename from src/behaviours/cluster/kube-object-menu/extension-api/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx rename to src/features/cluster/kube-object-menu/extension-api/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx index 8b48d76160..94bd91681f 100644 --- a/src/behaviours/cluster/kube-object-menu/extension-api/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx +++ b/src/features/cluster/kube-object-menu/extension-api/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx @@ -8,7 +8,6 @@ import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; import type { KubernetesCluster } from "../../../../common/catalog-entities"; import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; -import { getExtensionFakeFor } from "../../../../renderer/components/test-utils/get-extension-fake"; import { getInjectable } from "@ogre-tools/injectable"; import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token"; import { computed } from "mobx"; @@ -29,19 +28,16 @@ describe("disable kube object menu items when cluster is not relevant", () => { beforeEach(async () => { builder = getApplicationBuilder(); - const rendererDi = builder.dis.rendererDi; - - rendererDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); - - rendererDi.register(testRouteInjectable, testRouteComponentInjectable); - builder.setEnvironmentToClusterFrame(); - const getExtensionFake = getExtensionFakeFor(builder); + builder.beforeWindowStart((windowDi) => { + windowDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); + windowDi.register(testRouteInjectable, testRouteComponentInjectable); + }); isEnabledForClusterMock = asyncFn(); - const testExtension = getExtensionFake({ + const testExtension = { id: "test-extension-id", name: "test-extension", @@ -60,12 +56,14 @@ describe("disable kube object menu items when cluster is not relevant", () => { }, ], }, - }); + }; rendered = await builder.render(); - const navigateToRoute = rendererDi.inject(navigateToRouteInjectionToken); - const testRoute = rendererDi.inject(testRouteInjectable); + const windowDi = builder.applicationWindow.only.di; + + const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken); + const testRoute = windowDi.inject(testRouteInjectable); navigateToRoute(testRoute); diff --git a/src/behaviours/cluster/kube-object-menu/extension-api/reactively-hide-kube-object-menu-item.test.tsx b/src/features/cluster/kube-object-menu/extension-api/reactively-hide-kube-object-menu-item.test.tsx similarity index 88% rename from src/behaviours/cluster/kube-object-menu/extension-api/reactively-hide-kube-object-menu-item.test.tsx rename to src/features/cluster/kube-object-menu/extension-api/reactively-hide-kube-object-menu-item.test.tsx index 74f33a657a..61a5fe6e90 100644 --- a/src/behaviours/cluster/kube-object-menu/extension-api/reactively-hide-kube-object-menu-item.test.tsx +++ b/src/features/cluster/kube-object-menu/extension-api/reactively-hide-kube-object-menu-item.test.tsx @@ -5,7 +5,6 @@ import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; -import { getExtensionFakeFor } from "../../../../renderer/components/test-utils/get-extension-fake"; import { getInjectable } from "@ogre-tools/injectable"; import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token"; import type { IObservableValue } from "mobx"; @@ -24,17 +23,15 @@ describe("reactively hide kube object menu item", () => { beforeEach(async () => { builder = getApplicationBuilder(); - const rendererDi = builder.dis.rendererDi; - - rendererDi.register(testRouteInjectable, testRouteComponentInjectable); - builder.setEnvironmentToClusterFrame(); - const getExtensionFake = getExtensionFakeFor(builder); + builder.beforeWindowStart((windowDi) => { + windowDi.register(testRouteInjectable, testRouteComponentInjectable); + }); someObservable = observable.box(false); - const testExtension = getExtensionFake({ + const testExtension = { id: "test-extension-id", name: "test-extension", @@ -53,12 +50,14 @@ describe("reactively hide kube object menu item", () => { }, ], }, - }); + }; rendered = await builder.render(); - const navigateToRoute = rendererDi.inject(navigateToRouteInjectionToken); - const testRoute = rendererDi.inject(testRouteInjectable); + const windowDi = builder.applicationWindow.only.di; + + const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken); + const testRoute = windowDi.inject(testRouteInjectable); navigateToRoute(testRoute); diff --git a/src/behaviours/cluster/kube-object-status-icon/__snapshots__/show-status-for-a-kube-object.test.tsx.snap b/src/features/cluster/kube-object-status-icon/__snapshots__/show-status-for-a-kube-object.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/kube-object-status-icon/__snapshots__/show-status-for-a-kube-object.test.tsx.snap rename to src/features/cluster/kube-object-status-icon/__snapshots__/show-status-for-a-kube-object.test.tsx.snap diff --git a/src/behaviours/cluster/kube-object-status-icon/extension-api/__snapshots__/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx.snap b/src/features/cluster/kube-object-status-icon/extension-api/__snapshots__/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/kube-object-status-icon/extension-api/__snapshots__/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx.snap rename to src/features/cluster/kube-object-status-icon/extension-api/__snapshots__/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx.snap diff --git a/src/behaviours/cluster/kube-object-status-icon/extension-api/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx b/src/features/cluster/kube-object-status-icon/extension-api/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx similarity index 89% rename from src/behaviours/cluster/kube-object-status-icon/extension-api/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx rename to src/features/cluster/kube-object-status-icon/extension-api/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx index da3ac641a9..7a459c258d 100644 --- a/src/behaviours/cluster/kube-object-status-icon/extension-api/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx +++ b/src/features/cluster/kube-object-status-icon/extension-api/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx @@ -8,7 +8,6 @@ import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; import type { KubernetesCluster } from "../../../../common/catalog-entities"; import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; -import { getExtensionFakeFor } from "../../../../renderer/components/test-utils/get-extension-fake"; import { getInjectable } from "@ogre-tools/injectable"; import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token"; import { computed } from "mobx"; @@ -30,19 +29,16 @@ describe("disable kube object statuses when cluster is not relevant", () => { beforeEach(async () => { builder = getApplicationBuilder(); - const rendererDi = builder.dis.rendererDi; - - rendererDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); - - rendererDi.register(testRouteInjectable, testRouteComponentInjectable); - builder.setEnvironmentToClusterFrame(); - const getExtensionFake = getExtensionFakeFor(builder); + builder.beforeWindowStart((windowDi) => { + windowDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); + windowDi.register(testRouteInjectable, testRouteComponentInjectable); + }); isEnabledForClusterMock = asyncFn(); - const testExtension = getExtensionFake({ + const testExtension = { id: "test-extension-id", name: "test-extension", @@ -61,12 +57,14 @@ describe("disable kube object statuses when cluster is not relevant", () => { }, ], }, - }); + }; rendered = await builder.render(); - const navigateToRoute = rendererDi.inject(navigateToRouteInjectionToken); - const testRoute = rendererDi.inject(testRouteInjectable); + const windowDi = builder.applicationWindow.only.di; + + const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken); + const testRoute = windowDi.inject(testRouteInjectable); navigateToRoute(testRoute); diff --git a/src/behaviours/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx b/src/features/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx similarity index 87% rename from src/behaviours/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx rename to src/features/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx index 3c9695d8fa..7dd45803a2 100644 --- a/src/behaviours/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx +++ b/src/features/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx @@ -5,7 +5,6 @@ import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; -import { getExtensionFakeFor } from "../../../../renderer/components/test-utils/get-extension-fake"; import { getInjectable } from "@ogre-tools/injectable"; import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token"; import type { IObservableValue } from "mobx"; @@ -26,19 +25,16 @@ describe("reactively hide kube object status", () => { beforeEach(async () => { builder = getApplicationBuilder(); - const rendererDi = builder.dis.rendererDi; - - rendererDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); - - rendererDi.register(testRouteInjectable, testRouteComponentInjectable); - builder.setEnvironmentToClusterFrame(); - const getExtensionFake = getExtensionFakeFor(builder); + builder.beforeWindowStart((windowDi) => { + windowDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); + windowDi.register(testRouteInjectable, testRouteComponentInjectable); + }); someObservable = observable.box(false); - const testExtension = getExtensionFake({ + const testExtension = { id: "test-extension-id", name: "test-extension", @@ -57,12 +53,14 @@ describe("reactively hide kube object status", () => { }, ], }, - }); + }; rendered = await builder.render(); - const navigateToRoute = rendererDi.inject(navigateToRouteInjectionToken); - const testRoute = rendererDi.inject(testRouteInjectable); + const windowDi = builder.applicationWindow.only.di; + + const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken); + const testRoute = windowDi.inject(testRouteInjectable); navigateToRoute(testRoute); diff --git a/src/behaviours/cluster/kube-object-status-icon/show-status-for-a-kube-object.test.tsx b/src/features/cluster/kube-object-status-icon/show-status-for-a-kube-object.test.tsx similarity index 92% rename from src/behaviours/cluster/kube-object-status-icon/show-status-for-a-kube-object.test.tsx rename to src/features/cluster/kube-object-status-icon/show-status-for-a-kube-object.test.tsx index a63344271d..eba681ef47 100644 --- a/src/behaviours/cluster/kube-object-status-icon/show-status-for-a-kube-object.test.tsx +++ b/src/features/cluster/kube-object-status-icon/show-status-for-a-kube-object.test.tsx @@ -32,8 +32,6 @@ describe("show status for a kube object", () => { builder = getApplicationBuilder(); - const rendererDi = builder.dis.rendererDi; - infoStatusIsShown = false; const infoStatusInjectable = getInjectable({ @@ -95,34 +93,36 @@ describe("show status for a kube object", () => { }), }); - rendererDi.register( - testRouteInjectable, - testRouteComponentInjectable, - infoStatusInjectable, - warningStatusInjectable, - criticalStatusInjectable, - someAtomInjectable, - ); + builder.beforeWindowStart((windowDi) => { + windowDi.register( + testRouteInjectable, + testRouteComponentInjectable, + infoStatusInjectable, + warningStatusInjectable, + criticalStatusInjectable, + someAtomInjectable, + ); + }); builder.setEnvironmentToClusterFrame(); }); describe("given application starts and in test page", () => { - let rendererDi: DiContainer; + let windowDi: DiContainer; let rendered: RenderResult; let rerenderParent: () => void; beforeEach(async () => { rendered = await builder.render(); - rendererDi = builder.dis.rendererDi; + windowDi = builder.applicationWindow.only.di; - const someAtom = rendererDi.inject(someAtomInjectable); + const someAtom = windowDi.inject(someAtomInjectable); rerenderParent = rerenderParentFor(someAtom); - const navigateToRoute = rendererDi.inject(navigateToRouteInjectionToken); - const testRoute = rendererDi.inject(testRouteInjectable); + const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken); + const testRoute = windowDi.inject(testRouteInjectable); navigateToRoute(testRoute); }); @@ -141,7 +141,7 @@ describe("show status for a kube object", () => { describe("when status for irrelevant kube object kind emerges", () => { beforeEach(() => { - rendererDi.register(statusForIrrelevantKubeObjectKindInjectable); + windowDi.register(statusForIrrelevantKubeObjectKindInjectable); rerenderParent(); }); @@ -161,7 +161,7 @@ describe("show status for a kube object", () => { describe("when status for irrelevant kube object api version emerges", () => { beforeEach(() => { - rendererDi.register(statusForIrrelevantKubeObjectApiVersionInjectable); + windowDi.register(statusForIrrelevantKubeObjectApiVersionInjectable); rerenderParent(); }); diff --git a/src/behaviours/cluster/namespaces/__snapshots__/edit-namespace-from-new-tab.test.tsx.snap b/src/features/cluster/namespaces/__snapshots__/edit-namespace-from-new-tab.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/namespaces/__snapshots__/edit-namespace-from-new-tab.test.tsx.snap rename to src/features/cluster/namespaces/__snapshots__/edit-namespace-from-new-tab.test.tsx.snap diff --git a/src/behaviours/cluster/namespaces/__snapshots__/edit-namespace-from-previously-opened-tab.test.tsx.snap b/src/features/cluster/namespaces/__snapshots__/edit-namespace-from-previously-opened-tab.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/namespaces/__snapshots__/edit-namespace-from-previously-opened-tab.test.tsx.snap rename to src/features/cluster/namespaces/__snapshots__/edit-namespace-from-previously-opened-tab.test.tsx.snap diff --git a/src/behaviours/cluster/namespaces/edit-namespace-from-new-tab.test.tsx b/src/features/cluster/namespaces/edit-namespace-from-new-tab.test.tsx similarity index 97% rename from src/behaviours/cluster/namespaces/edit-namespace-from-new-tab.test.tsx rename to src/features/cluster/namespaces/edit-namespace-from-new-tab.test.tsx index 41ff722bfb..efe0cdf554 100644 --- a/src/behaviours/cluster/namespaces/edit-namespace-from-new-tab.test.tsx +++ b/src/features/cluster/namespaces/edit-namespace-from-new-tab.test.tsx @@ -44,34 +44,34 @@ describe("cluster/namespaces - edit namespace from new tab", () => { showSuccessNotificationMock = jest.fn(); showErrorNotificationMock = jest.fn(); - builder.beforeApplicationStart(({ rendererDi }) => { - rendererDi.override( + builder.beforeWindowStart((windowDi) => { + windowDi.override( directoryForLensLocalStorageInjectable, () => "/some-directory-for-lens-local-storage", ); - rendererDi.override(hostedClusterIdInjectable, () => "some-cluster-id"); + windowDi.override(hostedClusterIdInjectable, () => "some-cluster-id"); - storagesAreReady = controlWhenStoragesAreReady(rendererDi); + storagesAreReady = controlWhenStoragesAreReady(windowDi); - rendererDi.override( + windowDi.override( showSuccessNotificationInjectable, () => showSuccessNotificationMock, ); - rendererDi.override( + windowDi.override( showErrorNotificationInjectable, () => showErrorNotificationMock, ); - rendererDi.override(getRandomIdForEditResourceTabInjectable, () => + windowDi.override(getRandomIdForEditResourceTabInjectable, () => jest .fn(() => "some-irrelevant-random-id") .mockReturnValueOnce("some-first-tab-id") .mockReturnValueOnce("some-second-tab-id"), ); - rendererDi.override(callForResourceInjectable, () => async (selfLink: string) => { + windowDi.override(callForResourceInjectable, () => async (selfLink: string) => { if ( [ "/apis/some-api-version/namespaces/some-uid", @@ -84,7 +84,7 @@ describe("cluster/namespaces - edit namespace from new tab", () => { return undefined; }); - rendererDi.override(callForPatchResourceInjectable, () => async (namespace, ...args) => { + windowDi.override(callForPatchResourceInjectable, () => async (namespace, ...args) => { if ( [ "/apis/some-api-version/namespaces/some-uid", @@ -103,22 +103,22 @@ describe("cluster/namespaces - edit namespace from new tab", () => { describe("when navigating to namespaces", () => { let rendered: RenderResult; - let rendererDi: DiContainer; + let windowDi: DiContainer; beforeEach(async () => { rendered = await builder.render(); await storagesAreReady(); - rendererDi = builder.dis.rendererDi; + windowDi = builder.applicationWindow.only.di; - const navigateToNamespaces = rendererDi.inject( + const navigateToNamespaces = windowDi.inject( navigateToNamespacesInjectable, ); navigateToNamespaces(); - const dockStore = rendererDi.inject(dockStoreInjectable); + const dockStore = windowDi.inject(dockStoreInjectable); // TODO: Make TerminalWindow unit testable to allow realistic behaviour dockStore.closeTab("terminal"); @@ -168,7 +168,7 @@ describe("cluster/namespaces - edit namespace from new tab", () => { // TODO: Make implementation match the description (tests above) const namespaceStub = new Namespace(someNamespaceDataStub); - const createEditResourceTab = rendererDi.inject(createEditResourceTabInjectable); + const createEditResourceTab = windowDi.inject(createEditResourceTabInjectable); createEditResourceTab(namespaceStub); }); @@ -510,7 +510,7 @@ metadata: }); it("stores the changed configuration", async () => { - const readJsonFile = rendererDi.inject( + const readJsonFile = windowDi.inject( readJsonFileInjectable, ); @@ -719,7 +719,7 @@ metadata: // TODO: Make implementation match the description const namespaceStub = new Namespace(someOtherNamespaceDataStub); - const createEditResourceTab = rendererDi.inject(createEditResourceTabInjectable); + const createEditResourceTab = windowDi.inject(createEditResourceTabInjectable); createEditResourceTab(namespaceStub); }); diff --git a/src/behaviours/cluster/namespaces/edit-namespace-from-previously-opened-tab.test.tsx b/src/features/cluster/namespaces/edit-namespace-from-previously-opened-tab.test.tsx similarity index 78% rename from src/behaviours/cluster/namespaces/edit-namespace-from-previously-opened-tab.test.tsx rename to src/features/cluster/namespaces/edit-namespace-from-previously-opened-tab.test.tsx index d4571b2611..a5f834563b 100644 --- a/src/behaviours/cluster/namespaces/edit-namespace-from-previously-opened-tab.test.tsx +++ b/src/features/cluster/namespaces/edit-namespace-from-previously-opened-tab.test.tsx @@ -29,17 +29,17 @@ describe("cluster/namespaces - edit namespaces from previously opened tab", () = callForNamespaceMock = asyncFn(); - builder.beforeApplicationStart(({ rendererDi }) => { - rendererDi.override( + builder.beforeWindowStart((windowDi) => { + windowDi.override( directoryForLensLocalStorageInjectable, () => "/some-directory-for-lens-local-storage", ); - rendererDi.override(hostedClusterIdInjectable, () => "some-cluster-id"); + windowDi.override(hostedClusterIdInjectable, () => "some-cluster-id"); - storagesAreReady = controlWhenStoragesAreReady(rendererDi); + storagesAreReady = controlWhenStoragesAreReady(windowDi); - rendererDi.override(callForResourceInjectable, () => callForNamespaceMock); + windowDi.override(callForResourceInjectable, () => callForNamespaceMock); }); builder.allowKubeResource("namespaces"); @@ -49,33 +49,35 @@ describe("cluster/namespaces - edit namespaces from previously opened tab", () = let rendered: RenderResult; beforeEach(async () => { - const writeJsonFile = builder.dis.rendererDi.inject(writeJsonFileInjectable); + builder.beforeWindowStart(async (windowDi) => { + const writeJsonFile = windowDi.inject(writeJsonFileInjectable); - await writeJsonFile( - "/some-directory-for-lens-local-storage/some-cluster-id.json", - { - dock: { - height: 300, - tabs: [ - { - id: "some-first-tab-id", - kind: TabKind.EDIT_RESOURCE, - title: "Namespace: some-namespace", - pinned: false, + await writeJsonFile( + "/some-directory-for-lens-local-storage/some-cluster-id.json", + { + dock: { + height: 300, + tabs: [ + { + id: "some-first-tab-id", + kind: TabKind.EDIT_RESOURCE, + title: "Namespace: some-namespace", + pinned: false, + }, + ], + + isOpen: true, + }, + + edit_resource_store: { + "some-first-tab-id": { + resource: "/apis/some-api-version/namespaces/some-uid", + draft: "some-saved-configuration", }, - ], - - isOpen: true, - }, - - edit_resource_store: { - "some-first-tab-id": { - resource: "/apis/some-api-version/namespaces/some-uid", - draft: "some-saved-configuration", }, }, - }, - ); + ); + }); rendered = await builder.render(); diff --git a/src/behaviours/cluster/order-of-sidebar-items.test.tsx b/src/features/cluster/order-of-sidebar-items.test.tsx similarity index 91% rename from src/behaviours/cluster/order-of-sidebar-items.test.tsx rename to src/features/cluster/order-of-sidebar-items.test.tsx index 368b1b065d..718d267e70 100644 --- a/src/behaviours/cluster/order-of-sidebar-items.test.tsx +++ b/src/features/cluster/order-of-sidebar-items.test.tsx @@ -14,19 +14,21 @@ import { getApplicationBuilder } from "../../renderer/components/test-utils/get- describe("cluster - order of sidebar items", () => { let rendered: RenderResult; - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; beforeEach(() => { - applicationBuilder = getApplicationBuilder().setEnvironmentToClusterFrame(); + builder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ rendererDi }) => { - rendererDi.register(testSidebarItemsInjectable); + builder.setEnvironmentToClusterFrame(); + + builder.beforeWindowStart((windowDi) => { + windowDi.register(testSidebarItemsInjectable); }); }); describe("when rendered", () => { beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders", () => { diff --git a/src/behaviours/cluster/sidebar-and-tab-navigation-for-core.test.tsx b/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx similarity index 83% rename from src/behaviours/cluster/sidebar-and-tab-navigation-for-core.test.tsx rename to src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx index e6cf1f4a64..caa9873208 100644 --- a/src/behaviours/cluster/sidebar-and-tab-navigation-for-core.test.tsx +++ b/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx @@ -27,24 +27,21 @@ import { advanceFakeTime, useFakeTime } from "../../common/test-utils/use-fake-t import storageSaveDelayInjectable from "../../renderer/utils/create-storage/storage-save-delay.injectable"; describe("cluster - sidebar and tab navigation for core", () => { - let applicationBuilder: ApplicationBuilder; - let rendererDi: DiContainer; + let builder: ApplicationBuilder; let rendered: RenderResult; beforeEach(() => { useFakeTime("2015-10-21T07:28:00Z"); - applicationBuilder = getApplicationBuilder(); - rendererDi = applicationBuilder.dis.rendererDi; + builder = getApplicationBuilder(); - applicationBuilder.setEnvironmentToClusterFrame(); + builder.setEnvironmentToClusterFrame(); - applicationBuilder.beforeApplicationStart(({ rendererDi }) => { - rendererDi.override(hostedClusterIdInjectable, () => "some-hosted-cluster-id"); + builder.beforeWindowStart((windowDi) => { + windowDi.override(hostedClusterIdInjectable, () => "some-hosted-cluster-id"); + windowDi.override(storageSaveDelayInjectable, () => 250); - rendererDi.override(storageSaveDelayInjectable, () => 250); - - rendererDi.override( + windowDi.override( directoryForLensLocalStorageInjectable, () => "/some-directory-for-lens-local-storage", ); @@ -53,24 +50,23 @@ describe("cluster - sidebar and tab navigation for core", () => { describe("given core registrations", () => { beforeEach(() => { - applicationBuilder.beforeApplicationStart(({ rendererDi }) => { - rendererDi.register(testRouteInjectable); - rendererDi.register(testRouteComponentInjectable); - rendererDi.register(testSidebarItemsInjectable); + builder.beforeWindowStart((windowDi) => { + windowDi.register(testRouteInjectable); + windowDi.register(testRouteComponentInjectable); + windowDi.register(testSidebarItemsInjectable); }); }); describe("given no state for expanded sidebar items exists, and navigated to child sidebar item, when rendered", () => { beforeEach(async () => { - applicationBuilder.beforeRender(({ rendererDi }) => { - const route = rendererDi.inject(testRouteInjectable); + rendered = await builder.render(); - const navigateToRoute = rendererDi.inject(navigateToRouteInjectionToken); + const windowDi = builder.applicationWindow.only.di; - navigateToRoute(route); - }); + const route = windowDi.inject(testRouteInjectable); + const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken); - rendered = await applicationBuilder.render(); + navigateToRoute(route); }); it("renders", () => { @@ -96,8 +92,8 @@ describe("cluster - sidebar and tab navigation for core", () => { describe("given state for expanded sidebar items already exists, when rendered", () => { beforeEach(async () => { - applicationBuilder.beforeRender(async ({ rendererDi }) => { - const writeJsonFileFake = rendererDi.inject(writeJsonFileInjectable); + builder.beforeWindowStart(async (windowDi) => { + const writeJsonFileFake = windowDi.inject(writeJsonFileInjectable); await writeJsonFileFake( "/some-directory-for-lens-local-storage/some-hosted-cluster-id.json", @@ -108,15 +104,13 @@ describe("cluster - sidebar and tab navigation for core", () => { }, }, ); - }); - applicationBuilder.beforeRender(async ({ rendererDi }) => { - const sidebarStorage = rendererDi.inject(sidebarStorageInjectable); + const sidebarStorage = windowDi.inject(sidebarStorageInjectable); await sidebarStorage.whenReady; }); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders", () => { @@ -138,8 +132,8 @@ describe("cluster - sidebar and tab navigation for core", () => { describe("given state for expanded unknown sidebar items already exists, when rendered", () => { beforeEach(async () => { - applicationBuilder.beforeRender(async ({ rendererDi }) => { - const writeJsonFileFake = rendererDi.inject(writeJsonFileInjectable); + builder.beforeWindowStart(async (windowDi) => { + const writeJsonFileFake = windowDi.inject(writeJsonFileInjectable); await writeJsonFileFake( "/some-directory-for-lens-local-storage/some-hosted-cluster-id.json", @@ -152,7 +146,7 @@ describe("cluster - sidebar and tab navigation for core", () => { ); }); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders without errors", () => { @@ -168,8 +162,8 @@ describe("cluster - sidebar and tab navigation for core", () => { describe("given empty state for expanded sidebar items already exists, when rendered", () => { beforeEach(async () => { - applicationBuilder.beforeRender(async ({ rendererDi }) => { - const writeJsonFileFake = rendererDi.inject(writeJsonFileInjectable); + builder.beforeWindowStart(async (windowDi) => { + const writeJsonFileFake = windowDi.inject(writeJsonFileInjectable); await writeJsonFileFake( "/some-directory-for-lens-local-storage/some-hosted-cluster-id.json", @@ -179,7 +173,7 @@ describe("cluster - sidebar and tab navigation for core", () => { ); }); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders without errors", () => { @@ -194,8 +188,12 @@ describe("cluster - sidebar and tab navigation for core", () => { }); describe("given no initially persisted state for sidebar items, when rendered", () => { + let windowDi: DiContainer; + beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); + + windowDi = builder.applicationWindow.only.di; }); it("renders", () => { @@ -271,7 +269,7 @@ describe("cluster - sidebar and tab navigation for core", () => { it("when not enough time passes, does not store state for expanded sidebar items to file system yet", async () => { advanceFakeTime(250 - 1); - const pathExistsFake = rendererDi.inject(pathExistsInjectable); + const pathExistsFake = windowDi.inject(pathExistsInjectable); const actual = await pathExistsFake( "/some-directory-for-lens-local-storage/some-hosted-cluster-id.json", @@ -283,7 +281,7 @@ describe("cluster - sidebar and tab navigation for core", () => { it("when enough time passes, stores state for expanded sidebar items to file system", async () => { advanceFakeTime(250); - const readJsonFileFake = rendererDi.inject(readJsonFileInjectable); + const readJsonFileFake = windowDi.inject(readJsonFileInjectable); const actual = await readJsonFileFake( "/some-directory-for-lens-local-storage/some-hosted-cluster-id.json", diff --git a/src/behaviours/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx b/src/features/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx similarity index 89% rename from src/behaviours/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx rename to src/features/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx index c3fc563696..8d3de582ad 100644 --- a/src/behaviours/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx +++ b/src/features/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx @@ -13,35 +13,31 @@ import { getApplicationBuilder } from "../../renderer/components/test-utils/get- import writeJsonFileInjectable from "../../common/fs/write-json-file.injectable"; import pathExistsInjectable from "../../common/fs/path-exists.injectable"; import readJsonFileInjectable from "../../common/fs/read-json-file.injectable"; -import type { DiContainer } from "@ogre-tools/injectable"; import { navigateToRouteInjectionToken } from "../../common/front-end-routing/navigate-to-route-injection-token"; import assert from "assert"; import hostedClusterIdInjectable from "../../renderer/cluster-frame-context/hosted-cluster-id.injectable"; import { advanceFakeTime, useFakeTime } from "../../common/test-utils/use-fake-time"; -import { getExtensionFakeFor } from "../../renderer/components/test-utils/get-extension-fake"; import type { IObservableValue } from "mobx"; import { runInAction, computed, observable } from "mobx"; import storageSaveDelayInjectable from "../../renderer/utils/create-storage/storage-save-delay.injectable"; +import type { DiContainer } from "@ogre-tools/injectable"; describe("cluster - sidebar and tab navigation for extensions", () => { let applicationBuilder: ApplicationBuilder; - let rendererDi: DiContainer; let rendered: RenderResult; beforeEach(() => { useFakeTime("2015-10-21T07:28:00Z"); applicationBuilder = getApplicationBuilder(); - rendererDi = applicationBuilder.dis.rendererDi; applicationBuilder.setEnvironmentToClusterFrame(); - applicationBuilder.beforeApplicationStart(({ rendererDi }) => { - rendererDi.override(hostedClusterIdInjectable, () => "some-hosted-cluster-id"); + applicationBuilder.beforeWindowStart((windowDi) => { + windowDi.override(hostedClusterIdInjectable, () => "some-hosted-cluster-id"); + windowDi.override(storageSaveDelayInjectable, () => 250); - rendererDi.override(storageSaveDelayInjectable, () => 250); - - rendererDi.override( + windowDi.override( directoryForLensLocalStorageInjectable, () => "/some-directory-for-lens-local-storage", ); @@ -54,9 +50,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => { beforeEach(() => { someObservable = observable.box(false); - const getExtensionFake = getExtensionFakeFor(applicationBuilder); - - const testExtension = getExtensionFake({ + const testExtension = { id: "some-extension-id", name: "some-extension-name", @@ -130,29 +124,31 @@ describe("cluster - sidebar and tab navigation for extensions", () => { }, ], }, - }); + }; applicationBuilder.extensions.enable(testExtension); }); describe("given no state for expanded sidebar items exists, and navigated to child sidebar item, when rendered", () => { beforeEach(async () => { - applicationBuilder.beforeRender(({ rendererDi }) => { - const navigateToRoute = rendererDi.inject(navigateToRouteInjectionToken); - const route = rendererDi - .inject(routesInjectable) - .get() - .find( - matches({ - path: "/extension/some-extension-name/some-child-page-id", - }), - ); - - assert(route); - navigateToRoute(route); - }); - rendered = await applicationBuilder.render(); + + const windowDi = applicationBuilder.applicationWindow.only.di; + + const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken); + + const route = windowDi + .inject(routesInjectable) + .get() + .find( + matches({ + path: "/extension/some-extension-name/some-child-page-id", + }), + ); + + assert(route); + navigateToRoute(route); + }); it("renders", () => { @@ -178,8 +174,8 @@ describe("cluster - sidebar and tab navigation for extensions", () => { describe("given state for expanded sidebar items already exists, when rendered", () => { beforeEach(async () => { - applicationBuilder.beforeRender(async ({ rendererDi }) => { - const writeJsonFileFake = rendererDi.inject(writeJsonFileInjectable); + applicationBuilder.beforeWindowStart(async (windowDi) => { + const writeJsonFileFake = windowDi.inject(writeJsonFileInjectable); await writeJsonFileFake( "/some-directory-for-lens-local-storage/some-hosted-cluster-id.json", @@ -214,8 +210,8 @@ describe("cluster - sidebar and tab navigation for extensions", () => { describe("given state for expanded unknown sidebar items already exists, when rendered", () => { beforeEach(async () => { - applicationBuilder.beforeRender(async ({ rendererDi }) => { - const writeJsonFileFake = rendererDi.inject(writeJsonFileInjectable); + applicationBuilder.beforeWindowStart(async (windowDi) => { + const writeJsonFileFake = windowDi.inject(writeJsonFileInjectable); await writeJsonFileFake( "/some-directory-for-lens-local-storage/some-hosted-cluster-id.json", @@ -244,8 +240,8 @@ describe("cluster - sidebar and tab navigation for extensions", () => { describe("given empty state for expanded sidebar items already exists, when rendered", () => { beforeEach(async () => { - applicationBuilder.beforeRender(async ({ rendererDi }) => { - const writeJsonFileFake = rendererDi.inject(writeJsonFileInjectable); + applicationBuilder.beforeWindowStart(async (windowDi) => { + const writeJsonFileFake = windowDi.inject(writeJsonFileInjectable); await writeJsonFileFake( "/some-directory-for-lens-local-storage/some-hosted-cluster-id.json", @@ -270,8 +266,12 @@ describe("cluster - sidebar and tab navigation for extensions", () => { }); describe("given no initially persisted state for sidebar items, when rendered", () => { + let windowDi: DiContainer; + beforeEach(async () => { rendered = await applicationBuilder.render(); + + windowDi = applicationBuilder.applicationWindow.only.di; }); it("renders", () => { @@ -387,7 +387,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => { it("when not enough time passes, does not store state for expanded sidebar items to file system yet", async () => { advanceFakeTime(250 - 1); - const pathExistsFake = rendererDi.inject(pathExistsInjectable); + const pathExistsFake = windowDi.inject(pathExistsInjectable); const actual = await pathExistsFake( "/some-directory-for-lens-local-storage/some-hosted-cluster-id.json", @@ -399,7 +399,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => { it("when enough time passes, stores state for expanded sidebar items to file system", async () => { advanceFakeTime(250); - const readJsonFileFake = rendererDi.inject(readJsonFileInjectable); + const readJsonFileFake = windowDi.inject(readJsonFileInjectable); const actual = await readJsonFileFake( "/some-directory-for-lens-local-storage/some-hosted-cluster-id.json", diff --git a/src/behaviours/cluster/visibility-of-sidebar-items.test.tsx b/src/features/cluster/visibility-of-sidebar-items.test.tsx similarity index 87% rename from src/behaviours/cluster/visibility-of-sidebar-items.test.tsx rename to src/features/cluster/visibility-of-sidebar-items.test.tsx index 2fb837b9ed..52224b7cd1 100644 --- a/src/behaviours/cluster/visibility-of-sidebar-items.test.tsx +++ b/src/features/cluster/visibility-of-sidebar-items.test.tsx @@ -16,24 +16,24 @@ import { getApplicationBuilder } from "../../renderer/components/test-utils/get- import { navigateToRouteInjectionToken } from "../../common/front-end-routing/navigate-to-route-injection-token"; describe("cluster - visibility of sidebar items", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let rendered: RenderResult; beforeEach(() => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - applicationBuilder.setEnvironmentToClusterFrame(); + builder.setEnvironmentToClusterFrame(); - applicationBuilder.beforeApplicationStart(({ rendererDi }) => { - rendererDi.register(testRouteInjectable); - rendererDi.register(testRouteComponentInjectable); - rendererDi.register(testSidebarItemsInjectable); + builder.beforeWindowStart((windowDi) => { + windowDi.register(testRouteInjectable); + windowDi.register(testRouteComponentInjectable); + windowDi.register(testSidebarItemsInjectable); }); }); describe("given kube resource for route is not allowed", () => { beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders", () => { @@ -48,7 +48,7 @@ describe("cluster - visibility of sidebar items", () => { describe("when kube resource becomes allowed", () => { beforeEach(() => { - applicationBuilder.allowKubeResource("namespaces"); + builder.allowKubeResource("namespaces"); }); it("renders", () => { diff --git a/src/behaviours/cluster/workloads/overview/extension-api/__snapshots__/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx.snap b/src/features/cluster/workloads/overview/extension-api/__snapshots__/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx.snap similarity index 100% rename from src/behaviours/cluster/workloads/overview/extension-api/__snapshots__/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx.snap rename to src/features/cluster/workloads/overview/extension-api/__snapshots__/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx.snap diff --git a/src/behaviours/cluster/workloads/overview/extension-api/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx b/src/features/cluster/workloads/overview/extension-api/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx similarity index 88% rename from src/behaviours/cluster/workloads/overview/extension-api/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx rename to src/features/cluster/workloads/overview/extension-api/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx index 35a108dde9..4b19be2cb5 100644 --- a/src/behaviours/cluster/workloads/overview/extension-api/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx +++ b/src/features/cluster/workloads/overview/extension-api/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx @@ -8,7 +8,6 @@ import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../../../../renderer/components/test-utils/get-application-builder"; import type { KubernetesCluster } from "../../../../../common/catalog-entities"; import { getApplicationBuilder } from "../../../../../renderer/components/test-utils/get-application-builder"; -import { getExtensionFakeFor } from "../../../../../renderer/components/test-utils/get-extension-fake"; import extensionShouldBeEnabledForClusterFrameInjectable from "../../../../../renderer/extension-loader/extension-should-be-enabled-for-cluster-frame.injectable"; import apiManagerInjectable from "../../../../../common/k8s-api/api-manager/manager.injectable"; import navigateToWorkloadsOverviewInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/overview/navigate-to-workloads-overview.injectable"; @@ -24,21 +23,19 @@ describe("disable workloads overview details when cluster is not relevant", () = beforeEach(async () => { builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + builder.setEnvironmentToClusterFrame(); + + builder.beforeApplicationStart((mainDi) => { mainDi.override(apiManagerInjectable, () => ({})); }); - const rendererDi = builder.dis.rendererDi; - - rendererDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); - - builder.setEnvironmentToClusterFrame(); - - const getExtensionFake = getExtensionFakeFor(builder); + builder.beforeWindowStart((windowDi) => { + windowDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); + }); isEnabledForClusterMock = asyncFn(); - const testExtension = getExtensionFake({ + const testExtension = { id: "test-extension-id", name: "test-extension", @@ -55,11 +52,13 @@ describe("disable workloads overview details when cluster is not relevant", () = }, ], }, - }); + }; rendered = await builder.render(); - const navigateToWorkloadsOverview = rendererDi.inject( + const windowDi = builder.applicationWindow.only.di; + + const navigateToWorkloadsOverview = windowDi.inject( navigateToWorkloadsOverviewInjectable, ); diff --git a/src/behaviours/cluster/workloads/overview/extension-api/order-of-workload-overview-details.test.tsx b/src/features/cluster/workloads/overview/extension-api/order-of-workload-overview-details.test.tsx similarity index 87% rename from src/behaviours/cluster/workloads/overview/extension-api/order-of-workload-overview-details.test.tsx rename to src/features/cluster/workloads/overview/extension-api/order-of-workload-overview-details.test.tsx index eb19bbd400..70d9983f2b 100644 --- a/src/behaviours/cluster/workloads/overview/extension-api/order-of-workload-overview-details.test.tsx +++ b/src/features/cluster/workloads/overview/extension-api/order-of-workload-overview-details.test.tsx @@ -4,7 +4,6 @@ */ import type { RenderResult } from "@testing-library/react"; import { getApplicationBuilder } from "../../../../../renderer/components/test-utils/get-application-builder"; -import { getExtensionFakeFor } from "../../../../../renderer/components/test-utils/get-extension-fake"; import React from "react"; import getRandomIdInjectable from "../../../../../common/utils/get-random-id.injectable"; import { workloadOverviewDetailInjectionToken } from "../../../../../renderer/components/+workloads-overview/workload-overview-details/workload-overview-detail-injection-token"; @@ -17,16 +16,22 @@ describe("order of workload overview details", () => { beforeEach(async () => { const builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ rendererDi }) => { - rendererDi.unoverride(getRandomIdInjectable); - rendererDi.permitSideEffects(getRandomIdInjectable); + builder.beforeWindowStart((windowDi) => { + windowDi.unoverride(getRandomIdInjectable); + windowDi.permitSideEffects(getRandomIdInjectable); + + windowDi.register( + someCoreItemWithLowOrderNumberInjectable, + someCoreItemWithHighOrderNumberInjectable, + someCoreItemWithDefaultOrderNumberInjectable, + ); }); builder.setEnvironmentToClusterFrame(); rendered = await builder.render(); - const testExtension = getExtensionFakeFor(builder)({ + const testExtension = { id: "some-extension-id", name: "some-extension", @@ -66,16 +71,9 @@ describe("order of workload overview details", () => { }, ], }, - }); + }; builder.extensions.enable(testExtension); - - - builder.dis.rendererDi.register( - someCoreItemWithLowOrderNumberInjectable, - someCoreItemWithHighOrderNumberInjectable, - someCoreItemWithDefaultOrderNumberInjectable, - ); }); it("shows items in correct order", () => { diff --git a/src/behaviours/cluster/workloads/overview/extension-api/reactively-hide-workloads-overview-details-item.test.tsx b/src/features/cluster/workloads/overview/extension-api/reactively-hide-workloads-overview-details-item.test.tsx similarity index 86% rename from src/behaviours/cluster/workloads/overview/extension-api/reactively-hide-workloads-overview-details-item.test.tsx rename to src/features/cluster/workloads/overview/extension-api/reactively-hide-workloads-overview-details-item.test.tsx index 3b02d3dad9..fbc8ceebca 100644 --- a/src/behaviours/cluster/workloads/overview/extension-api/reactively-hide-workloads-overview-details-item.test.tsx +++ b/src/features/cluster/workloads/overview/extension-api/reactively-hide-workloads-overview-details-item.test.tsx @@ -9,7 +9,6 @@ import React from "react"; 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 { getApplicationBuilder } from "../../../../../renderer/components/test-utils/get-application-builder"; -import { getExtensionFakeFor } from "../../../../../renderer/components/test-utils/get-extension-fake"; describe("reactively hide workloads overview details item", () => { let builder: ApplicationBuilder; @@ -19,15 +18,11 @@ describe("reactively hide workloads overview details item", () => { beforeEach(async () => { builder = getApplicationBuilder(); - const rendererDi = builder.dis.rendererDi; - builder.setEnvironmentToClusterFrame(); - const getExtensionFake = getExtensionFakeFor(builder); - someObservable = observable.box(false); - const testExtension = getExtensionFake({ + const testExtension = { id: "test-extension-id", name: "test-extension", @@ -44,11 +39,13 @@ describe("reactively hide workloads overview details item", () => { }, ], }, - }); + }; rendered = await builder.render(); - const navigateToWorkloadsOverview = rendererDi.inject( + const windowDi = builder.applicationWindow.only.di; + + const navigateToWorkloadsOverview = windowDi.inject( navigateToWorkloadsOverviewInjectable, ); diff --git a/src/behaviours/command-pallet/__snapshots__/keyboard-shortcuts.test.tsx.snap b/src/features/command-pallet/__snapshots__/keyboard-shortcuts.test.tsx.snap similarity index 100% rename from src/behaviours/command-pallet/__snapshots__/keyboard-shortcuts.test.tsx.snap rename to src/features/command-pallet/__snapshots__/keyboard-shortcuts.test.tsx.snap diff --git a/src/behaviours/command-pallet/keyboard-shortcuts.test.tsx b/src/features/command-pallet/keyboard-shortcuts.test.tsx similarity index 90% rename from src/behaviours/command-pallet/keyboard-shortcuts.test.tsx rename to src/features/command-pallet/keyboard-shortcuts.test.tsx index fba09862e3..ddf18b2f76 100644 --- a/src/behaviours/command-pallet/keyboard-shortcuts.test.tsx +++ b/src/features/command-pallet/keyboard-shortcuts.test.tsx @@ -9,17 +9,20 @@ import platformInjectable from "../../common/vars/platform.injectable"; import { type ApplicationBuilder, getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; describe("Command Pallet: keyboard shortcut tests", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let rendered: RenderResult; beforeEach(async () => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); }); describe("when on macOS", () => { beforeEach(async () => { - applicationBuilder.dis.rendererDi.override(platformInjectable, () => "darwin"); - rendered = await applicationBuilder.render(); + builder.beforeWindowStart((windowDi) => { + windowDi.override(platformInjectable, () => "darwin"); + }); + + rendered = await builder.render(); }); it("renders", () => { @@ -83,8 +86,11 @@ describe("Command Pallet: keyboard shortcut tests", () => { describe("when on linux", () => { beforeEach(async () => { - applicationBuilder.dis.rendererDi.override(platformInjectable, () => "linux"); - rendered = await applicationBuilder.render(); + builder.beforeWindowStart((windowDi) => { + windowDi.override(platformInjectable, () => "linux"); + }); + + rendered = await builder.render(); }); it("renders", () => { diff --git a/src/behaviours/extension-special-characters-in-page-registrations.test.tsx b/src/features/extension-special-characters-in-page-registrations.test.tsx similarity index 55% rename from src/behaviours/extension-special-characters-in-page-registrations.test.tsx rename to src/features/extension-special-characters-in-page-registrations.test.tsx index f30e300582..ac038a5743 100644 --- a/src/behaviours/extension-special-characters-in-page-registrations.test.tsx +++ b/src/features/extension-special-characters-in-page-registrations.test.tsx @@ -2,30 +2,27 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { FakeExtensionData, TestExtension } from "../renderer/components/test-utils/get-renderer-extension-fake"; -import { getRendererExtensionFakeFor } from "../renderer/components/test-utils/get-renderer-extension-fake"; import React from "react"; import type { RenderResult } from "@testing-library/react"; import currentPathInjectable from "../renderer/routes/current-path.injectable"; import type { ApplicationBuilder } from "../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../renderer/components/test-utils/get-application-builder"; +import type { DiContainer } from "@ogre-tools/injectable"; +import type { FakeExtensionOptions } from "../renderer/components/test-utils/get-extension-fake"; describe("extension special characters in page registrations", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let rendered: RenderResult; - let testExtension: TestExtension; + let windowDi: DiContainer; beforeEach(async () => { - applicationBuilder = getApplicationBuilder(); - const getRendererExtensionFake = getRendererExtensionFakeFor(applicationBuilder); + builder = getApplicationBuilder(); - testExtension = getRendererExtensionFake( - extensionWithPagesHavingSpecialCharacters, - ); + rendered = await builder.render(); - applicationBuilder.extensions.renderer.enable(testExtension); + builder.extensions.enable(extensionWithPagesHavingSpecialCharacters); - rendered = await applicationBuilder.render(); + windowDi = builder.applicationWindow.only.di; }); it("renders", () => { @@ -34,6 +31,9 @@ describe("extension special characters in page registrations", () => { describe("when navigating to route with ID having special characters", () => { beforeEach(() => { + const testExtension = + builder.extensions.get("some-extension-id").applicationWindows.only; + testExtension.navigate("/some-page-id/"); }); @@ -42,22 +42,25 @@ describe("extension special characters in page registrations", () => { }); it("knows URL", () => { - const currentPath = applicationBuilder.dis.rendererDi.inject(currentPathInjectable); + const currentPath = windowDi.inject(currentPathInjectable); expect(currentPath.get()).toBe("/extension/some-extension-name--/some-page-id"); }); }); }); -const extensionWithPagesHavingSpecialCharacters: FakeExtensionData = { +const extensionWithPagesHavingSpecialCharacters: FakeExtensionOptions = { id: "some-extension-id", name: "@some-extension-name/", - globalPages: [ - { - id: "/some-page-id/", - components: { - Page: () =>
Some page
, + + rendererOptions: { + globalPages: [ + { + id: "/some-page-id/", + components: { + Page: () =>
Some page
, + }, }, - }, - ], + ], + }, }; diff --git a/src/behaviours/extensions/__snapshots__/navigation-using-application-menu.test.ts.snap b/src/features/extensions/__snapshots__/navigation-using-application-menu.test.ts.snap similarity index 100% rename from src/behaviours/extensions/__snapshots__/navigation-using-application-menu.test.ts.snap rename to src/features/extensions/__snapshots__/navigation-using-application-menu.test.ts.snap diff --git a/src/behaviours/extensions/navigation-using-application-menu.test.ts b/src/features/extensions/navigation-using-application-menu.test.ts similarity index 82% rename from src/behaviours/extensions/navigation-using-application-menu.test.ts rename to src/features/extensions/navigation-using-application-menu.test.ts index a8b9cc55b1..a9e7e23b74 100644 --- a/src/behaviours/extensions/navigation-using-application-menu.test.ts +++ b/src/features/extensions/navigation-using-application-menu.test.ts @@ -12,18 +12,20 @@ import focusWindowInjectable from "../../renderer/navigation/focus-window.inject jest.mock("../../renderer/components/input/input"); describe("extensions - navigation using application menu", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let rendered: RenderResult; let focusWindowMock: jest.Mock; beforeEach(async () => { - applicationBuilder = getApplicationBuilder().beforeApplicationStart(({ rendererDi }) => { + builder = getApplicationBuilder(); + + builder.beforeWindowStart((windowDi) => { focusWindowMock = jest.fn(); - rendererDi.override(focusWindowInjectable, () => focusWindowMock); + windowDi.override(focusWindowInjectable, () => focusWindowMock); }); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders", () => { @@ -38,7 +40,7 @@ describe("extensions - navigation using application menu", () => { describe("when navigating to extensions using application menu", () => { beforeEach(() => { - applicationBuilder.applicationMenu.click("root.extensions"); + builder.applicationMenu.click("root.extensions"); }); it("focuses the window", () => { diff --git a/src/behaviours/helm-charts/__snapshots__/add-custom-helm-repository-in-preferences.test.ts.snap b/src/features/helm-charts/__snapshots__/add-custom-helm-repository-in-preferences.test.ts.snap similarity index 100% rename from src/behaviours/helm-charts/__snapshots__/add-custom-helm-repository-in-preferences.test.ts.snap rename to src/features/helm-charts/__snapshots__/add-custom-helm-repository-in-preferences.test.ts.snap diff --git a/src/behaviours/helm-charts/__snapshots__/add-helm-repository-from-list-in-preferences.test.ts.snap b/src/features/helm-charts/__snapshots__/add-helm-repository-from-list-in-preferences.test.ts.snap similarity index 100% rename from src/behaviours/helm-charts/__snapshots__/add-helm-repository-from-list-in-preferences.test.ts.snap rename to src/features/helm-charts/__snapshots__/add-helm-repository-from-list-in-preferences.test.ts.snap diff --git a/src/behaviours/helm-charts/__snapshots__/listing-active-helm-repositories-in-preferences.test.ts.snap b/src/features/helm-charts/__snapshots__/listing-active-helm-repositories-in-preferences.test.ts.snap similarity index 100% rename from src/behaviours/helm-charts/__snapshots__/listing-active-helm-repositories-in-preferences.test.ts.snap rename to src/features/helm-charts/__snapshots__/listing-active-helm-repositories-in-preferences.test.ts.snap diff --git a/src/behaviours/helm-charts/__snapshots__/remove-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap b/src/features/helm-charts/__snapshots__/remove-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap similarity index 100% rename from src/behaviours/helm-charts/__snapshots__/remove-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap rename to src/features/helm-charts/__snapshots__/remove-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap diff --git a/src/behaviours/helm-charts/add-custom-helm-repository-in-preferences.test.ts b/src/features/helm-charts/add-custom-helm-repository-in-preferences.test.ts similarity index 93% rename from src/behaviours/helm-charts/add-custom-helm-repository-in-preferences.test.ts rename to src/features/helm-charts/add-custom-helm-repository-in-preferences.test.ts index b8d9fd0661..d8e14d25fa 100644 --- a/src/behaviours/helm-charts/add-custom-helm-repository-in-preferences.test.ts +++ b/src/features/helm-charts/add-custom-helm-repository-in-preferences.test.ts @@ -19,7 +19,7 @@ import showErrorNotificationInjectable from "../../renderer/components/notificat import type { AsyncResult } from "../../common/utils/async-result"; describe("add custom helm repository in preferences", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let showSuccessNotificationMock: jest.Mock; let showErrorNotificationMock: jest.Mock; let rendered: RenderResult; @@ -31,41 +31,35 @@ describe("add custom helm repository in preferences", () => { beforeEach(async () => { jest.useFakeTimers(); - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); execFileMock = asyncFn(); getActiveHelmRepositoriesMock = asyncFn(); + showSuccessNotificationMock = jest.fn(); + showErrorNotificationMock = jest.fn(); - applicationBuilder.beforeApplicationStart(({ mainDi, rendererDi }) => { - rendererDi.override(callForPublicHelmRepositoriesInjectable, () => async () => []); - - showSuccessNotificationMock = jest.fn(); - - rendererDi.override(showSuccessNotificationInjectable, () => showSuccessNotificationMock); - - showErrorNotificationMock = jest.fn(); - - rendererDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock); - - // TODO: Figure out how to make async validators unit testable - rendererDi.override(isPathInjectable, () => ({ debounce: 0, validate: async () => {} })); - - mainDi.override( - getActiveHelmRepositoriesInjectable, - () => getActiveHelmRepositoriesMock, - ); - + builder.beforeApplicationStart((mainDi) => { + mainDi.override(getActiveHelmRepositoriesInjectable, () => getActiveHelmRepositoriesMock); mainDi.override(execFileInjectable, () => execFileMock); mainDi.override(helmBinaryPathInjectable, () => "some-helm-binary-path"); }); - rendered = await applicationBuilder.render(); + builder.beforeWindowStart((windowDi) => { + windowDi.override(callForPublicHelmRepositoriesInjectable, () => async () => []); + windowDi.override(showSuccessNotificationInjectable, () => showSuccessNotificationMock); + windowDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock); + + // TODO: Figure out how to make async validators unit testable + windowDi.override(isPathInjectable, () => ({ debounce: 0, validate: async () => {} })); + }); + + rendered = await builder.render(); }); describe("when navigating to preferences containing helm repositories", () => { beforeEach(async () => { - applicationBuilder.preferences.navigate(); - applicationBuilder.preferences.navigation.click("kubernetes"); + builder.preferences.navigate(); + builder.preferences.navigation.click("kubernetes"); }); it("renders", () => { diff --git a/src/behaviours/helm-charts/add-helm-repository-from-list-in-preferences.test.ts b/src/features/helm-charts/add-helm-repository-from-list-in-preferences.test.ts similarity index 88% rename from src/behaviours/helm-charts/add-helm-repository-from-list-in-preferences.test.ts rename to src/features/helm-charts/add-helm-repository-from-list-in-preferences.test.ts index c16fcd893f..c46c30086e 100644 --- a/src/behaviours/helm-charts/add-helm-repository-from-list-in-preferences.test.ts +++ b/src/features/helm-charts/add-helm-repository-from-list-in-preferences.test.ts @@ -17,7 +17,7 @@ import showErrorNotificationInjectable from "../../renderer/components/notificat import type { AsyncResult } from "../../common/utils/async-result"; describe("add helm repository from list in preferences", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let showSuccessNotificationMock: jest.Mock; let showErrorNotificationMock: jest.Mock; let rendered: RenderResult; @@ -28,41 +28,33 @@ describe("add helm repository from list in preferences", () => { let callForPublicHelmRepositoriesMock: AsyncFnMock<() => Promise>; beforeEach(async () => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); execFileMock = asyncFn(); getActiveHelmRepositoriesMock = asyncFn(); callForPublicHelmRepositoriesMock = asyncFn(); + showSuccessNotificationMock = jest.fn(); + showErrorNotificationMock = jest.fn(); - applicationBuilder.beforeApplicationStart(({ mainDi, rendererDi }) => { - showSuccessNotificationMock = jest.fn(); - - rendererDi.override(showSuccessNotificationInjectable, () => showSuccessNotificationMock); - - showErrorNotificationMock = jest.fn(); - - rendererDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock); - - rendererDi.override( - callForPublicHelmRepositoriesInjectable, - () => callForPublicHelmRepositoriesMock, - ); - - mainDi.override( - getActiveHelmRepositoriesInjectable, - () => getActiveHelmRepositoriesMock, - ); + builder.beforeApplicationStart((mainDi) => { + mainDi.override(getActiveHelmRepositoriesInjectable, () => getActiveHelmRepositoriesMock); mainDi.override(execFileInjectable, () => execFileMock); mainDi.override(helmBinaryPathInjectable, () => "some-helm-binary-path"); }); - rendered = await applicationBuilder.render(); + builder.beforeWindowStart((windowDi) => { + windowDi.override(showSuccessNotificationInjectable, () => showSuccessNotificationMock); + windowDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock); + windowDi.override(callForPublicHelmRepositoriesInjectable, () => callForPublicHelmRepositoriesMock); + }); + + rendered = await builder.render(); }); describe("when navigating to preferences containing helm repositories", () => { - beforeEach(async () => { - applicationBuilder.preferences.navigate(); - applicationBuilder.preferences.navigation.click("kubernetes"); + beforeEach(() => { + builder.preferences.navigate(); + builder.preferences.navigation.click("kubernetes"); }); it("renders", () => { @@ -100,7 +92,7 @@ describe("add helm repository from list in preferences", () => { describe("when select for adding public repositories is clicked", () => { beforeEach(() => { - applicationBuilder.select.openMenu( + builder.select.openMenu( "selection-of-active-public-helm-repository", ); }); @@ -113,7 +105,7 @@ describe("add helm repository from list in preferences", () => { beforeEach(async () => { getActiveHelmRepositoriesMock.mockClear(); - applicationBuilder.select.selectOption( + builder.select.selectOption( "selection-of-active-public-helm-repository", "Some to be added repository", ); @@ -207,7 +199,7 @@ describe("add helm repository from list in preferences", () => { describe("when select for selecting active repositories is clicked", () => { beforeEach(() => { - applicationBuilder.select.openMenu( + builder.select.openMenu( "selection-of-active-public-helm-repository", ); }); @@ -221,7 +213,7 @@ describe("add helm repository from list in preferences", () => { execFileMock.mockClear(); getActiveHelmRepositoriesMock.mockClear(); - applicationBuilder.select.selectOption( + builder.select.selectOption( "selection-of-active-public-helm-repository", "Some already active repository", ); diff --git a/src/behaviours/helm-charts/installing-chart/__snapshots__/installing-helm-chart-from-new-tab.test.ts.snap b/src/features/helm-charts/installing-chart/__snapshots__/installing-helm-chart-from-new-tab.test.ts.snap similarity index 97% rename from src/behaviours/helm-charts/installing-chart/__snapshots__/installing-helm-chart-from-new-tab.test.ts.snap rename to src/features/helm-charts/installing-chart/__snapshots__/installing-helm-chart-from-new-tab.test.ts.snap index 2a9f1f3ed8..600c86f0a9 100644 --- a/src/behaviours/helm-charts/installing-chart/__snapshots__/installing-helm-chart-from-new-tab.test.ts.snap +++ b/src/features/helm-charts/installing-chart/__snapshots__/installing-helm-chart-from-new-tab.test.ts.snap @@ -1,6 +1,448 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`installing helm chart from new tab given tab for installing chart was not previously opened and application is started, when navigating to helm charts renders 1`] = ` +exports[`installing helm chart from new tab given tab for installing chart was not previously opened and application is started renders 1`] = ` + +
+
+
+