84 lines
2.4 KiB
TypeScript
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);
|
|
});
|
|
});
|