25 lines
1.2 KiB
TypeScript
25 lines
1.2 KiB
TypeScript
|
|
import { describe, test, expect } from 'vitest';
|
||
|
|
import { summarizeCanvas } from './canvas-summary';
|
||
|
|
|
||
|
|
const fixture = {
|
||
|
|
ROOT: { type: { resolvedName: 'Container' }, props: { aiName: 'Page Root', node_id: 'ai-root-1' }, nodes: ['n1','n2'], parent: null },
|
||
|
|
n1: { type: { resolvedName: 'Heading' }, props: { aiName: 'Hero Title', node_id: 'ai-hero-1', text: 'Welcome', level: 1, style: { color: '#fff' } }, nodes: [], parent: 'ROOT' },
|
||
|
|
n2: { type: { resolvedName: 'HtmlBlock' }, props: { aiName: 'Custom Embed', node_id: 'ai-html-1', code: '<div>opaque</div>' }, nodes: [], parent: 'ROOT' },
|
||
|
|
};
|
||
|
|
|
||
|
|
describe('summarizeCanvas', () => {
|
||
|
|
test('one line per node with id and aiName', () => {
|
||
|
|
const out = summarizeCanvas(fixture as any);
|
||
|
|
expect(out).toContain('Container id=ai-root-1');
|
||
|
|
expect(out).toContain('Heading id=ai-hero-1 name="Hero Title"');
|
||
|
|
});
|
||
|
|
test('excludes style props', () => {
|
||
|
|
expect(summarizeCanvas(fixture as any)).not.toContain('color=');
|
||
|
|
});
|
||
|
|
test('truncates to maxChars', () => {
|
||
|
|
const out = summarizeCanvas(fixture as any, 60);
|
||
|
|
expect(out.length).toBeLessThanOrEqual(60);
|
||
|
|
expect(out).toContain('truncated');
|
||
|
|
});
|
||
|
|
});
|