import { describe, expect, it } from "vitest"; import { createToolcraftResourceManifest, parseToolcraftResourceManifest, serializeToolcraftResourceManifest, } from "./resource-manifest"; describe("Toolcraft resource manifest", () => { it("creates a stable, deduplicated manifest for source and derived resources", () => { const manifest = createToolcraftResourceManifest({ canonicalDocumentRefs: ["document:z", "document:a", "document:a"], derivedResourceRefs: ["repair:z", "repair:a", "repair:z"], durableSourceRefs: ["source:z", "source:a", "source:a"], }); expect(manifest).toEqual({ canonicalDocumentRefs: ["document:a", "document:z"], derivedResourceRefs: ["repair:a", "repair:z"], durableSourceRefs: ["source:a", "source:z"], version: 1, }); expect(serializeToolcraftResourceManifest(manifest)).toBe( '{"canonicalDocumentRefs":["document:a","document:z"],"derivedResourceRefs":["repair:a","repair:z"],"durableSourceRefs":["source:a","source:z"],"version":1}', ); }); it("strictly parses a canonical manifest without trusting unknown input", () => { const canonical = { canonicalDocumentRefs: ["document:a"], derivedResourceRefs: ["repair:a"], durableSourceRefs: ["source:a"], version: 1, }; expect(parseToolcraftResourceManifest(canonical)).toEqual(canonical); expect( parseToolcraftResourceManifest(JSON.stringify(canonical)), ).toEqual(canonical); const corruptInputs: readonly unknown[] = [ null, [], { ...canonical, version: 2 }, { ...canonical, unknown: true }, { ...canonical, durableSourceRefs: "source:a" }, { ...canonical, canonicalDocumentRefs: [""] }, { ...canonical, derivedResourceRefs: ["repair:a", "repair:a"] }, { ...canonical, durableSourceRefs: ["source:z", "source:a"] }, "{not-json", ]; for (const input of corruptInputs) { expect(() => parseToolcraftResourceManifest(input)).toThrow( /resource manifest/u, ); } }); it("rejects a bare string instead of treating it as an iterable of character refs", () => { expect(() => createToolcraftResourceManifest({ durableSourceRefs: "source:a" as never, }), ).toThrow(/resource manifest/u); }); });