32 lines
1.3 KiB
TypeScript
32 lines
1.3 KiB
TypeScript
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);
|
|
}
|
|
});
|