From 21a894a5eb9caa2c0099df50727b7c8bdc4d04a3 Mon Sep 17 00:00:00 2001 From: Marc Lorenz Date: Tue, 24 Mar 2026 10:03:03 +0100 Subject: [PATCH] add test for webviewer --- src/utils/webviewer.test.ts | 94 +++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/utils/webviewer.test.ts diff --git a/src/utils/webviewer.test.ts b/src/utils/webviewer.test.ts new file mode 100644 index 0000000..524e298 --- /dev/null +++ b/src/utils/webviewer.test.ts @@ -0,0 +1,94 @@ +import { describe, it, expect, vi, afterEach } from "vitest"; +import { + isFileMakerEnvironment, + performScript, + performScriptWithOption, + resolveFileMakerCallback, +} from "../webviewer"; + +function setFileMaker(api: FileMakerAPI | undefined) { + Object.defineProperty(globalThis, "FileMaker", { + value: api, + configurable: true, + writable: true, + }); +} + +afterEach(() => { + setFileMaker(undefined); +}); + +describe("isFileMakerEnvironment", () => { + it("returns false when FileMaker is not defined", () => { + expect(isFileMakerEnvironment()).toBe(false); + }); + + it("returns true when FileMaker is defined", () => { + setFileMaker({ PerformScript: vi.fn(), PerformScriptWithOption: vi.fn() }); + expect(isFileMakerEnvironment()).toBe(true); + }); +}); + +describe("performScript", () => { + it("returns false when FileMaker is not available", () => { + expect(performScript("TestScript")).toBe(false); + }); + + it("calls FileMaker.PerformScript and returns true when available", () => { + const mock = vi.fn(); + setFileMaker({ PerformScript: mock, PerformScriptWithOption: vi.fn() }); + expect(performScript("MyScript", "param")).toBe(true); + expect(mock).toHaveBeenCalledWith("MyScript", "param"); + }); +}); + +describe("performScriptWithOption", () => { + it("returns false when FileMaker is not available", () => { + expect(performScriptWithOption("TestScript")).toBe(false); + }); + + it("calls FileMaker.PerformScriptWithOption with option", () => { + const mock = vi.fn(); + setFileMaker({ PerformScript: vi.fn(), PerformScriptWithOption: mock }); + expect(performScriptWithOption("MyScript", "param", "3")).toBe(true); + expect(mock).toHaveBeenCalledWith("MyScript", "param", "3"); + }); +}); + +describe("resolveFileMakerCallback", () => { + it("does nothing for an unknown callback ID", () => { + expect(() => resolveFileMakerCallback("9999")).not.toThrow(); + }); + + it("resolves a pending promise registered via callFileMakerScript", async () => { + const { callFileMakerScript } = await import("../webviewer"); + + let capturedId: number | undefined; + setFileMaker({ + PerformScript: (_script, payload) => { + capturedId = JSON.parse(payload ?? "").callbackId; + }, + PerformScriptWithOption: vi.fn(), + }); + + const promise = callFileMakerScript("TestScript", "hello"); + resolveFileMakerCallback(String(capturedId), "result-data"); + await expect(promise).resolves.toBe("result-data"); + }); + + it("rejects a pending promise when isError is true", async () => { + const { callFileMakerScript } = await import("../webviewer"); + + let capturedId: number | undefined; + setFileMaker({ + PerformScript: (_script, payload) => { + capturedId = JSON.parse(payload ?? "").callbackId; + }, + PerformScriptWithOption: vi.fn(), + }); + + const promise = callFileMakerScript("TestScript", "hello"); + resolveFileMakerCallback(String(capturedId), "error message", true); + await expect(promise).rejects.toMatchObject({ message: "error message" }); + }); +});