import { describe, expect, test } from "bun:test"; import { isOneOf, parseId } from "../validate"; describe("parseId", () => { test("returns the integer for valid numeric strings", () => { expect(parseId("42")).toBe(42); expect(parseId("1")).toBe(1); }); test("returns null for invalid, negative, zero, or missing ids", () => { expect(parseId("0")).toBe(null); expect(parseId("-1")).toBe(null); expect(parseId("abc")).toBe(null); expect(parseId("")).toBe(null); expect(parseId(undefined)).toBe(null); }); test("rejects mixed alphanumeric strings (strict — route params must be wholly numeric)", () => { expect(parseId("42abc")).toBe(null); expect(parseId("abc42")).toBe(null); expect(parseId("42 ")).toBe(null); expect(parseId("+42")).toBe(null); expect(parseId("42.0")).toBe(null); }); }); describe("isOneOf", () => { test("narrows to allowed string literals", () => { expect(isOneOf("keep", ["keep", "remove"] as const)).toBe(true); expect(isOneOf("remove", ["keep", "remove"] as const)).toBe(true); }); test("rejects disallowed values and non-strings", () => { expect(isOneOf("delete", ["keep", "remove"] as const)).toBe(false); expect(isOneOf(null, ["keep", "remove"] as const)).toBe(false); expect(isOneOf(42, ["keep", "remove"] as const)).toBe(false); }); });