import { describe, test, expect } from 'vitest'; import { templateComponentToTreeNode } from './apply-template'; describe('templateComponentToTreeNode', () => { test('converts a childless TemplateComponent to a SerializedTreeNode with an empty `nodes` array', () => { const node = templateComponentToTreeNode({ type: 'Heading', props: { text: 'Hi' } }); expect(node).toEqual({ type: { resolvedName: 'Heading' }, props: { text: 'Hi' }, nodes: [], }); }); test('regression: recursively converts nested `children` into `nodes` (previously dropped entirely)', () => { const node = templateComponentToTreeNode({ type: 'Container', props: { tag: 'header' }, children: [ { type: 'Logo', props: { text: 'FlowStack' } }, { type: 'Menu', props: { links: [] } }, ], }); expect(node.nodes).toHaveLength(2); expect(node.nodes![0]).toEqual({ type: { resolvedName: 'Logo' }, props: { text: 'FlowStack' }, nodes: [] }); expect(node.nodes![1]).toEqual({ type: { resolvedName: 'Menu' }, props: { links: [] }, nodes: [] }); }); test('recurses more than one level deep', () => { const node = templateComponentToTreeNode({ type: 'Section', props: {}, children: [ { type: 'ColumnLayout', props: { columns: 1 }, children: [{ type: 'TextBlock', props: { text: 'deep' } }], }, ], }); const col = node.nodes![0]; expect(col.type.resolvedName).toBe('ColumnLayout'); expect(col.nodes![0]).toEqual({ type: { resolvedName: 'TextBlock' }, props: { text: 'deep' }, nodes: [] }); }); test('does not mutate the input TemplateComponent', () => { const comp = { type: 'Heading', props: { text: 'Hi' } }; const frozen = JSON.parse(JSON.stringify(comp)); templateComponentToTreeNode(comp); expect(comp).toEqual(frozen); }); });