File
Blob: test/slugs.test.ts
| 1 | import { describe, expect, it } from "vitest"; |
| 2 | |
| 3 | import { isValidSlug, RESERVED_SLUGS, validateSlugForRoute } from "@/shared/slugs"; |
| 4 | |
| 5 | describe("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 | |
| 30 | describe("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 | }); |