import "../setup.ts"; import { assertEquals, assertThrows } from "@std/assert"; import { DatabaseSync } from "node:sqlite"; import { uniqueSlug, validateSlug } from "../../lib/slugify.ts"; import { APIException } from "../../lib/api-exception.ts"; Deno.test("uniqueSlug: numbers a clash within the owner's space, aliases included", () => { const db = new DatabaseSync(":memory:"); db.exec(` CREATE TABLE dumps (id TEXT, user_id TEXT, slug TEXT); CREATE TABLE dump_slug_aliases (user_id TEXT, slug TEXT, dump_id TEXT); INSERT INTO dumps VALUES ('1', 'bob', 'mix'), ('2', 'bob', 'mix-2'); INSERT INTO dump_slug_aliases VALUES ('bob', 'mix-3', '1'); `); assertEquals(uniqueSlug(db, "dump", "bob", "mix"), "mix-4"); assertEquals(uniqueSlug(db, "dump", "ann", "mix"), "mix"); // The suffix still fits in 60 characters, cut at no hyphen. db.prepare(`INSERT INTO dumps VALUES ('3', 'bob', ?);`).run("a".repeat(60)); assertEquals( uniqueSlug(db, "dump", "bob", "a".repeat(60)), "a".repeat(58) + "-2", ); db.close(); }); Deno.test("validateSlug: lowercase words joined by hyphens, 60 at most", () => { validateSlug("never-gonna-2"); for (const bad of ["Never", "-a", "a-", "a--b", "a b", "", "a".repeat(61)]) { assertThrows(() => validateSlug(bad), APIException, undefined, bad); } });