Files
pulse-signage/test/templates.test.js
T

109 lines
2.6 KiB
JavaScript

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.'
);
});