197 lines
6.3 KiB
JavaScript
197 lines
6.3 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import {
|
|
resolveJurisdiction,
|
|
isValidResolution,
|
|
getResolutionPriority,
|
|
getSourceConfidence,
|
|
hasJurisdiction,
|
|
hasPolicy,
|
|
JURISDICTION_CATALOG,
|
|
POLICIES
|
|
} from "../jurisdiction/index.js";
|
|
|
|
const tests = [];
|
|
function test(name, fn) {
|
|
tests.push({ name, fn });
|
|
}
|
|
|
|
test("fixed us-ma resolves from site configuration", () => {
|
|
const result = resolveJurisdiction({ mode: "fixed", jurisdiction: "us-ma" });
|
|
assert.equal(result.status, "resolved");
|
|
assert.equal(result.jurisdiction.id, "us-ma");
|
|
assert.equal(result.policy.id, "us-state-privacy");
|
|
assert.equal(result.source, "site-config");
|
|
assert.equal(result.confidence, "explicit");
|
|
});
|
|
|
|
test("fixed eu resolves correctly", () => {
|
|
const result = resolveJurisdiction({ mode: "fixed", jurisdiction: "eu" });
|
|
assert.equal(result.jurisdiction.id, "eu");
|
|
assert.equal(result.policy.id, "eu-privacy");
|
|
});
|
|
|
|
test("fixed global resolves global baseline", () => {
|
|
const result = resolveJurisdiction({ mode: "fixed", jurisdiction: "global" });
|
|
assert.equal(result.jurisdiction.id, "global");
|
|
assert.equal(result.policy.id, "global-baseline");
|
|
});
|
|
|
|
test("global mode deliberately selects global policy", () => {
|
|
const result = resolveJurisdiction({ mode: "global" });
|
|
assert.equal(result.jurisdiction.id, "global");
|
|
assert.equal(result.source, "site-config");
|
|
});
|
|
|
|
test("auto resolves server signal", () => {
|
|
const result = resolveJurisdiction({
|
|
mode: "auto",
|
|
request: { jurisdiction: "us-ca", source: "server" }
|
|
});
|
|
assert.equal(result.jurisdiction.id, "us-ca");
|
|
assert.equal(result.source, "server");
|
|
assert.equal(result.confidence, "high");
|
|
});
|
|
|
|
test("auto resolves application signal", () => {
|
|
const result = resolveJurisdiction({
|
|
mode: "auto",
|
|
visitor: { jurisdiction: "us-ma", source: "application" }
|
|
});
|
|
assert.equal(result.jurisdiction.id, "us-ma");
|
|
assert.equal(result.source, "application");
|
|
});
|
|
|
|
test("auto resolves browser signal", () => {
|
|
const result = resolveJurisdiction({
|
|
mode: "auto",
|
|
visitor: { jurisdiction: "eu", source: "browser" }
|
|
});
|
|
assert.equal(result.jurisdiction.id, "eu");
|
|
assert.equal(result.source, "browser");
|
|
assert.equal(result.confidence, "low");
|
|
});
|
|
|
|
test("auto falls back conservatively when no signal exists", () => {
|
|
const result = resolveJurisdiction({ mode: "auto" });
|
|
assert.equal(result.status, "fallback");
|
|
assert.equal(result.jurisdiction.id, "global");
|
|
assert.equal(result.policy.id, "global-baseline");
|
|
assert.equal(result.source, "fallback");
|
|
assert.equal(result.confidence, "default");
|
|
});
|
|
|
|
test("auto ignores unknown jurisdiction signals", () => {
|
|
const result = resolveJurisdiction({
|
|
mode: "auto",
|
|
request: { jurisdiction: "xx-unknown", source: "server" }
|
|
});
|
|
assert.equal(result.status, "fallback");
|
|
assert.equal(result.jurisdiction.id, "global");
|
|
});
|
|
|
|
test("higher-trust server signal wins over browser signal", () => {
|
|
const result = resolveJurisdiction({
|
|
mode: "auto",
|
|
request: { jurisdiction: "us-ma", source: "server" },
|
|
visitor: { jurisdiction: "eu", source: "browser" }
|
|
});
|
|
assert.equal(result.jurisdiction.id, "us-ma");
|
|
assert.equal(result.source, "server");
|
|
});
|
|
|
|
test("explicit site configuration wins over lower-trust signals", () => {
|
|
const result = resolveJurisdiction({
|
|
mode: "auto",
|
|
site: { jurisdiction: "us-ca", source: "site-config" },
|
|
request: { jurisdiction: "eu", source: "server" }
|
|
});
|
|
assert.equal(result.jurisdiction.id, "us-ca");
|
|
assert.equal(result.source, "site-config");
|
|
});
|
|
|
|
test("fixed mode requires jurisdiction", () => {
|
|
assert.throws(
|
|
() => resolveJurisdiction({ mode: "fixed" }),
|
|
/jurisdiction is required/i
|
|
);
|
|
});
|
|
|
|
test("fixed mode rejects unknown jurisdiction", () => {
|
|
assert.throws(
|
|
() => resolveJurisdiction({ mode: "fixed", jurisdiction: "xx" }),
|
|
/unknown jurisdiction/i
|
|
);
|
|
});
|
|
|
|
test("invalid mode is rejected", () => {
|
|
assert.throws(
|
|
() => resolveJurisdiction({ mode: "random" }),
|
|
/invalid jurisdiction mode/i
|
|
);
|
|
});
|
|
|
|
test("invalid input type is rejected", () => {
|
|
assert.throws(
|
|
() => resolveJurisdiction(null),
|
|
/input must be an object/i
|
|
);
|
|
});
|
|
|
|
test("catalog entries reference existing policies", () => {
|
|
for (const entry of Object.values(JURISDICTION_CATALOG)) {
|
|
assert.equal(hasPolicy(entry.policy), true);
|
|
}
|
|
});
|
|
|
|
test("resolution result satisfies its contract", () => {
|
|
const results = [
|
|
resolveJurisdiction({ mode: "fixed", jurisdiction: "us-ma" }),
|
|
resolveJurisdiction({ mode: "global" }),
|
|
resolveJurisdiction({ mode: "auto" })
|
|
];
|
|
|
|
for (const result of results) {
|
|
assert.equal(isValidResolution(result), true);
|
|
}
|
|
});
|
|
|
|
test("source priority is deterministic", () => {
|
|
assert.ok(getResolutionPriority("site-config") > getResolutionPriority("server"));
|
|
assert.ok(getResolutionPriority("server") > getResolutionPriority("application"));
|
|
assert.ok(getResolutionPriority("application") > getResolutionPriority("browser"));
|
|
assert.ok(getResolutionPriority("browser") > getResolutionPriority("fallback"));
|
|
});
|
|
|
|
test("source confidence mapping is deterministic", () => {
|
|
assert.equal(getSourceConfidence("site-config"), "explicit");
|
|
assert.equal(getSourceConfidence("server"), "high");
|
|
assert.equal(getSourceConfidence("application"), "medium");
|
|
assert.equal(getSourceConfidence("browser"), "low");
|
|
assert.equal(getSourceConfidence("fallback"), "default");
|
|
});
|
|
|
|
test("catalog contains the initial architectural jurisdictions", () => {
|
|
for (const id of ["global", "us", "us-ma", "us-ca", "eu"]) {
|
|
assert.equal(hasJurisdiction(id), true);
|
|
}
|
|
assert.equal(POLICIES["global-baseline"] !== undefined, true);
|
|
});
|
|
|
|
let passed = 0;
|
|
for (const { name, fn } of tests) {
|
|
try {
|
|
fn();
|
|
passed += 1;
|
|
console.log(`PASS: ${name}`);
|
|
} catch (error) {
|
|
console.error(`FAIL: ${name}`);
|
|
console.error(error);
|
|
process.exitCode = 1;
|
|
}
|
|
}
|
|
|
|
console.log(`\n${passed}/${tests.length} tests passed`);
|
|
if (passed !== tests.length) {
|
|
process.exitCode = 1;
|
|
}
|