Simplify logic for injecting many instances which can reactively change e.g. based on extension being enabled or disabled (#5662)

* Reorganize stuff to prevent circular dependencies

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>

* Install injectable extension to allow injecting reactively many implementations

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>

* Switch to using computedInjectMany over filtering injectMany based on enabled extensions for simplicity

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>

* Remove await for not being needed

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>

* Sort dependencies alphabetically

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
Janne Savolainen authored and GitHub committed 2022-06-20 10:19:20 +03:00
1 parent d0ed4e46b1
commit f87f5f245c
35 files changed
+245 -333

No files matched your search

@@ -42,11 +42,11 @@ describe("cluster - sidebar and tab navigation for extensions", () => {
});
describe("given extension with cluster pages and cluster page menus", () => {
beforeEach(async () => {
beforeEach(() => {
const getRendererExtensionFake = getRendererExtensionFakeFor(applicationBuilder);
const testExtension = getRendererExtensionFake(extensionStubWithSidebarItems);
await applicationBuilder.extensions.renderer.enable(testExtension);
applicationBuilder.extensions.renderer.enable(testExtension);
});
describe("given no state for expanded sidebar items exists, and navigated to child sidebar item, when rendered", () => {
@@ -23,7 +23,7 @@ describe("extension special characters in page registrations", () => {
extensionWithPagesHavingSpecialCharacters,
);
await applicationBuilder.extensions.renderer.enable(testExtension);
applicationBuilder.extensions.renderer.enable(testExtension);
rendered = await applicationBuilder.render();
});
@@ -27,7 +27,7 @@ describe("navigate to extension page", () => {
extensionWithPagesHavingParameters,
);
await applicationBuilder.extensions.renderer.enable(testExtension);
applicationBuilder.extensions.renderer.enable(testExtension);
rendered = await applicationBuilder.render();
@@ -16,8 +16,8 @@ import { getApplicationBuilder } from "../renderer/components/test-utils/get-app
import currentRouteInjectable from "../renderer/routes/current-route.injectable";
import currentPathInjectable from "../renderer/routes/current-path.injectable";
import queryParametersInjectable from "../renderer/routes/query-parameters.injectable";
import currentPathParametersInjectable from "../renderer/routes/current-path-parameters.injectable";
import { navigateToRouteInjectionToken } from "../common/front-end-routing/navigate-to-route-injection-token";
import routePathParametersInjectable from "../renderer/routes/route-path-parameters.injectable";
describe("navigating between routes", () => {
let rendererDi: DiContainer;
@@ -73,7 +73,7 @@ describe("navigating between routes", () => {
});
it("does not have path parameters", () => {
const pathParameters = rendererDi.inject(currentPathParametersInjectable);
const pathParameters = rendererDi.inject(routePathParametersInjectable, route);
expect(pathParameters.get()).toEqual({});
});
@@ -101,7 +101,6 @@ describe("navigating between routes", () => {
describe("given route with optional path parameters", () => {
beforeEach(async () => {
applicationBuilder.beforeApplicationStart(({ rendererDi }) => {
rendererDi.register(routeWithOptionalPathParametersInjectable);
rendererDi.register(routeWithOptionalPathParametersComponentInjectable);
@@ -146,7 +145,7 @@ describe("navigating between routes", () => {
});
it("knows path parameters", () => {
const pathParameters = rendererDi.inject(currentPathParametersInjectable);
const pathParameters = rendererDi.inject(routePathParametersInjectable, route);
expect(pathParameters.get()).toEqual({
someParameter: "some-value",
@@ -179,7 +178,7 @@ describe("navigating between routes", () => {
});
it("knows path parameters", () => {
const pathParameters = rendererDi.inject(currentPathParametersInjectable);
const pathParameters = rendererDi.inject(routePathParametersInjectable, route);
expect(pathParameters.get()).toEqual({
someParameter: undefined,
@@ -227,10 +226,11 @@ const routeWithOptionalPathParametersComponentInjectable = getInjectable({
id: "some-route-component",
instantiate: (di) => {
const pathParameters = di.inject(currentPathParametersInjectable);
const route = di.inject(routeWithOptionalPathParametersInjectable);
const pathParameters = di.inject(routePathParametersInjectable, route);
return {
route: di.inject(routeWithOptionalPathParametersInjectable),
route,
Component: observer(() => (
<pre>{JSON.stringify(pathParameters.get(), null, 2)}</pre>
@@ -44,11 +44,11 @@ describe("preferences - navigation to extension specific preferences", () => {
});
describe("when extension with specific preferences is enabled", () => {
beforeEach(async () => {
beforeEach(() => {
const getRendererExtensionFake = getRendererExtensionFakeFor(applicationBuilder);
const testExtension = getRendererExtensionFake(extensionStubWithExtensionSpecificPreferenceItems);
await applicationBuilder.extensions.renderer.enable(testExtension);
applicationBuilder.extensions.renderer.enable(testExtension);
});
it("renders", () => {
@@ -29,7 +29,7 @@ describe("clicking tray menu item originating from extension", () => {
let someExtension: SomeTestExtension;
let clickMock: jest.Mock;
beforeEach(async () => {
beforeEach(() => {
clickMock = jest.fn();
someExtension = new SomeTestExtension({
@@ -37,12 +37,12 @@ describe("clicking tray menu item originating from extension", () => {
trayMenus: [{ label: "some-label", click: clickMock }],
});
await applicationBuilder.extensions.main.enable(someExtension);
applicationBuilder.extensions.main.enable(someExtension);
});
it("when item is clicked, triggers the click handler", () => {
applicationBuilder.tray.click(
"some-label-tray-menu-item-for-extension-some-extension-id-instance-1",
"some-label-tray-menu-item-for-extension-some-extension-id",
);
expect(clickMock).toHaveBeenCalled();
@@ -55,7 +55,7 @@ describe("clicking tray menu item originating from extension", () => {
});
applicationBuilder.tray.click(
"some-label-tray-menu-item-for-extension-some-extension-id-instance-1",
"some-label-tray-menu-item-for-extension-some-extension-id",
);
});
@@ -72,7 +72,7 @@ describe("clicking tray menu item originating from extension", () => {
clickMock.mockImplementation(() => Promise.reject("some-rejection"));
applicationBuilder.tray.click(
"some-label-tray-menu-item-for-extension-some-extension-id-instance-1",
"some-label-tray-menu-item-for-extension-some-extension-id",
);
});
@@ -90,11 +90,9 @@ describe("clicking tray menu item originating from extension", () => {
});
it("does not have the tray menu item from extension", () => {
applicationBuilder.extensions.main.disable(someExtension);
expect(
applicationBuilder.tray.get(
"some-label-tray-menu-item-for-extension-some-extension-id-instance-1",
"some-label-tray-menu-item-for-extension-some-extension-id",
),
).toBeNull();
});
@@ -105,7 +103,7 @@ describe("clicking tray menu item originating from extension", () => {
expect(
applicationBuilder.tray.get(
"some-label-tray-menu-item-for-extension-some-extension-id-instance-2",
"some-label-tray-menu-item-for-extension-some-extension-id",
),
).not.toBeNull();
});
@@ -28,9 +28,9 @@ describe("multiple separators originating from extension", () => {
trayMenus: [{ type: "separator" }, { type: "separator" } ],
});
return expect(
applicationBuilder.extensions.main.enable(someExtension),
).resolves.toBeUndefined();
expect(() => {
applicationBuilder.extensions.main.enable(someExtension);
}).not.toThrow();
});
});