// Tests for the inviter-name hint's pure helpers (invitehint.js, #1436). import test from "node:test"; import assert from "node:assert/strict"; import { inviterHintStash, readInviterHint, inviterHintTarget } from "../web/static/invitehint.js"; const NOW = 1_700_000_000_000; test("stash/read round trip, trimming and capping the name", () => { const stored = inviterHintStash({ thread: "t1", name: " Paul ", now: NOW }); assert.deepEqual(readInviterHint(stored, NOW + 1000), { thread: "t1", name: "Paul" }); const long = inviterHintStash({ thread: "t1", name: "x".repeat(200), now: NOW }); assert.equal(readInviterHint(long, NOW).name.length, 64); }); test("read rejects garbage, empties, clock skew, and stale hints", () => { assert.equal(readInviterHint("", NOW), null); assert.equal(readInviterHint("not json", NOW), null); assert.equal(readInviterHint(JSON.stringify({ v: 1, thread: "", name: "P", at: NOW }), NOW), null); assert.equal(readInviterHint(JSON.stringify({ v: 1, thread: "t", name: " ", at: NOW }), NOW), null); assert.equal(readInviterHint(inviterHintStash({ thread: "t", name: "P", now: NOW }), NOW - 1), null); const weekPlus = NOW + 7 * 24 * 60 * 60 * 1000 + 1; assert.equal(readInviterHint(inviterHintStash({ thread: "t", name: "P", now: NOW }), weekPlus), null); }); const hint = { thread: "dm1", name: "Paul" }; const threads = [{ id: "dm1", members: ["me", "inviter"] }, { id: "other", members: ["me", "x"] }]; test("target: fills the hinted DM's label-less other member", () => { const roster = [{ user_id: "me", label: "Joiner" }, { user_id: "inviter", label: "" }]; assert.deepEqual(inviterHintTarget(hint, threads, roster, "me"), { userId: "inviter", name: "Paul" }); }); test("target: resolved once the real label decrypted — caller drops the stash", () => { const roster = [{ user_id: "inviter", label: "Paul Campbell" }]; assert.deepEqual(inviterHintTarget(hint, threads, roster, "me"), { resolved: true }); }); test("target: null while thread or member not loaded yet (stash kept)", () => { assert.equal(inviterHintTarget(hint, [], [], "me"), null); assert.equal(inviterHintTarget(hint, threads, [], "me"), null); assert.equal(inviterHintTarget(null, threads, [], "me"), null); }); test("target: never labels an agent, never anyone outside the hinted DM", () => { const roster = [{ user_id: "inviter", label: "", is_agent: true }, { user_id: "x", label: "" }]; assert.equal(inviterHintTarget(hint, threads, roster, "me"), null); });