1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Actually fix tests for lens protocol router main

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2022-06-09 18:02:42 -04:00
parent 3664306ac7
commit 571a5e360f
4 changed files with 30 additions and 37 deletions

View File

@ -63,9 +63,9 @@ export function foldAttemptResults(mainAttempt: RouteAttempt, rendererAttempt: R
} }
} }
interface Dependencies { export interface LensProtocolRouterDependencies {
extensionLoader: ExtensionLoader; readonly extensionLoader: ExtensionLoader;
extensionsStore: ExtensionsStore; readonly extensionsStore: ExtensionsStore;
} }
export abstract class LensProtocolRouter { export abstract class LensProtocolRouter {
@ -76,7 +76,7 @@ export abstract class LensProtocolRouter {
static readonly ExtensionUrlSchema = `/:${EXTENSION_PUBLISHER_MATCH}(@[A-Za-z0-9_]+)?/:${EXTENSION_NAME_MATCH}`; static readonly ExtensionUrlSchema = `/:${EXTENSION_PUBLISHER_MATCH}(@[A-Za-z0-9_]+)?/:${EXTENSION_NAME_MATCH}`;
constructor(protected dependencies: Dependencies) {} constructor(protected readonly dependencies: LensProtocolRouterDependencies) {}
/** /**
* Attempts to route the given URL to all internal routes that have been registered * Attempts to route the given URL to all internal routes that have been registered

View File

@ -17,6 +17,11 @@ export interface LensExtensionState {
name: string; name: string;
} }
export interface IsEnabledExtensionDescriptor {
id: string;
isBundled: boolean;
}
export class ExtensionsStore extends BaseStore<LensExtensionsStoreModel> { export class ExtensionsStore extends BaseStore<LensExtensionsStoreModel> {
readonly displayName = "ExtensionsStore"; readonly displayName = "ExtensionsStore";
constructor() { constructor() {
@ -36,7 +41,7 @@ export class ExtensionsStore extends BaseStore<LensExtensionsStoreModel> {
protected state = observable.map<LensExtensionId, LensExtensionState>(); protected state = observable.map<LensExtensionId, LensExtensionState>();
isEnabled({ id, isBundled }: { id: string; isBundled: boolean }): boolean { isEnabled({ id, isBundled }: IsEnabledExtensionDescriptor): boolean {
// By default false, so that copied extensions are disabled by default. // By default false, so that copied extensions are disabled by default.
// If user installs the extension from the UI, the Extensions component will specifically enable it. // If user installs the extension from the UI, the Extensions component will specifically enable it.
return isBundled || Boolean(this.state.get(id)?.enabled); return isBundled || Boolean(this.state.get(id)?.enabled);

View File

@ -6,11 +6,10 @@
import * as uuid from "uuid"; import * as uuid from "uuid";
import { broadcastMessage } from "../../../common/ipc"; import { broadcastMessage } from "../../../common/ipc";
import { ProtocolHandlerExtension, ProtocolHandlerInternal } from "../../../common/protocol-handler"; import { ProtocolHandlerExtension, ProtocolHandlerInternal, ProtocolHandlerInvalid } from "../../../common/protocol-handler";
import { delay, noop } from "../../../common/utils"; import { delay, noop } from "../../../common/utils";
import { ExtensionsStore } from "../../../extensions/extensions-store/extensions-store"; import type { ExtensionsStore, IsEnabledExtensionDescriptor } from "../../../extensions/extensions-store/extensions-store";
import type { LensProtocolRouterMain } from "../lens-protocol-router-main/lens-protocol-router-main"; import type { LensProtocolRouterMain } from "../lens-protocol-router-main/lens-protocol-router-main";
import mockFs from "mock-fs";
import { getDiForUnitTesting } from "../../getDiForUnitTesting"; import { getDiForUnitTesting } from "../../getDiForUnitTesting";
import lensProtocolRouterMainInjectable from "../lens-protocol-router-main/lens-protocol-router-main.injectable"; import lensProtocolRouterMainInjectable from "../lens-protocol-router-main/lens-protocol-router-main.injectable";
import extensionsStoreInjectable from "../../../extensions/extensions-store/extensions-store.injectable"; import extensionsStoreInjectable from "../../../extensions/extensions-store/extensions-store.injectable";
@ -33,16 +32,16 @@ function throwIfDefined(val: any): void {
describe("protocol router tests", () => { describe("protocol router tests", () => {
let extensionInstances: ObservableMap<LensExtensionId, LensExtension>; let extensionInstances: ObservableMap<LensExtensionId, LensExtension>;
let lpr: LensProtocolRouterMain; let lpr: LensProtocolRouterMain;
let extensionsStore: ExtensionsStore; let enabledExtensions: Set<string>;
beforeEach(async () => { beforeEach(async () => {
const di = getDiForUnitTesting({ doGeneralOverrides: true }); const di = getDiForUnitTesting({ doGeneralOverrides: true });
mockFs({ enabledExtensions = new Set();
"tmp": {},
});
di.override(extensionsStoreInjectable, () => ExtensionsStore.createInstance()); di.override(extensionsStoreInjectable, () => ({
isEnabled: ({ id, isBundled }: IsEnabledExtensionDescriptor) => isBundled || enabledExtensions.has(id),
} as unknown as ExtensionsStore));
di.permitSideEffects(getConfigurationFileModelInjectable); di.permitSideEffects(getConfigurationFileModelInjectable);
di.permitSideEffects(appVersionInjectable); di.permitSideEffects(appVersionInjectable);
@ -50,24 +49,19 @@ describe("protocol router tests", () => {
di.override(directoryForUserDataInjectable, () => "some-directory-for-user-data"); di.override(directoryForUserDataInjectable, () => "some-directory-for-user-data");
extensionInstances = di.inject(extensionInstancesInjectable); extensionInstances = di.inject(extensionInstancesInjectable);
extensionsStore = di.inject(extensionsStoreInjectable);
lpr = di.inject(lensProtocolRouterMainInjectable); lpr = di.inject(lensProtocolRouterMainInjectable);
lpr.rendererLoaded = true; lpr.rendererLoaded = true;
}); });
afterEach(() => {
jest.clearAllMocks();
mockFs.restore();
});
it("should throw on non-lens URLS", async () => { it("should throw on non-lens URLS", async () => {
expect(lpr.route("https://google.ca")).rejects.toBeDefined(); await lpr.route("https://google.ca");
expect(broadcastMessage).toBeCalledWith(ProtocolHandlerInvalid, "invalid protocol", "https://google.ca");
}); });
it("should throw when host not internal or extension", async () => { it("should throw when host not internal or extension", async () => {
expect(lpr.route("lens://foobar")).rejects.toBeDefined(); await lpr.route("lens://foobar");
expect(broadcastMessage).toBeCalledWith(ProtocolHandlerInvalid, "invalid host", "lens://foobar");
}); });
it("should not throw when has valid host", async () => { it("should not throw when has valid host", async () => {
@ -92,7 +86,7 @@ describe("protocol router tests", () => {
}); });
extensionInstances.set(extId, ext); extensionInstances.set(extId, ext);
extensionsStore.mergeState([[extId, { enabled: true, name: "@mirantis/minikube" }]]); enabledExtensions.add(extId);
lpr.addInternalHandler("/", noop); lpr.addInternalHandler("/", noop);
@ -172,7 +166,7 @@ describe("protocol router tests", () => {
}); });
extensionInstances.set(extId, ext); extensionInstances.set(extId, ext);
extensionsStore.mergeState([[extId, { enabled: true, name: "@foobar/icecream" }]]); enabledExtensions.add(extId);
try { try {
expect(await lpr.route("lens://extension/@foobar/icecream/page/foob")).toBeUndefined(); expect(await lpr.route("lens://extension/@foobar/icecream/page/foob")).toBeUndefined();
@ -211,7 +205,7 @@ describe("protocol router tests", () => {
}); });
extensionInstances.set(extId, ext); extensionInstances.set(extId, ext);
extensionsStore.mergeState([[extId, { enabled: true, name: "@foobar/icecream" }]]); enabledExtensions.add(extId);
} }
{ {
@ -237,13 +231,11 @@ describe("protocol router tests", () => {
}); });
extensionInstances.set(extId, ext); extensionInstances.set(extId, ext);
extensionsStore.mergeState([[extId, { enabled: true, name: "icecream" }]]); enabledExtensions.add(extId);
} }
extensionsStore.mergeState([ enabledExtensions.add("@foobar/icecream");
["@foobar/icecream", { enabled: true, name: "@foobar/icecream" }], enabledExtensions.add("icecream");
["icecream", { enabled: true, name: "icecream" }],
]);
try { try {
expect(await lpr.route("lens://extension/icecream/page")).toBeUndefined(); expect(await lpr.route("lens://extension/icecream/page")).toBeUndefined();

View File

@ -9,11 +9,9 @@ import URLParse from "url-parse";
import type { LensExtension } from "../../../extensions/lens-extension"; import type { LensExtension } from "../../../extensions/lens-extension";
import { broadcastMessage } from "../../../common/ipc"; import { broadcastMessage } from "../../../common/ipc";
import { observable, when, makeObservable } from "mobx"; import { observable, when, makeObservable } from "mobx";
import type { RouteAttempt } from "../../../common/protocol-handler"; import type { LensProtocolRouterDependencies, RouteAttempt } from "../../../common/protocol-handler";
import { ProtocolHandlerInvalid } from "../../../common/protocol-handler"; import { ProtocolHandlerInvalid } from "../../../common/protocol-handler";
import { disposer, noop } from "../../../common/utils"; import { disposer, noop } from "../../../common/utils";
import type { ExtensionLoader } from "../../../extensions/extension-loader";
import type { ExtensionsStore } from "../../../extensions/extensions-store/extensions-store";
export interface FallbackHandler { export interface FallbackHandler {
(name: string): Promise<boolean>; (name: string): Promise<boolean>;
@ -36,9 +34,7 @@ function checkHost<Query>(url: URLParse<Query>): boolean {
} }
} }
interface Dependencies { export interface LensProtocolRouterMainDependencies extends LensProtocolRouterDependencies {
extensionLoader: ExtensionLoader;
extensionsStore: ExtensionsStore;
showApplicationWindow: () => Promise<void>; showApplicationWindow: () => Promise<void>;
} }
@ -50,7 +46,7 @@ export class LensProtocolRouterMain extends proto.LensProtocolRouter {
protected disposers = disposer(); protected disposers = disposer();
constructor(protected dependencies: Dependencies) { constructor(protected readonly dependencies: LensProtocolRouterMainDependencies) {
super(dependencies); super(dependencies);
makeObservable(this); makeObservable(this);