diff --git a/packages/element-web-module-api/src/api.test.ts b/packages/element-web-module-api/src/api.test.ts index f68200f122..62dd3973aa 100644 --- a/packages/element-web-module-api/src/api.test.ts +++ b/packages/element-web-module-api/src/api.test.ts @@ -7,15 +7,14 @@ Please see LICENSE files in the repository root for full details. import { expect, test } from "vitest"; -import { Api, isModule } from "./api.js"; +import { Api } from "."; +import { isModule } from "./api.js"; const TestModule = { default: class TestModule { public static moduleApiVersion = "1.0.0"; public constructor(private readonly api: Api) {} - public async load(): Promise { - console.log("TestModule loaded"); - } + public async load(): Promise {} }, }; diff --git a/packages/element-web-module-api/src/loader.spec.ts b/packages/element-web-module-api/src/loader.spec.ts new file mode 100644 index 0000000000..85270cce38 --- /dev/null +++ b/packages/element-web-module-api/src/loader.spec.ts @@ -0,0 +1,58 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { expect, test, describe, vi, beforeEach, afterEach } from "vitest"; + +import { Api, ModuleIncompatibleError, ModuleLoader } from "."; + +describe("ModuleIncompatibleError", () => { + test("should extend Error", () => { + expect(new ModuleIncompatibleError("1.0.0")).toBeInstanceOf(Error); + }); +}); + +describe("ModuleLoader", () => { + const mockApi = {} as Api; + + beforeEach(() => { + vi.stubGlobal("__VERSION__", "1.0.1"); + }); + + test("should load a module", async () => { + const TestModule = { + default: class TestModule { + public static moduleApiVersion = "^1.0.0"; + public constructor(private readonly api: Api) {} + public async load(): Promise {} + }, + }; + + const spy = vi.spyOn(TestModule.default.prototype, "load"); + + const loader = new ModuleLoader(mockApi); + await loader.load(TestModule); + await loader.start(); + expect(spy).toHaveBeenCalledWith(); + }); + + test("should fail to load an incompatible module", async () => { + const TestModule = { + default: class TestModule { + public static moduleApiVersion = "^2"; + public constructor(private readonly api: Api) {} + public async load(): Promise {} + }, + }; + + const spy = vi.spyOn(TestModule.default.prototype, "load"); + + const loader = new ModuleLoader(mockApi); + await expect(loader.load(TestModule)).rejects.toThrowError(ModuleIncompatibleError); + await loader.start(); + expect(spy).not.toHaveBeenCalledWith(); + }); +});