import test from "node:test"; import assert from "node:assert/strict"; import { register, activateUpdate } from "../js/client.mjs"; test("unsupported browsers retain the ordinary web app", async () => { assert.equal(await register(), null); }); test("waiting updates are announced without activating or reloading", async () => { const previous = Object.getOwnPropertyDescriptor(globalThis, "navigator"); const events = {}; const messages = []; const waiting = { postMessage: (message) => messages.push(message) }; const registration = { waiting, addEventListener: (name, fn) => { events[name] = fn; } }; Object.defineProperty(globalThis, "navigator", { configurable: true, value: { serviceWorker: { register: async (url, options) => { assert.equal(url, "/app/sw.js"); assert.equal(options.updateViaCache, "none"); return registration; } }, } }); try { let updates = 0; assert.equal(await register({ url: "/app/sw.js", onUpdate: () => { updates++; } }), registration); assert.equal(updates, 1); events.updatefound(); assert.equal(updates, 1, "do not announce the same waiting worker twice"); assert.equal(messages.length, 0); assert.equal(activateUpdate(registration), true); assert.deepEqual(messages, [{ type: "rastrillo:pwa:activate" }]); registration.waiting = null; assert.equal(activateUpdate(registration), false); } finally { Object.defineProperty(globalThis, "navigator", previous); } });