import { count, createUser, db, insertDump, patch, post, test, } from "../helpers.ts"; import type { Comment } from "../../../shared/comment.ts"; import { assertEquals } from "@std/assert"; test("mentions: notify the named, once per context, never the author or an email domain", async () => { const author = await createUser(); const named = await createUser(); const { id: dumpId } = insertDump({ userId: author.id, title: "Topic" }); const body = `hi @${named.username.toUpperCase()} and @${named.username}, ` + `me @${author.username}, mail x@${named.username}.com, ` + `[@${named.username}](link) @nobody_known`; const c = await post(`/api/dumps/${dumpId}/comments`, { auth: author.auth, json: { body }, }); const notes = db.prepare( `SELECT user_id, data FROM notifications WHERE type = 'user_mentioned';`, ).all() as { user_id: string; data: string }[]; assertEquals(notes.length, 1); assertEquals(notes[0].user_id, named.id); assertEquals(JSON.parse(notes[0].data), { mentionerId: author.id, mentionerUsername: author.username, contextType: "comment", contextId: c.data.id, contextTitle: "Topic", dumpId, }); // Editing the comment doesn't notify a second time. await patch(`/api/comments/${c.data.id}`, { auth: author.auth, json: { body: `again @${named.username}` }, }); assertEquals( count( `SELECT COUNT(*) as n FROM notifications WHERE type = 'user_mentioned';`, ), 1, ); });