import { describe, expect, it } from "vitest"; import { createMemoryToolcraftBinaryAssetRepository } from "../source-assets/repository/memory-binary-asset-repository"; import { encodeToolcraftModelDocument } from "./canonical/model-document-codec"; import { digestToolcraftModelDocument } from "./canonical/model-document-digest"; import { createModelTexture, createValidModelDocumentV2, } from "./canonical/model-document-test-support"; import { createToolcraftModelAppearanceResourceRef, createToolcraftModelDocumentResourceRef, } from "./model-source-asset-handler-resources"; import { digestModelSourceBytes } from "./model-source-digest"; import { hasValidToolcraftModelDocumentResource } from "./model-persistence-hydration-resources"; async function persistedV2Document(textureBytes: Uint8Array) { const repository = createMemoryToolcraftBinaryAssetRepository(); const originalBytes = new Uint8Array([137, 80, 78, 71]); const textureDigest = digestModelSourceBytes(originalBytes); const textureRef = createToolcraftModelAppearanceResourceRef(textureDigest); const document = createValidModelDocumentV2({ textures: [createModelTexture({ contentDigest: textureDigest, resourceRef: textureRef, })], }); const documentRef = createToolcraftModelDocumentResourceRef( digestToolcraftModelDocument(document), ); const lease = await repository.beginLease("persisted-v2-model"); await lease.put(textureRef, textureBytes, { contentType: "image/png", durable: false, }); await lease.put(documentRef, encodeToolcraftModelDocument(document), { contentType: "application/vnd.toolcraft.model-document", dependencies: [textureRef], durable: false, }); await lease.commit(); return { documentRef, repository }; } describe("persisted model appearance resources", () => { it("accepts a v2 document with its exact authenticated dependency", async () => { const { documentRef, repository } = await persistedV2Document( new Uint8Array([137, 80, 78, 71]), ); await expect(hasValidToolcraftModelDocumentResource( repository, documentRef, new AbortController().signal, )).resolves.toBe(true); }); it("rejects a v2 document whose appearance bytes were substituted", async () => { const { documentRef, repository } = await persistedV2Document( new Uint8Array([137, 80, 78, 70]), ); await expect(hasValidToolcraftModelDocumentResource( repository, documentRef, new AbortController().signal, )).resolves.toBe(false); }); });