import { describe, expect, it } from "vitest"; import { assertValidStoragePolicy, type BrowserStoragePolicy, } from "../../src/application/ports/browser-file-storage/shared.ts"; const localFirstPolicy: BrowserStoragePolicy = Object.freeze({ owner: "frontend-platform", namespace: "draft-attachments", classification: "PERSONAL", authority: "LOCAL_FIRST", accountScope: "OPAQUE_PARTITION", retention: Object.freeze({ kind: "UNTIL_SYNCED" }), softBudgetBytes: 8 * 1024 * 1024, hardBudgetBytes: 16 * 1024 * 1024, evictionPriority: "USER_AUTHORED", logoutAction: "EXPORT_THEN_PURGE", accountDeletionAction: "PURGE_PARTITION", pressureAction: "RETAIN", unavailableFallback: "EXPORT_REQUIRED", }); describe("browser storage policy", () => { it("accepts a coherent dataset policy snapshot", () => { expect(() => assertValidStoragePolicy(localFirstPolicy)).not.toThrow(); }); it("accepts explicitly evictable reconstructable origin data", () => { expect(() => assertValidStoragePolicy({ ...localFirstPolicy, classification: "PUBLIC", authority: "RECONSTRUCTABLE", accountScope: "ORIGIN_SHARED", retention: { kind: "TTL", maxAgeMs: 60_000 }, evictionPriority: "RECONSTRUCTABLE", logoutAction: "KEEP_ORIGIN_SHARED", accountDeletionAction: "KEEP_ORIGIN_SHARED", pressureAction: "EVICT_RECONSTRUCTABLE", unavailableFallback: "ONLINE_ONLY", }), ).not.toThrow(); }); it.each([ { name: "unsafe governance owner", patch: { owner: " account@example.com " }, }, { name: "personal origin-shared data", patch: { accountScope: "ORIGIN_SHARED", logoutAction: "KEEP_ORIGIN_SHARED", accountDeletionAction: "KEEP_ORIGIN_SHARED", }, }, { name: "partition without purge", patch: { logoutAction: "KEEP_ORIGIN_SHARED" }, }, { name: "unsynced partition without export", patch: { logoutAction: "PURGE_PARTITION" }, }, { name: "unsafe pressure eviction", patch: { pressureAction: "EVICT_RECONSTRUCTABLE" }, }, { name: "zero hard budget", patch: { softBudgetBytes: 0, hardBudgetBytes: 0 }, }, ] as const)("rejects $name", ({ patch }) => { expect(() => assertValidStoragePolicy({ ...localFirstPolicy, ...patch, } as BrowserStoragePolicy), ).toThrow(TypeError); }); });