/** * @file Tests for newBuildReload: after a reconnect the tab reloads once when * the server's version is not this bundle's, never on the first connect, * never for the same version, and not twice for one version. * @author Nguyễn Ngọc Trí Vĩ */ import { afterEach, describe, expect, it, vi } from "vitest"; import { eventBus } from "../eventBus"; import { reloadOnNewBuild } from "../newBuildReload"; const flush = () => new Promise((r) => setTimeout(r, 0)); function setup(serverVersion: string) { const reload = vi.fn(); const store = new Map(); const storage = { getItem: (k: string) => store.get(k) ?? null, setItem: (k: string, v: string) => void store.set(k, v), }; const off = reloadOnNewBuild({ bundle: "2.5.4", health: () => Promise.resolve({ version: serverVersion }), reload, storage, }); return { reload, off }; } let off: (() => void) | undefined; afterEach(() => off?.()); describe("reloadOnNewBuild", () => { it("reloads once after a reconnect onto a new version", async () => { const s = setup("2.5.5"); off = s.off; eventBus.setConnected(true); // first connect: nothing to compare against yet await flush(); expect(s.reload).not.toHaveBeenCalled(); eventBus.setConnected(false); eventBus.setConnected(true); await flush(); expect(s.reload).toHaveBeenCalledTimes(1); eventBus.setConnected(false); // same version again: a failed UI build must not loop eventBus.setConnected(true); await flush(); expect(s.reload).toHaveBeenCalledTimes(1); }); it("stays put when the server is this bundle's version", async () => { const s = setup("2.5.4"); off = s.off; eventBus.setConnected(false); eventBus.setConnected(true); await flush(); expect(s.reload).not.toHaveBeenCalled(); }); });