import { vi } from "vitest"; import { mediaSourceModule } from "../../modules/built-ins/media-source/media-source-module"; import { defineToolcraft } from "../../schema/define-toolcraft"; import type { ResolvedToolcraftAppSchema } from "../../schema/resolved-app-schema"; import { createToolcraftDefaultBinaryMediaHydrationJobs } from "../../source-assets/binary-media-hydration"; import type { ToolcraftSourceAssetCoordinator } from "../../source-assets/source-asset-coordinator"; import { createToolcraftState } from "../../state/create-template-state"; import { createToolcraftExternalStore } from "../../composition/public-state"; import type { ToolcraftInitialState } from "../../state/types"; import { useToolcraftSourceAssetCoordinator } from "./toolcraft-source-asset-context"; export function ToolcraftSourceAssetCoordinatorProbe({ capture, }: { capture: (coordinator: ToolcraftSourceAssetCoordinator) => void; }): null { capture(useToolcraftSourceAssetCoordinator()); return null; } export function createTestSourceAssetCoordinator( overrides: Partial = {}, ): ToolcraftSourceAssetCoordinator { const idleOperation = Object.freeze({ phase: "idle" as const, target: "source.test", }); return { cancelTarget: vi.fn(), clearPresentationFeedback: vi.fn(), dispose: vi.fn(async () => undefined), getOperation: () => idleOperation, supportsKind: () => true, hydrateBinaryMedia: vi.fn(async () => undefined), hydrateModels: vi.fn(async () => undefined), importBatch: vi.fn(async () => ({ assetIds: [] as const, kind: "committed" as const, })), repairModel: vi.fn(async () => ({ kind: "cancelled" as const })), reportPresentationFeedback: vi.fn(), subscribe: () => () => undefined, ...overrides, }; } export function createTestSourceAssetStore() { return createToolcraftExternalStore( createToolcraftState( defineToolcraft({ base: { identity: { id: "runtime-test", title: "Toolcraft App" }, canvas: { enabled: true, upload: true }, panels: {}, }, modules: [mediaSourceModule()], }), ), ); } export function createTestMediaBootstrapUrls( schema: ResolvedToolcraftAppSchema, initialState?: ToolcraftInitialState, ): ReadonlyMap { return new Map([ ...createToolcraftDefaultBinaryMediaHydrationJobs(schema).map( ({ dataUrl, resourceRef }) => [resourceRef, dataUrl] as const, ), ...(initialState?.mediaAssets ?? []).flatMap((input) => { const asset = "asset" in input ? input.asset : input; return asset.assetKind === "model" || asset.lifecycle === "unavailable" ? [] : [[asset.resourceRef, asset.resourceRef] as const]; }), ]); }