Skip to content
File

Blob: test/slugs.test.ts

typescript38 lines
1import { describe, expect, it } from "vitest";
2 
3import { isValidSlug, RESERVED_SLUGS, validateSlugForRoute } from "@/shared/slugs";
4 
5describe("isValidSlug", () => {
6 it("accepts simple lowercase ASCII slugs", () => {
7 expect(isValidSlug("rachel")).toBe(true);
8 expect(isValidSlug("git-on-cloudflare")).toBe(true);
9 expect(isValidSlug("a")).toBe(true);
10 expect(isValidSlug("a1")).toBe(true);
11 });
12 
13 it("rejects empty, too long, and bad-shape slugs", () => {
14 expect(isValidSlug("")).toBe(false);
15 expect(isValidSlug("-leading")).toBe(false);
16 expect(isValidSlug("trailing-")).toBe(false);
17 expect(isValidSlug("Two--Caps")).toBe(false);
18 expect(isValidSlug("space inside")).toBe(false);
19 expect(isValidSlug("a".repeat(41))).toBe(false);
20 expect(isValidSlug("émigré")).toBe(false);
21 });
22 
23 it("rejects every reserved slug", () => {
24 for (const reserved of RESERVED_SLUGS) {
25 expect(isValidSlug(reserved)).toBe(false);
26 }
27 });
28});
29 
30describe("validateSlugForRoute", () => {
31 it("reports length, reserved, and format reasons distinctly", () => {
32 expect(validateSlugForRoute("")).toEqual({ ok: false, reason: "length" });
33 expect(validateSlugForRoute("auth")).toEqual({ ok: false, reason: "reserved" });
34 expect(validateSlugForRoute("BadCase")).toEqual({ ok: false, reason: "format" });
35 expect(validateSlugForRoute("ok-slug")).toEqual({ ok: true, slug: "ok-slug" });
36 });
37});