From e5df27389e404dc46ee81f87aecc32a14d74b26e Mon Sep 17 00:00:00 2001 From: Iku-turso Date: Mon, 29 Aug 2022 15:12:22 +0300 Subject: [PATCH] Make registrations specify MobX-transaction explicitly This is a new requirement from injectable-extension-for-mobx, as otherwise registrations could surprisingly cause untimely, and too numerous observations by computedInjectMany. The bad thing is the duplication, but I do currently consider this as favorable, as now a dev will always know that registrations of injectables with tokens may cause triggering of observations. Co-authored-by: Janne Savolainen Signed-off-by: Iku-turso --- src/common/utils/channel/channel.test.ts | 31 +++++++++++++------ src/common/utils/sync-box/sync-box.test.ts | 8 +++-- .../extension/extension.injectable.ts | 13 ++++++-- ...tems-when-cluster-is-not-relevant.test.tsx | 6 ++-- ...vely-hide-kube-object-detail-item.test.tsx | 4 ++- ...tems-when-cluster-is-not-relevant.test.tsx | 7 +++-- ...tively-hide-kube-object-menu-item.test.tsx | 4 ++- ...uses-when-cluster-is-not-relevant.test.tsx | 7 +++-- ...eactively-hide-kube-object-status.test.tsx | 5 ++- .../show-status-for-a-kube-object.test.tsx | 29 ++++++++++------- .../cluster/order-of-sidebar-items.test.tsx | 6 ++-- ...debar-and-tab-navigation-for-core.test.tsx | 10 +++--- .../visibility-of-sidebar-items.test.tsx | 10 +++--- ...rder-of-workload-overview-details.test.tsx | 14 +++++---- .../navigating-between-routes.test.tsx | 14 ++++++--- .../preferences/closing-preferences.test.tsx | 14 +++++---- ...ning-application-window-using-tray.test.ts | 11 ++++--- src/main/getDi.ts | 27 +++++++++------- src/main/getDiForUnitTesting.ts | 16 +++++----- src/main/router/router.test.ts | 5 ++- .../create-application-window.injectable.ts | 9 ++++-- .../kube-object-menu.test.tsx | 14 +++++---- .../test-utils/get-application-builder.tsx | 16 +++++++--- src/renderer/getDi.tsx | 27 +++++++++------- src/renderer/getDiForUnitTesting.tsx | 26 +++++++++------- .../create-storage/storages-are-ready.ts | 7 +++-- 26 files changed, 217 insertions(+), 123 deletions(-) diff --git a/src/common/utils/channel/channel.test.ts b/src/common/utils/channel/channel.test.ts index a3d6a805e2..c5f52c0874 100644 --- a/src/common/utils/channel/channel.test.ts +++ b/src/common/utils/channel/channel.test.ts @@ -18,6 +18,7 @@ import { requestChannelListenerInjectionToken } from "./request-channel-listener import type { AsyncFnMock } from "@async-fn/jest"; import asyncFn from "@async-fn/jest"; import { getPromiseStatus } from "../../test-utils/get-promise-status"; +import { runInAction } from "mobx"; type TestMessageChannel = MessageChannel; type TestRequestChannel = RequestChannel; @@ -47,12 +48,16 @@ describe("channel", () => { }); builder.beforeApplicationStart((mainDi) => { - mainDi.register(testMessageChannelInjectable); + runInAction(() => { + mainDi.register(testMessageChannelInjectable); + }); }); builder.beforeWindowStart((windowDi) => { - windowDi.register(testChannelListenerInTestWindowInjectable); - windowDi.register(testMessageChannelInjectable); + runInAction(() => { + windowDi.register(testChannelListenerInTestWindowInjectable); + windowDi.register(testMessageChannelInjectable); + }); }); mainDi = builder.mainDi; @@ -126,12 +131,16 @@ describe("channel", () => { }); applicationBuilder.beforeApplicationStart((mainDi) => { - mainDi.register(testChannelListenerInMainInjectable); - mainDi.register(testMessageChannelInjectable); + runInAction(() => { + mainDi.register(testChannelListenerInMainInjectable); + mainDi.register(testMessageChannelInjectable); + }); }); applicationBuilder.beforeWindowStart((windowDi) => { - windowDi.register(testMessageChannelInjectable); + runInAction(() => { + windowDi.register(testMessageChannelInjectable); + }); }); await applicationBuilder.render(); @@ -172,12 +181,16 @@ describe("channel", () => { }); applicationBuilder.beforeApplicationStart((mainDi) => { - mainDi.register(testChannelListenerInMainInjectable); - mainDi.register(testRequestChannelInjectable); + runInAction(() => { + mainDi.register(testChannelListenerInMainInjectable); + mainDi.register(testRequestChannelInjectable); + }); }); applicationBuilder.beforeWindowStart((windowDi) => { - windowDi.register(testRequestChannelInjectable); + runInAction(() => { + windowDi.register(testRequestChannelInjectable); + }); }); await applicationBuilder.render(); diff --git a/src/common/utils/sync-box/sync-box.test.ts b/src/common/utils/sync-box/sync-box.test.ts index cfb8954802..95f139a8cd 100644 --- a/src/common/utils/sync-box/sync-box.test.ts +++ b/src/common/utils/sync-box/sync-box.test.ts @@ -18,11 +18,15 @@ describe("sync-box", () => { applicationBuilder = getApplicationBuilder(); applicationBuilder.beforeApplicationStart(mainDi => { - mainDi.register(someInjectable); + runInAction(() => { + mainDi.register(someInjectable); + }); }); applicationBuilder.beforeWindowStart((windowDi) => { - windowDi.register(someInjectable); + runInAction(() => { + windowDi.register(someInjectable); + }); }); }); diff --git a/src/extensions/extension-loader/extension/extension.injectable.ts b/src/extensions/extension-loader/extension/extension.injectable.ts index ba1bb6aea8..7ed23a3dfa 100644 --- a/src/extensions/extension-loader/extension/extension.injectable.ts +++ b/src/extensions/extension-loader/extension/extension.injectable.ts @@ -3,6 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; +import { runInAction } from "mobx"; import type { LensExtension } from "../../lens-extension"; import { extensionRegistratorInjectionToken } from "../extension-registrator-injection-token"; @@ -27,17 +28,23 @@ const extensionInjectable = getInjectable({ getInjectablesOfExtension(instance), ); - childDi.register(...injectables); + runInAction(() => { + childDi.register(...injectables); + }); }, deregister: () => { - parentDi.deregister(extensionInjectable); + runInAction(() => { + parentDi.deregister(extensionInjectable); + }); }, }; }, }); - parentDi.register(extensionInjectable); + runInAction(() => { + parentDi.register(extensionInjectable); + }); return parentDi.inject(extensionInjectable); }, diff --git a/src/features/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 index 90660f980f..5c1f27b8ca 100644 --- a/src/features/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 @@ -10,7 +10,7 @@ import type { KubernetesCluster } from "../../../../common/catalog-entities"; import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; import { getInjectable } from "@ogre-tools/injectable"; import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token"; -import { computed } from "mobx"; +import { computed, runInAction } from "mobx"; import React from "react"; import { navigateToRouteInjectionToken } from "../../../../common/front-end-routing/navigate-to-route-injection-token"; import { routeSpecificComponentInjectionToken } from "../../../../renderer/routes/route-specific-component-injection-token"; @@ -45,7 +45,9 @@ describe("disable kube object detail items when cluster is not relevant", () => windowDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); - windowDi.register(testRouteInjectable, testRouteComponentInjectable); + runInAction(() => { + windowDi.register(testRouteInjectable, testRouteComponentInjectable); + }); }); isEnabledForClusterMock = asyncFn(); diff --git a/src/features/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 index 5ca5961778..a2dbee433e 100644 --- a/src/features/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 @@ -39,7 +39,9 @@ describe("reactively hide kube object detail item", () => { } as unknown as ApiManager), ); - windowDi.register(testRouteInjectable, testRouteComponentInjectable); + runInAction(() => { + windowDi.register(testRouteInjectable, testRouteComponentInjectable); + }); }); someObservable = observable.box(false); diff --git a/src/features/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 index 94bd91681f..75df0f9359 100644 --- a/src/features/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 @@ -10,7 +10,7 @@ import type { KubernetesCluster } from "../../../../common/catalog-entities"; import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; import { getInjectable } from "@ogre-tools/injectable"; import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token"; -import { computed } from "mobx"; +import { computed, runInAction } from "mobx"; import React from "react"; import { navigateToRouteInjectionToken } from "../../../../common/front-end-routing/navigate-to-route-injection-token"; import { routeSpecificComponentInjectionToken } from "../../../../renderer/routes/route-specific-component-injection-token"; @@ -32,7 +32,10 @@ describe("disable kube object menu items when cluster is not relevant", () => { builder.beforeWindowStart((windowDi) => { windowDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); - windowDi.register(testRouteInjectable, testRouteComponentInjectable); + + runInAction(() => { + windowDi.register(testRouteInjectable, testRouteComponentInjectable); + }); }); isEnabledForClusterMock = asyncFn(); diff --git a/src/features/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 index 61a5fe6e90..be8cc96ed9 100644 --- a/src/features/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 @@ -26,7 +26,9 @@ describe("reactively hide kube object menu item", () => { builder.setEnvironmentToClusterFrame(); builder.beforeWindowStart((windowDi) => { - windowDi.register(testRouteInjectable, testRouteComponentInjectable); + runInAction(() => { + windowDi.register(testRouteInjectable, testRouteComponentInjectable); + }); }); someObservable = observable.box(false); diff --git a/src/features/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 index 7a459c258d..b3bc2b3716 100644 --- a/src/features/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 @@ -10,7 +10,7 @@ import type { KubernetesCluster } from "../../../../common/catalog-entities"; import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; import { getInjectable } from "@ogre-tools/injectable"; import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token"; -import { computed } from "mobx"; +import { computed, runInAction } from "mobx"; import React from "react"; import { navigateToRouteInjectionToken } from "../../../../common/front-end-routing/navigate-to-route-injection-token"; import { routeSpecificComponentInjectionToken } from "../../../../renderer/routes/route-specific-component-injection-token"; @@ -33,7 +33,10 @@ describe("disable kube object statuses when cluster is not relevant", () => { builder.beforeWindowStart((windowDi) => { windowDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); - windowDi.register(testRouteInjectable, testRouteComponentInjectable); + + runInAction(() => { + windowDi.register(testRouteInjectable, testRouteComponentInjectable); + }); }); isEnabledForClusterMock = asyncFn(); diff --git a/src/features/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 index 7dd45803a2..8e197f3f30 100644 --- a/src/features/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 @@ -29,7 +29,10 @@ describe("reactively hide kube object status", () => { builder.beforeWindowStart((windowDi) => { windowDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable); - windowDi.register(testRouteInjectable, testRouteComponentInjectable); + + runInAction(() => { + windowDi.register(testRouteInjectable, testRouteComponentInjectable); + }); }); someObservable = observable.box(false); diff --git a/src/features/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 index eba681ef47..95d508351d 100644 --- a/src/features/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 @@ -9,7 +9,7 @@ import { useFakeTime } from "../../../common/test-utils/use-fake-time"; import type { DiContainer } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable"; import type { IAtom } from "mobx"; -import { createAtom, computed } from "mobx"; +import { runInAction, createAtom, computed } from "mobx"; import { frontEndRouteInjectionToken } from "../../../common/front-end-routing/front-end-route-injection-token"; import { routeSpecificComponentInjectionToken } from "../../../renderer/routes/route-specific-component-injection-token"; import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; @@ -94,14 +94,17 @@ describe("show status for a kube object", () => { }); builder.beforeWindowStart((windowDi) => { - windowDi.register( - testRouteInjectable, - testRouteComponentInjectable, - infoStatusInjectable, - warningStatusInjectable, - criticalStatusInjectable, - someAtomInjectable, - ); + runInAction(() => { + windowDi.register( + testRouteInjectable, + testRouteComponentInjectable, + infoStatusInjectable, + warningStatusInjectable, + criticalStatusInjectable, + someAtomInjectable, + ); + + }); }); builder.setEnvironmentToClusterFrame(); @@ -141,7 +144,9 @@ describe("show status for a kube object", () => { describe("when status for irrelevant kube object kind emerges", () => { beforeEach(() => { - windowDi.register(statusForIrrelevantKubeObjectKindInjectable); + runInAction(() => { + windowDi.register(statusForIrrelevantKubeObjectKindInjectable); + }); rerenderParent(); }); @@ -161,7 +166,9 @@ describe("show status for a kube object", () => { describe("when status for irrelevant kube object api version emerges", () => { beforeEach(() => { - windowDi.register(statusForIrrelevantKubeObjectApiVersionInjectable); + runInAction(() => { + windowDi.register(statusForIrrelevantKubeObjectApiVersionInjectable); + }); rerenderParent(); }); diff --git a/src/features/cluster/order-of-sidebar-items.test.tsx b/src/features/cluster/order-of-sidebar-items.test.tsx index 718d267e70..449fb838c1 100644 --- a/src/features/cluster/order-of-sidebar-items.test.tsx +++ b/src/features/cluster/order-of-sidebar-items.test.tsx @@ -7,7 +7,7 @@ import type { RenderResult } from "@testing-library/react"; import { fireEvent } from "@testing-library/react"; import type { SidebarItemRegistration } from "../../renderer/components/layout/sidebar-items.injectable"; import { sidebarItemsInjectionToken } from "../../renderer/components/layout/sidebar-items.injectable"; -import { computed } from "mobx"; +import { computed, runInAction } from "mobx"; import { noop } from "lodash/fp"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; @@ -22,7 +22,9 @@ describe("cluster - order of sidebar items", () => { builder.setEnvironmentToClusterFrame(); builder.beforeWindowStart((windowDi) => { - windowDi.register(testSidebarItemsInjectable); + runInAction(() => { + windowDi.register(testSidebarItemsInjectable); + }); }); }); diff --git a/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx b/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx index caa9873208..2272fc0db6 100644 --- a/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx +++ b/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx @@ -11,7 +11,7 @@ import directoryForLensLocalStorageInjectable from "../../common/directory-for-l import { routeSpecificComponentInjectionToken } from "../../renderer/routes/route-specific-component-injection-token"; import type { SidebarItemRegistration } from "../../renderer/components/layout/sidebar-items.injectable"; import { sidebarItemsInjectionToken } from "../../renderer/components/layout/sidebar-items.injectable"; -import { computed } from "mobx"; +import { computed, runInAction } from "mobx"; import { noop } from "lodash/fp"; import routeIsActiveInjectable from "../../renderer/routes/route-is-active.injectable"; import { frontEndRouteInjectionToken } from "../../common/front-end-routing/front-end-route-injection-token"; @@ -51,9 +51,11 @@ describe("cluster - sidebar and tab navigation for core", () => { describe("given core registrations", () => { beforeEach(() => { builder.beforeWindowStart((windowDi) => { - windowDi.register(testRouteInjectable); - windowDi.register(testRouteComponentInjectable); - windowDi.register(testSidebarItemsInjectable); + runInAction(() => { + windowDi.register(testRouteInjectable); + windowDi.register(testRouteComponentInjectable); + windowDi.register(testSidebarItemsInjectable); + }); }); }); diff --git a/src/features/cluster/visibility-of-sidebar-items.test.tsx b/src/features/cluster/visibility-of-sidebar-items.test.tsx index 52224b7cd1..0e09f0efa8 100644 --- a/src/features/cluster/visibility-of-sidebar-items.test.tsx +++ b/src/features/cluster/visibility-of-sidebar-items.test.tsx @@ -6,7 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import type { RenderResult } from "@testing-library/react"; import type { SidebarItemRegistration } from "../../renderer/components/layout/sidebar-items.injectable"; import { sidebarItemsInjectionToken } from "../../renderer/components/layout/sidebar-items.injectable"; -import { computed } from "mobx"; +import { computed, runInAction } from "mobx"; import { routeSpecificComponentInjectionToken } from "../../renderer/routes/route-specific-component-injection-token"; import React from "react"; import isAllowedResourceInjectable from "../../common/utils/is-allowed-resource.injectable"; @@ -25,9 +25,11 @@ describe("cluster - visibility of sidebar items", () => { builder.setEnvironmentToClusterFrame(); builder.beforeWindowStart((windowDi) => { - windowDi.register(testRouteInjectable); - windowDi.register(testRouteComponentInjectable); - windowDi.register(testSidebarItemsInjectable); + runInAction(() => { + windowDi.register(testRouteInjectable); + windowDi.register(testRouteComponentInjectable); + windowDi.register(testSidebarItemsInjectable); + }); }); }); diff --git a/src/features/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 index 70d9983f2b..620b2cabb1 100644 --- a/src/features/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 @@ -8,7 +8,7 @@ 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"; import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; +import { computed, runInAction } from "mobx"; describe("order of workload overview details", () => { let rendered: RenderResult; @@ -20,11 +20,13 @@ describe("order of workload overview details", () => { windowDi.unoverride(getRandomIdInjectable); windowDi.permitSideEffects(getRandomIdInjectable); - windowDi.register( - someCoreItemWithLowOrderNumberInjectable, - someCoreItemWithHighOrderNumberInjectable, - someCoreItemWithDefaultOrderNumberInjectable, - ); + runInAction(() => { + windowDi.register( + someCoreItemWithLowOrderNumberInjectable, + someCoreItemWithHighOrderNumberInjectable, + someCoreItemWithDefaultOrderNumberInjectable, + ); + }); }); builder.setEnvironmentToClusterFrame(); diff --git a/src/features/navigating-between-routes.test.tsx b/src/features/navigating-between-routes.test.tsx index bcff0e2a11..cf2dda5cc1 100644 --- a/src/features/navigating-between-routes.test.tsx +++ b/src/features/navigating-between-routes.test.tsx @@ -5,7 +5,7 @@ import type { DiContainer } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable"; import React from "react"; -import { computed } from "mobx"; +import { computed, runInAction } from "mobx"; import type { RenderResult } from "@testing-library/react"; import { routeSpecificComponentInjectionToken } from "../renderer/routes/route-specific-component-injection-token"; import { observer } from "mobx-react"; @@ -32,8 +32,10 @@ describe("navigating between routes", () => { beforeEach(async () => { builder.beforeWindowStart((windowDi) => { - windowDi.register(testRouteWithoutPathParametersInjectable); - windowDi.register(testRouteWithoutPathParametersComponentInjectable); + runInAction(() => { + windowDi.register(testRouteWithoutPathParametersInjectable); + windowDi.register(testRouteWithoutPathParametersComponentInjectable); + }); }); rendered = await builder.render(); @@ -106,8 +108,10 @@ describe("navigating between routes", () => { beforeEach(async () => { builder.beforeWindowStart((windowDi) => { - windowDi.register(routeWithOptionalPathParametersInjectable); - windowDi.register(routeWithOptionalPathParametersComponentInjectable); + runInAction(() => { + windowDi.register(routeWithOptionalPathParametersInjectable); + windowDi.register(routeWithOptionalPathParametersComponentInjectable); + }); }); rendered = await builder.render(); diff --git a/src/features/preferences/closing-preferences.test.tsx b/src/features/preferences/closing-preferences.test.tsx index f93eaf70ce..5363e6e76f 100644 --- a/src/features/preferences/closing-preferences.test.tsx +++ b/src/features/preferences/closing-preferences.test.tsx @@ -9,7 +9,7 @@ import type { ApplicationBuilder } from "../../renderer/components/test-utils/ge import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import currentPathInjectable from "../../renderer/routes/current-path.injectable"; import { frontEndRouteInjectionToken } from "../../common/front-end-routing/front-end-route-injection-token"; -import { computed } from "mobx"; +import { computed, runInAction } from "mobx"; import { preferenceNavigationItemInjectionToken } from "../../renderer/components/+preferences/preferences-navigation/preference-navigation-items.injectable"; import routeIsActiveInjectable from "../../renderer/routes/route-is-active.injectable"; import { Preferences } from "../../renderer/components/+preferences"; @@ -30,11 +30,13 @@ describe("preferences - closing-preferences", () => { builder = getApplicationBuilder(); builder.beforeWindowStart((windowDi) => { - windowDi.register(testPreferencesRouteInjectable); - windowDi.register(testPreferencesRouteComponentInjectable); - windowDi.register(testFrontPageRouteInjectable); - windowDi.register(testFrontPageRouteComponentInjectable); - windowDi.register(testNavigationItemInjectable); + runInAction(() => { + windowDi.register(testPreferencesRouteInjectable); + windowDi.register(testPreferencesRouteComponentInjectable); + windowDi.register(testFrontPageRouteInjectable); + windowDi.register(testFrontPageRouteComponentInjectable); + windowDi.register(testNavigationItemInjectable); + }); windowDi.override(navigateToFrontPageInjectable, (di) => { const navigateToRoute = di.inject(navigateToRouteInjectionToken); diff --git a/src/features/quitting-and-restarting-the-app/opening-application-window-using-tray.test.ts b/src/features/quitting-and-restarting-the-app/opening-application-window-using-tray.test.ts index f9ced472dd..86f0a6b83a 100644 --- a/src/features/quitting-and-restarting-the-app/opening-application-window-using-tray.test.ts +++ b/src/features/quitting-and-restarting-the-app/opening-application-window-using-tray.test.ts @@ -13,6 +13,7 @@ import focusApplicationInjectable from "../../main/electron-app/features/focus-a import type { CreateElectronWindow } from "../../main/start-main-application/lens-window/application-window/create-electron-window.injectable"; import createElectronWindowInjectable from "../../main/start-main-application/lens-window/application-window/create-electron-window.injectable"; import splashWindowInjectable from "../../main/start-main-application/lens-window/splash-window/splash-window.injectable"; +import { runInAction } from "mobx"; describe("opening application window using tray", () => { describe("given application has started", () => { @@ -61,10 +62,12 @@ describe("opening application window using tray", () => { return browserWindow; }); - (mainDi as any).decorateFunction( - createElectronWindowInjectable, - createElectronWindowMock, - ); + runInAction(() => { + (mainDi as any).decorateFunction( + createElectronWindowInjectable, + createElectronWindowMock, + ); + }); expectWindowsToBeOpen = expectWindowsToBeOpenFor(builder); }); diff --git a/src/main/getDi.ts b/src/main/getDi.ts index ded33e9e0f..17d9cc36b7 100644 --- a/src/main/getDi.ts +++ b/src/main/getDi.ts @@ -5,24 +5,27 @@ import { createContainer } from "@ogre-tools/injectable"; import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration"; import { registerMobX } from "@ogre-tools/injectable-extension-for-mobx"; +import { runInAction } from "mobx"; import { Environments, setLegacyGlobalDiForExtensionApi } from "../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; export const getDi = () => { const di = createContainer("main"); - registerMobX(di); - - autoRegister({ - di, - requireContexts: [ - require.context("./", true, /\.injectable\.(ts|tsx)$/), - require.context("../extensions", true, /\.injectable\.(ts|tsx)$/), - require.context("../common", true, /\.injectable\.(ts|tsx)$/), - require.context("../features", true, /.*\/(main|common)\/.*\.injectable\.(ts|tsx)$/), - ], - }); - setLegacyGlobalDiForExtensionApi(di, Environments.main); + runInAction(() => { + registerMobX(di); + + autoRegister({ + di, + requireContexts: [ + require.context("./", true, /\.injectable\.(ts|tsx)$/), + require.context("../extensions", true, /\.injectable\.(ts|tsx)$/), + require.context("../common", true, /\.injectable\.(ts|tsx)$/), + require.context("../features", true, /.*\/(main|common)\/.*\.injectable\.(ts|tsx)$/), + ], + }); + }); + return di; }; diff --git a/src/main/getDiForUnitTesting.ts b/src/main/getDiForUnitTesting.ts index af891b1412..b7a5bf2431 100644 --- a/src/main/getDiForUnitTesting.ts +++ b/src/main/getDiForUnitTesting.ts @@ -55,7 +55,7 @@ import setupRunnablesBeforeClosingOfApplicationInjectable from "./electron-app/r import showMessagePopupInjectable from "./electron-app/features/show-message-popup.injectable"; import clusterFramesInjectable from "../common/cluster-frames.injectable"; import type { ClusterFrameInfo } from "../common/cluster-frames"; -import { observable } from "mobx"; +import { observable, runInAction } from "mobx"; import waitForElectronToBeReadyInjectable from "./electron-app/features/wait-for-electron-to-be-ready.injectable"; import setupListenerForCurrentClusterFrameInjectable from "./start-main-application/lens-window/current-cluster-frame/setup-listener-for-current-cluster-frame.injectable"; import setupRunnablesAfterWindowIsOpenedInjectable from "./electron-app/runnables/setup-runnables-after-window-is-opened.injectable"; @@ -103,19 +103,21 @@ export function getDiForUnitTesting(opts: { doGeneralOverrides?: boolean } = {}) const di = createContainer("main"); - registerMobX(di); - setLegacyGlobalDiForExtensionApi(di, Environments.main); + di.preventSideEffects(); + const injectables: Injectable[] = (global as any).mainInjectablePaths.map( (filePath: string) => require(filePath).default, ); - chunk(100)(injectables).forEach(chunkInjectables => { - di.register(...chunkInjectables); - }); + runInAction(() => { + registerMobX(di); - di.preventSideEffects(); + chunk(100)(injectables).forEach(chunkInjectables => { + di.register(...chunkInjectables); + }); + }); if (doGeneralOverrides) { const globalOverrides: GlobalOverride[] = (global as any).mainGlobalOverridePaths.map( diff --git a/src/main/router/router.test.ts b/src/main/router/router.test.ts index a8467df3f2..a487104c72 100644 --- a/src/main/router/router.test.ts +++ b/src/main/router/router.test.ts @@ -20,6 +20,7 @@ import type { SetRequired } from "type-fest"; import normalizedPlatformInjectable from "../../common/vars/normalized-platform.injectable"; import kubectlBinaryNameInjectable from "../kubectl/binary-name.injectable"; import kubectlDownloadingNormalizedArchInjectable from "../kubectl/normalized-arch.injectable"; +import { runInAction } from "mobx"; describe("router", () => { let router: Router; @@ -53,7 +54,9 @@ describe("router", () => { injectionToken: routeInjectionToken, }); - di.register(injectable); + runInAction(() => { + di.register(injectable); + }); router = di.inject(routerInjectable); }); diff --git a/src/main/start-main-application/lens-window/application-window/create-application-window.injectable.ts b/src/main/start-main-application/lens-window/application-window/create-application-window.injectable.ts index 91975c314d..1652b67f9b 100644 --- a/src/main/start-main-application/lens-window/application-window/create-application-window.injectable.ts +++ b/src/main/start-main-application/lens-window/application-window/create-application-window.injectable.ts @@ -10,6 +10,7 @@ import appNameInjectable from "../../../app-paths/app-name/app-name.injectable"; import appEventBusInjectable from "../../../../common/app-event-bus/app-event-bus.injectable"; import waitUntilBundledExtensionsAreLoadedInjectable from "./wait-until-bundled-extensions-are-loaded.injectable"; import { applicationWindowInjectionToken } from "./application-window-injection-token"; +import { runInAction } from "mobx"; const createApplicationWindowInjectable = getInjectable({ id: "create-application-window", @@ -49,7 +50,9 @@ const createApplicationWindowInjectable = getInjectable({ }, onClose: () => { - parentDi.deregister(windowInjectable); + runInAction(() => { + parentDi.deregister(windowInjectable); + }); }, beforeOpen: waitUntilBundledExtensionsAreLoaded, @@ -59,7 +62,9 @@ const createApplicationWindowInjectable = getInjectable({ injectionToken: applicationWindowInjectionToken, }); - parentDi.register(windowInjectable); + runInAction(() => { + parentDi.register(windowInjectable); + }); return parentDi.inject(windowInjectable); }, diff --git a/src/renderer/components/kube-object-menu/kube-object-menu.test.tsx b/src/renderer/components/kube-object-menu/kube-object-menu.test.tsx index 80a783c19a..b435d2b6b6 100644 --- a/src/renderer/components/kube-object-menu/kube-object-menu.test.tsx +++ b/src/renderer/components/kube-object-menu/kube-object-menu.test.tsx @@ -14,7 +14,7 @@ import { ConfirmDialog } from "../confirm-dialog"; import type { AsyncFnMock } from "@async-fn/jest"; import asyncFn from "@async-fn/jest"; import { getDiForUnitTesting } from "../../getDiForUnitTesting"; -import { computed } from "mobx"; +import { computed, runInAction } from "mobx"; import clusterInjectable from "./dependencies/cluster.injectable"; import type { DiRender } from "../test-utils/renderFor"; import { renderFor } from "../test-utils/renderFor"; @@ -34,11 +34,13 @@ describe("kube-object-menu", () => { beforeEach(() => { di = getDiForUnitTesting({ doGeneralOverrides: true }); - di.register( - someMenuItemInjectable, - someOtherMenuItemInjectable, - someAnotherMenuItemInjectable, - ); + runInAction(() => { + di.register( + someMenuItemInjectable, + someOtherMenuItemInjectable, + someAnotherMenuItemInjectable, + ); + }); render = renderFor(di); diff --git a/src/renderer/components/test-utils/get-application-builder.tsx b/src/renderer/components/test-utils/get-application-builder.tsx index 5ca3c5975f..9f9ab7d903 100644 --- a/src/renderer/components/test-utils/get-application-builder.tsx +++ b/src/renderer/components/test-utils/get-application-builder.tsx @@ -143,7 +143,9 @@ export const getApplicationBuilder = () => { doGeneralOverrides: true, }); - mainDi.register(mainExtensionsStateInjectable); + runInAction(() => { + mainDi.register(mainExtensionsStateInjectable); + }); const overrideChannelsForWindow = overrideChannels(mainDi); @@ -184,7 +186,9 @@ export const getApplicationBuilder = () => { overrideChannelsForWindow(windowDi, windowId); - windowDi.register(rendererExtensionsStateInjectable); + runInAction(() => { + windowDi.register(rendererExtensionsStateInjectable); + }); windowDi.override( currentlyInClusterFrameInjectable, @@ -552,9 +556,11 @@ export const getApplicationBuilder = () => { getExtensionFakeForMain(mainDi, extension.id, extension.name, extension.mainOptions || {}), ); - mainExtensionInstances.forEach( - enableExtensionFor(mainDi, mainExtensionsStateInjectable), - ); + runInAction(() => { + mainExtensionInstances.forEach( + enableExtensionFor(mainDi, mainExtensionsStateInjectable), + ); + }); }); }, diff --git a/src/renderer/getDi.tsx b/src/renderer/getDi.tsx index 632b651547..348c5e369b 100644 --- a/src/renderer/getDi.tsx +++ b/src/renderer/getDi.tsx @@ -6,24 +6,27 @@ import { createContainer } from "@ogre-tools/injectable"; import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration"; import { registerMobX } from "@ogre-tools/injectable-extension-for-mobx"; +import { runInAction } from "mobx"; import { Environments, setLegacyGlobalDiForExtensionApi } from "../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; export const getDi = () => { const di = createContainer("renderer"); - registerMobX(di); - - autoRegister({ - di, - requireContexts: [ - require.context("./", true, /\.injectable\.(ts|tsx)$/), - require.context("../common", true, /\.injectable\.(ts|tsx)$/), - require.context("../extensions", true, /\.injectable\.(ts|tsx)$/), - require.context("../features", true, /.*\/(renderer|common)\/.*\.injectable\.(ts|tsx)$/), - ], - }); - setLegacyGlobalDiForExtensionApi(di, Environments.renderer); + runInAction(() => { + registerMobX(di); + + autoRegister({ + di, + requireContexts: [ + require.context("./", true, /\.injectable\.(ts|tsx)$/), + require.context("../common", true, /\.injectable\.(ts|tsx)$/), + require.context("../extensions", true, /\.injectable\.(ts|tsx)$/), + require.context("../features", true, /.*\/(renderer|common)\/.*\.injectable\.(ts|tsx)$/), + ], + }); + }); + return di; }; diff --git a/src/renderer/getDiForUnitTesting.tsx b/src/renderer/getDiForUnitTesting.tsx index ddd560674f..469de713b0 100644 --- a/src/renderer/getDiForUnitTesting.tsx +++ b/src/renderer/getDiForUnitTesting.tsx @@ -33,7 +33,7 @@ import lensResourcesDirInjectable from "../common/vars/lens-resources-dir.inject import broadcastMessageInjectable from "../common/ipc/broadcast-message.injectable"; import apiManagerInjectable from "../common/k8s-api/api-manager/manager.injectable"; import setupOnApiErrorListenersInjectable from "./api/setup-on-api-errors.injectable"; -import { observable, computed } from "mobx"; +import { observable, computed, runInAction } from "mobx"; import defaultShellInjectable from "./components/+preferences/default-shell.injectable"; import appVersionInjectable from "../common/vars/app-version.injectable"; import requestAnimationFrameInjectable from "./components/animate/request-animation-frame.injectable"; @@ -68,26 +68,30 @@ import getEntitySettingCommandsInjectable from "./components/command-palette/reg import storageSaveDelayInjectable from "./utils/create-storage/storage-save-delay.injectable"; import type { GlobalOverride } from "../common/test-utils/get-global-override"; -export const getDiForUnitTesting = (opts: { doGeneralOverrides?: boolean } = {}) => { - const { - doGeneralOverrides = false, - } = opts; +export const getDiForUnitTesting = ( + opts: { doGeneralOverrides?: boolean } = {}, +) => { + const { doGeneralOverrides = false } = opts; const di = createContainer("renderer"); - registerMobX(di); + di.preventSideEffects(); setLegacyGlobalDiForExtensionApi(di, Environments.renderer); - const injectables: Injectable[] = (global as any).rendererInjectablePaths.map( + const injectables: Injectable[] = ( + global as any + ).rendererInjectablePaths.map( (filePath: string) => require(filePath).default, ); - chunk(100)(injectables).forEach(chunkInjectables => { - di.register(...chunkInjectables); - }); + runInAction(() => { + registerMobX(di); - di.preventSideEffects(); + chunk(100)(injectables).forEach((chunkInjectables) => { + di.register(...chunkInjectables); + }); + }); if (doGeneralOverrides) { const globalOverrides: GlobalOverride[] = (global as any).rendererGlobalOverridePaths.map( diff --git a/src/renderer/utils/create-storage/storages-are-ready.ts b/src/renderer/utils/create-storage/storages-are-ready.ts index 04f2595472..8489138d1d 100644 --- a/src/renderer/utils/create-storage/storages-are-ready.ts +++ b/src/renderer/utils/create-storage/storages-are-ready.ts @@ -3,6 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import type { DiContainer } from "@ogre-tools/injectable"; +import { runInAction } from "mobx"; import type { CreateStorage } from "./create-storage"; import createStorageInjectable from "./create-storage.injectable"; @@ -19,8 +20,10 @@ export const controlWhenStoragesAreReady = (di: DiContainer) => { return storage; }; - // TODO: Remove when typing is added to the library - (di as any).decorateFunction(createStorageInjectable, decorated); + runInAction(() => { + // TODO: Remove when typing is added to the library + (di as any).decorateFunction(createStorageInjectable, decorated); + }); return async () => { await Promise.all(storagesAreReady);