import { describe, expect, it } from "vitest"; import { parseMentions } from "./mentions.js"; const U1 = "user-abcdefgh1234"; const U2 = "user-ijklmnop5678"; const T1 = "team-eng-abcdefgh"; const P1 = "page-pqrs-uvwxyz"; const D1 = "db-abcdef0123456789"; describe("parseMentions (TASK-0094 R3/R4)", () => { it("parses one token per kind", () => { const r = parseMentions(`hello @user:${U1} and @team:${T1} see @page:${P1} + @database:${D1}`); expect(r).toEqual({ users: [U1], teams: [T1], pages: [P1], databases: [D1] }); }); it("dedupes per kind (same token twice → once)", () => { const r = parseMentions(`@user:${U1} again @user:${U1} @user:${U2}`); expect(r.users).toEqual([U1, U2]); }); it("does NOT match a plain @Name (no recognized prefix)", () => { const r = parseMentions("@Ana ship it @teamwork @database!"); expect(r).toEqual({ users: [], teams: [], pages: [], databases: [] }); }); it("requires ids of at least 8 chars (uuid/cuid-shaped)", () => { const r = parseMentions("@user:short @team:abc"); expect(r.users).toHaveLength(0); expect(r.teams).toHaveLength(0); }); it("handles empty / no-mention bodies", () => { expect(parseMentions("")).toEqual({ users: [], teams: [], pages: [], databases: [] }); expect(parseMentions("just text")).toEqual({ users: [], teams: [], pages: [], databases: [] }); }); it("keeps first-seen order", () => { const r = parseMentions(`@user:${U2} @user:${U1}`); expect(r.users).toEqual([U2, U1]); }); });