import { describe, expect, test } from 'bun:test' describe('file input references', () => { test('inputRef adds format=raw for file inputs', async () => { const { inputRef } = await import('./workflow-references.ts') const { createWorkflowInput } = await import('./workflow-spec-builders.ts') const input = createWorkflowInput({ id: 'input-doc', name: 'document', type: 'file' }) expect(inputRef(input)).toBe('{{input://input-doc?format=raw}}') }) test('inputRef leaves non-file inputs untouched', async () => { const { inputRef } = await import('./workflow-references.ts') const { createWorkflowInput } = await import('./workflow-spec-builders.ts') const input = createWorkflowInput({ id: 'input-topic', name: 'topic', type: 'text' }) expect(inputRef(input)).toBe('{{input://input-topic}}') }) test('inputRef respects an explicit format on a file input', async () => { const { inputRef } = await import('./workflow-references.ts') const { createWorkflowInput } = await import('./workflow-spec-builders.ts') const input = createWorkflowInput({ id: 'input-doc', name: 'document', type: 'file' }) expect(inputRef(input, { format: 'ai-xml' })).toBe('{{input://input-doc?format=ai-xml}}') }) test('inputRef cannot infer the type from a bare identifier', async () => { const { inputRef } = await import('./workflow-references.ts') expect(inputRef('input-doc')).toBe('{{input://input-doc}}') }) }) describe('workflow outputs', () => { test('outputsFromStep maps every schema property to a step reference', async () => { const { outputsFromStep } = await import('./workflow-spec-builders.ts') expect(outputsFromStep({ id: 'step-1' }, { vendor: { type: 'string' }, total: { type: 'number' }, })).toEqual({ vendor: { type: 'string', source: '{{step://step-1?path=vendor}}' }, total: { type: 'number', source: '{{step://step-1?path=total}}' }, }) }) test('outputsFromStep defaults an untyped property to string', async () => { const { outputsFromStep } = await import('./workflow-spec-builders.ts') expect(outputsFromStep({ id: 'step-1' }, { summary: {} })).toEqual({ summary: { type: 'string', source: '{{step://step-1?path=summary}}' }, }) }) test('outputsFromStep results merge across steps', async () => { const { outputsFromStep, buildWorkflowSpec } = await import('./workflow-spec-builders.ts') const spec = buildWorkflowSpec({ outputs: { ...outputsFromStep({ id: 'step-1' }, { parties: { type: 'array' } }), ...outputsFromStep({ id: 'step-2' }, { total: { type: 'number' } }), }, }) expect(Object.keys(spec.outputs as object)).toEqual(['parties', 'total']) }) test('buildWorkflowSpec carries parallelExecution through settings', async () => { const { buildWorkflowSpec } = await import('./workflow-spec-builders.ts') expect(buildWorkflowSpec({ settings: { parallelExecution: true } }).settings) .toEqual({ parallelExecution: true }) }) test('buildWorkflowSpec omits settings when not requested', async () => { const { buildWorkflowSpec } = await import('./workflow-spec-builders.ts') expect('settings' in buildWorkflowSpec({})).toBe(false) }) })