import { describe, expect, it } from "vitest"; import { imageExportModule } from "./built-ins/image-export/image-export-module"; import { svgExportModule } from "./built-ins/svg-export/svg-export-module"; import { resolveToolcraftModuleContributions } from "./testing/module-resolution-test-support"; import { getActionContribution, getSettingsContribution, permutations, } from "./testing/module-contribution-test-fixtures"; describe("Toolcraft module aggregate resource preflight", () => { it("preflights aggregate action section collisions in every order", () => { const imageSettings = getSettingsContribution( imageExportModule(), "image-export.settings", ); const imageAction = getActionContribution( imageExportModule(), "image-export.action", ); const svgAction = getActionContribution( svgExportModule(), "svg-export.action", ); const collidingSettings = { ...imageSettings, placement: { after: [], before: ["image-export.settings"], slot: "artifact-settings", }, runtimeSectionId: "runtime.export", } as const; const separateContributions = [collidingSettings, svgAction]; for (const contributionOrder of permutations(separateContributions)) { expect(() => resolveToolcraftModuleContributions(contributionOrder), ).toThrowError( 'Toolcraft module ownership key "control-section:runtime.export" has multiple owners: image-export/image-export.settings, svg-export/svg-export.action.', ); } for (const contributionOrder of permutations([ collidingSettings, imageAction, ])) { expect(() => resolveToolcraftModuleContributions(contributionOrder), ).toThrowError( 'Toolcraft module ownership key "control-section:runtime.export" has multiple owners: image-export/image-export.action, image-export/image-export.settings.', ); } }); it("preflights aggregate action target collisions before materializers", () => { const imageSettings = getSettingsContribution( imageExportModule(), "image-export.settings", ); const imageAction = getActionContribution( imageExportModule(), "image-export.action", ); const svgAction = getActionContribution( svgExportModule(), "svg-export.action", ); const imageFormat = imageSettings.section.controls.imageFormat!; const imageResolution = imageSettings.section.controls.imageResolution!; const collidingSettings = { ...imageSettings, placement: { after: [], before: ["image-export.settings"], slot: "artifact-settings", }, section: { id: "test-section-1", controls: { imageFormat: { ...imageFormat, target: "actions.output" }, imageResolution, }, layoutGroups: [], title: imageSettings.section.title, }, } as const; const separateContributions = [collidingSettings, svgAction]; for (const contributionOrder of permutations(separateContributions)) { expect(() => resolveToolcraftModuleContributions(contributionOrder), ).toThrowError( 'Toolcraft module ownership key "control-target:actions.output" has multiple owners: image-export/image-export.settings, svg-export/svg-export.action.', ); } for (const contributionOrder of permutations([ collidingSettings, imageAction, ])) { expect(() => resolveToolcraftModuleContributions(contributionOrder), ).toThrowError( 'Toolcraft module ownership key "control-target:actions.output" has multiple owners: image-export/image-export.action, image-export/image-export.settings.', ); } }); });