Files
tech-log-frontend/tests/unit/browser-storage-policy.test.ts

84 lines
2.4 KiB
TypeScript

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);
});
});