1import { describe, expect, it } from "vitest"; 2import { parseMentions } from "./mentions.js"; 3 4const U1 = "user-abcdefgh1234"; 5const U2 = "user-ijklmnop5678"; 6const T1 = "team-eng-abcdefgh"; 7const P1 = "page-pqrs-uvwxyz"; 8const D1 = "db-abcdef0123456789"; 9 10describe("parseMentions (TASK-0094 R3/R4)", () => { 11 it("parses one token per kind", () => { 12 const r = parseMentions(`hello @user:${U1} and @team:${T1} see @page:${P1} + @database:${D1}`); 13 expect(r).toEqual({ users: [U1], teams: [T1], pages: [P1], databases: [D1] }); 14 }); 15 16 it("dedupes per kind (same token twice → once)", () => { 17 const r = parseMentions(`@user:${U1} again @user:${U1} @user:${U2}`); 18 expect(r.users).toEqual([U1, U2]); 19 }); 20 21 it("does NOT match a plain @Name (no recognized prefix)", () => { 22 const r = parseMentions("@Ana ship it @teamwork @database!"); 23 expect(r).toEqual({ users: [], teams: [], pages: [], databases: [] }); 24 }); 25 26 it("requires ids of at least 8 chars (uuid/cuid-shaped)", () => { 27 const r = parseMentions("@user:short @team:abc"); 28 expect(r.users).toHaveLength(0); 29 expect(r.teams).toHaveLength(0); 30 }); 31 32 it("handles empty / no-mention bodies", () => { 33 expect(parseMentions("")).toEqual({ users: [], teams: [], pages: [], databases: [] }); 34 expect(parseMentions("just text")).toEqual({ users: [], teams: [], pages: [], databases: [] }); 35 }); 36 37 it("keeps first-seen order", () => { 38 const r = parseMentions(`@user:${U2} @user:${U1}`); 39 expect(r.users).toEqual([U2, U1]); 40 }); 41}); 42