repositories / pi-ext
pi-ext
bugabingas pi extensions
owned by admin
extensions/the-system/__tests__/document-id.property.test.ts
Rawimport { 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;
}
}),
);
});
});