Luigit
repositories / pi-ext

pi-ext

bugabingas pi extensions

owned by admin

extensions/the-system/__tests__/document-id.property.test.ts

Raw
import { describe, it } from "vitest";
import { assertProperty, fc } from "../../../test/property.ts";
import { parseDocumentId } from "../system-config.ts";

const upper = fc.constantFrom(..."ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""));
const alnum = fc.constantFrom(
	..."ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".split(""),
);
const tokenChar = fc.constantFrom(
	..."ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-".split(""),
);
const prefix = fc
	.tuple(upper, fc.array(alnum, { minLength: 1, maxLength: 7 }))
	.map(([head, tail]) => head + tail.join(""));
const token = fc
	.array(tokenChar, { minLength: 8, maxLength: 8 })
	.map((chars) => chars.join(""));
const typeToken = fc.constantFrom("SPEC", "PHASE", "PLAN", "ISSUE", "RESEARCH");

describe("parseDocumentId (property)", () => {
	it("round-trips every well-formed ID into its parts", () => {
		assertProperty(
			import.meta.url,
			"parseDocumentId round-trips valid IDs",
			fc.property(prefix, typeToken, token, (p, ty, tok) => {
				const id = `${p}-${ty}-${tok}`;
				const parsed = parseDocumentId(id);
				return (
					parsed.id === id &&
					parsed.prefix === p &&
					parsed.token === tok &&
					parsed.type === ty.toLowerCase()
				);
			}),
		);
	});

	it("rejects case-folded prefixes (IDs are case-sensitive)", () => {
		assertProperty(
			import.meta.url,
			"parseDocumentId rejects lowercase prefixes",
			fc.property(prefix, typeToken, token, (p, ty, tok) => {
				const bad = `${p.toLowerCase()}-${ty}-${tok}`;
				try {
					parseDocumentId(bad);
					return false;
				} catch {
					return true;
				}
			}),
		);
	});
});