import "../../setup.ts"; import { assertEquals } from "@std/assert"; import { DatabaseSync } from "node:sqlite"; import { up as up0023 } from "../../../db/migrations/0023_mention_everyone.ts"; Deno.test("migration 0023 flags past @everyone and frees the name", () => { const db = new DatabaseSync(":memory:"); db.exec(` CREATE TABLE users (id TEXT PRIMARY KEY, username TEXT, role TEXT); CREATE TABLE user_aliases (username TEXT PRIMARY KEY, user_id TEXT); CREATE TABLE chat_messages (id TEXT PRIMARY KEY, user_id TEXT, body TEXT); INSERT INTO users VALUES ('m', 'mod', 'moderator'), ('u', 'Everyone', 'user'), ('t', 'everyone_2', 'user'), ('a', 'ann', 'user'); INSERT INTO user_aliases VALUES ('everyone_3', 't'), ('EVERYONE', 'a'); INSERT INTO chat_messages VALUES ('1', 'm', 'hi @everyone'), ('3', 'u', 'hi @everyone'), ('4', 'm', 'hi all'); `); // In code, it says nothing. db.prepare(`INSERT INTO chat_messages VALUES ('2', 'm', ?);`).run( "hi `@everyone`", ); up0023(db); up0023(db); // idempotent const flagged = db.prepare( `SELECT id FROM chat_messages WHERE mentions_everyone = 1;`, ).all() as { id: string }[]; assertEquals(flagged.map((r) => r.id), ["1"]); const names = db.prepare(`SELECT id, username FROM users ORDER BY id;`) .all() as { id: string; username: string }[]; assertEquals(names.find((r) => r.id === "u")?.username, "everyone_4"); const aliases = db.prepare(`SELECT username FROM user_aliases;`).all() as { username: string; }[]; assertEquals(aliases.map((r) => r.username), ["everyone_3"]); db.close(); });