// Tests for the enrolment live-session fast-path decision (#1378), run in // Node. Same harness style as home/test/serverlist.test.mjs. // node home/test/sessionreuse.test.mjs import assert from "node:assert/strict"; import { reuseCandidate } from "../web/static/sessionreuse.js"; const store = (entries) => ({ getItem: (k) => (k in entries ? entries[k] : null) }); let pass = 0; function test(name, fn) { fn(); pass++; console.log("PASS ", name); } test("both halves present → candidate with token + dek", () => { assert.deepEqual( reuseCandidate(store({ home_token: "tok", home_dek: "dek64" })), { token: "tok", dek: "dek64" }, ); }); test("either half missing → null (ceremony path)", () => { assert.equal(reuseCandidate(store({ home_token: "tok" })), null, "no DEK — a persisted token alone never skips the ceremony"); assert.equal(reuseCandidate(store({ home_dek: "dek64" })), null, "no token"); assert.equal(reuseCandidate(store({})), null, "cold tab"); assert.equal(reuseCandidate(store({ home_token: "", home_dek: "" })), null, "empty strings are absent"); }); test("throwing or absent storage → null, never a crash", () => { assert.equal(reuseCandidate({ getItem: () => { throw new Error("denied"); } }), null); assert.equal(reuseCandidate(null), null); }); console.log("\nALL PASSED (" + pass + ")");