Files
gerbeur/api/test/services/notification-service.test.ts

70 lines
2.1 KiB
TypeScript

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}, ` +
`@${named.username}@gerbeur.test as another instance writes them, ` +
`me @${author.username}, mail x@${named.username}.com, ` +
`[@${named.username}](link) @nobody_known`;
const c = await post<Comment>(`/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,
);
});
test("mentions: code and URLs mention no one", async () => {
const author = await createUser();
const named = await createUser();
const { id: dumpId } = insertDump({ userId: author.id });
const n = named.username;
await post(`/api/dumps/${dumpId}/comments`, {
auth: author.auth,
json: {
body:
`\`@${n}\` and https://mastodon.social/@${n}\n\`\`\`\n@${n}\n\`\`\``,
},
});
assertEquals(
count(
`SELECT COUNT(*) as n FROM notifications WHERE type = 'user_mentioned';`,
),
0,
);
});