const test = require('node:test'); const assert = require('node:assert/strict'); const { buildTemplatePayload, extractTemplateRegions } = require('../src/data/templates'); test('extractTemplateRegions normalizes JSON regions and filters invalid rows', () => { const regions = extractTemplateRegions({ regions_json: JSON.stringify([ { region_name: 'Hero', region_type: 'TEXT', lock_ratio: '16 : 9', animation_json: '{"intro":{"preset":"fadeIn"},"out":{"preset":"bounceOut"}}', x: '10', y: '20', width: '320', height: '180', z_index: '2' }, { region_name: ' ', region_type: 'image' } ]) }); assert.deepEqual(regions, [{ region_key: 'Hero', region_type: 'TEXT', label: 'Hero', lock_ratio: '16:9', animation_json: { intro: { preset: 'fadeIn' }, outro: { preset: 'bounceOut' }, loop: { preset: 'none' } }, x: 10, y: 20, width: 320, height: 180, z_index: 2 }]); }); test('buildTemplatePayload resolves canvas size and rejects duplicate region names', async () => { const pool = { async query(sql, params) { if (sql.includes('FROM c_canvas_sizes WHERE id = ?')) { assert.deepEqual(params, [4]); return [[{ id: 4, name: 'HD', width: 1280, height: 720 }]]; } throw new Error(`unexpected query: ${sql}`); } }; const payload = await buildTemplatePayload(pool, { body: { name: ' Main Template ', canvas_size_id: '4', background_color: 'not-a-color', regions_json: JSON.stringify([ { region_name: 'Header', region_type: 'text', lock_ratio: '4:3' } ]) }, files: [] }, null); assert.deepEqual(payload, { name: 'Main Template', canvasSizeId: 4, canvasSizeWidth: 1280, canvasSizeHeight: 720, backgroundImagePath: null, backgroundColor: '#111111', regions: [{ region_key: 'Header', region_type: 'text', label: 'Header', lock_ratio: '4:3', animation_json: { intro: { preset: 'none' }, outro: { preset: 'none' }, loop: { preset: 'none' } }, x: 0, y: 0, width: 100, height: 100, z_index: 0 }] }); await assert.rejects( () => buildTemplatePayload(pool, { body: { name: 'Dupes', regions_json: JSON.stringify([ { region_name: 'One' }, { region_name: 'one' } ]) }, files: [] }, null), (error) => error && error.statusCode === 400 && error.message === 'Region names must be unique on this template.' ); });