import { describe, expect, it } from "vite-plus/test"; import { defaultThemeGeneration, defaultThemeToApply } from "./useDefaultTheme"; const BASE = { environmentId: "env-1", defaultTheme: "nightfall", defaultThemeSetAt: "2026-08-28T00:00:00.000Z", appliedGeneration: null, resolves: true, } as const; describe("default theme adoption", () => { it("applies a set this client has not seen", () => { expect(defaultThemeToApply(BASE)).toBe( defaultThemeGeneration(BASE.defaultTheme, BASE.defaultThemeSetAt), ); }); it("does not replay a generation it already applied", () => { const generation = defaultThemeGeneration(BASE.defaultTheme, BASE.defaultThemeSetAt); expect(defaultThemeToApply({ ...BASE, appliedGeneration: generation })).toBe(null); }); // `t3 theme set` of a theme this client already wears must still act, which // is why the generation carries the set time and not just the value. it("applies the same theme again when the environment re-sets it", () => { const applied = defaultThemeGeneration(BASE.defaultTheme, "2026-08-28T00:00:00.000Z"); const next = defaultThemeToApply({ ...BASE, defaultThemeSetAt: "2026-08-29T00:00:00.000Z", appliedGeneration: applied, }); expect(next).not.toBe(null); expect(next).not.toBe(applied); }); // Environments provisioned before the timestamp existed. it("falls back to once-per-value without a set time", () => { const generation = defaultThemeGeneration("nightfall", ""); expect(defaultThemeToApply({ ...BASE, defaultThemeSetAt: "", appliedGeneration: null })).toBe( generation, ); expect( defaultThemeToApply({ ...BASE, defaultThemeSetAt: "", appliedGeneration: generation }), ).toBe(null); }); // The setting and the palette it names arrive independently. it("waits for a theme that has not arrived yet", () => { expect(defaultThemeToApply({ ...BASE, resolves: false })).toBe(null); }); it("leaves a client alone with no environment or no theme set", () => { expect(defaultThemeToApply({ ...BASE, environmentId: null })).toBe(null); expect(defaultThemeToApply({ ...BASE, defaultTheme: "" })).toBe(null); }); });