import "../../setup.ts"; import { assertEquals, assertThrows } from "@std/assert"; import { DatabaseSync } from "node:sqlite"; import { up as up0024 } from "../../../db/migrations/0024_federation.ts"; Deno.test("migration 0024 adds federation and frees remote accounts' emails", () => { const db = new DatabaseSync(":memory:"); db.exec(` CREATE TABLE users (id TEXT PRIMARY KEY, username TEXT, password_hash TEXT, email TEXT); CREATE UNIQUE INDEX idx_users_email_lower ON users(lower(email)); CREATE TABLE categories (id TEXT PRIMARY KEY, slug TEXT); INSERT INTO users VALUES ('a', 'ann', 'h.s', 'a@x.test'); INSERT INTO categories VALUES ('c', 'authorize'), ('d', 'music'); `); up0024(db); up0024(db); // idempotent // Two accounts without a password may share an address with a local one. db.exec(` INSERT INTO users VALUES ('b', 'ann@one.test', '', 'a@x.test'); INSERT INTO users VALUES ('c', 'ann@two.test', '', 'A@x.test'); `); assertThrows(() => db.exec(`INSERT INTO users VALUES ('d', 'dup', 'h.s', 'a@X.test');`) ); const slugs = db.prepare(`SELECT slug FROM categories ORDER BY id;`) .all() as { slug: string }[]; assertEquals(slugs.map((r) => r.slug), ["authorize-2", "music"]); for ( const table of [ "federation_keys", "user_identities", "federation_peers", "federation_logins", "oauth_codes", "federation_grants", "federation_outbox", ] ) { db.prepare(`SELECT COUNT(*) FROM ${table};`).get(); } db.close(); });