const test = require('node:test'); const assert = require('node:assert/strict'); require('../src/common'); const { buildPlaylistFormViewModel } = require('../src/web/routes/signage/playlists/form-view-model'); test('playlist rows show mute controls for RTMP slides', () => { const model = buildPlaylistFormViewModel( { id: 22, name: 'Playlist 22' }, { playlistSlides: [ { id: 1, playlist_id: 22, slide_id: 101, position: 1, title: 'Video slide', content_json: '{"videoRegion":{"type":"video","value":"/media/video.mp4"}}', duration_seconds: 10, use_video_duration: 0, disable_audio: 1 }, { id: 2, playlist_id: 22, slide_id: 102, position: 2, title: 'RTMP slide', content_json: '{"rtmpRegion":{"type":"rtmp","value":"rtmp://example/live"}}', duration_seconds: 10, use_video_duration: 0, disable_audio: 1 }, { id: 3, playlist_id: 22, slide_id: 103, position: 3, title: 'Image slide', content_json: '{"imageRegion":{"type":"image","value":"/media/image.png"}}', duration_seconds: 10, use_video_duration: 0, disable_audio: 1 } ], slides: [] }, '', null, { isEdit: true } ); assert.equal(model.playlistSlides[0].showMuteButton, true); assert.equal(model.playlistSlides[1].showMuteButton, true); assert.equal(model.playlistSlides[2].showMuteButton, false); }); test('playlist rows use the longest video region duration', () => { const model = buildPlaylistFormViewModel( { id: 23, name: 'Playlist 23' }, { playlistSlides: [ { id: 4, playlist_id: 23, slide_id: 104, position: 1, title: 'Multi-video slide', content_json: '{"firstVideo":{"type":"video","value":"/media/first.mp4","duration_seconds":12.5},"secondVideo":{"type":"video","value":"/media/second.mp4","duration_seconds":27.75},"textRegion":{"type":"text","value":"Hello"}}', duration_seconds: 10, use_video_duration: 1, disable_audio: 1 } ], slides: [] }, '', null, { isEdit: true } ); assert.equal(model.playlistSlides[0].showVideoDurationButton, true); assert.equal(model.playlistSlides[0].videoDurationSeconds, 27.75); assert.equal(model.playlistSlides[0].durationSeconds, 27.75); }); test('disabled canvas sizes are hidden for new playlists but retained for existing assignments', () => { const canvasSizes = [ { id: 1, name: 'Full HD', width: 1920, height: 1080, enabled: 1 }, { id: 2, name: 'Legacy', width: 1280, height: 720, enabled: 0 } ]; const data = { playlistSlides: [], slides: [], canvasSizes: canvasSizes }; const createModel = buildPlaylistFormViewModel({}, data, '', null, {}); assert.deepEqual(createModel.canvasSizes.map((size) => size.id), [1]); const editModel = buildPlaylistFormViewModel({ id: 12, canvas_id: 2 }, data, '', null, { isEdit: true }); assert.deepEqual(editModel.canvasSizes.map((size) => size.id), [1, 2]); assert.match(editModel.canvasSizes[1].label, /Disabled/); assert.equal(editModel.canvasSizes[1].selected, true); });