Files
plainleaf/client/service_worker/util.test.ts
T
2026-08-12 16:52:16 +08:00

47 lines
1.4 KiB
TypeScript

import { afterEach, expect, test, vi } from "vitest";
import {
reloadWithUpdatedServiceWorker,
versionedServiceWorkerURL,
} from "./util.ts";
afterEach(() => vi.unstubAllGlobals());
test("builds a versioned worker URL at the root", () => {
expect(
versionedServiceWorkerURL("2.10.0-build", "https://notes.example/").href,
).toBe("https://notes.example/service_worker.js?v=2.10.0-build");
});
test("keeps a space prefix in the versioned worker URL", () => {
expect(
versionedServiceWorkerURL(
"release 1",
"https://notes.example/personal/page",
).href,
).toBe("https://notes.example/personal/service_worker.js?v=release+1");
});
test("falls back to unregistering the worker without clearing local data", async () => {
const registration = {
update: vi.fn().mockResolvedValue(undefined),
unregister: vi.fn().mockResolvedValue(true),
waiting: null,
installing: null,
};
const reload = vi.fn();
vi.stubGlobal("location", { reload });
vi.stubGlobal("document", { baseURI: "https://notes.example/" });
vi.stubGlobal("navigator", {
serviceWorker: {
getRegistration: vi.fn().mockResolvedValue(registration),
},
});
await reloadWithUpdatedServiceWorker();
expect(registration.update).toHaveBeenCalledOnce();
expect(registration.unregister).toHaveBeenCalledOnce();
expect(reload).toHaveBeenCalledOnce();
expect(globalThis.indexedDB).toBeUndefined();
});