const test = require('node:test'); const assert = require('node:assert/strict'); require('../src/common'); const registerScreensRoutes = require('../src/web/routes/signage/screens/routes'); test('screen edit page includes shared launcher downloads and base player url', async () => { const handlers = {}; const app = { get(path, ...routeHandlers) { handlers[path] = routeHandlers; } }; let renderedArgs = null; const pages = { renderScreenEditPage(screen, data, message, currentUser) { renderedArgs = { screen, data, message, currentUser }; return 'ok'; } }; registerScreensRoutes(app, { pool: { async query() { return [[]]; } }, common: { async fetchScreenById() { return { id: 7, name: 'Demo Conference', slug: 'demo-conference', playlist_id: null }; }, async fetchScreenEditData() { return { playlists: [] }; }, async fetchScreenPlayerUrls() { return { 'demo-conference': 'http://player.example/screen/demo-conference' }; }, async fetchPlayerPublicBaseUrl() { return 'http://player.example'; } }, pages, buildDashboardState: async () => ({ screens: [] }), getScreenDeleteBlockMessage: async () => '', getScreenConnections: async () => [], playerPublicBaseUrl: 'http://player.example', requirePermission() { return function (_req, _res, next) { next(); }; } }); const handler = handlers['/screens/:id/edit']; assert.equal(Array.isArray(handler), true); const res = { send(value) { this.body = value; }, status(code) { this.statusCode = code; return this; } }; await handler[1]({ params: { id: '7' }, query: {}, currentUser: { id: 1 } }, res, () => {}); assert.equal(res.body, 'ok'); assert.deepEqual(renderedArgs.screen.player_url, 'http://player.example/screen/demo-conference'); assert.deepEqual(renderedArgs.screen.launcher_downloads, { windows: '/downloads/kiosk/pulse-signage-kiosk.bat', linux: '/downloads/kiosk/pulse-signage-kiosk.sh' }); }); test('screen launcher downloads are shared and attached', async () => { const handlers = {}; const app = { get(path, ...routeHandlers) { handlers[path] = routeHandlers; } }; registerScreensRoutes(app, { pool: { async query() { return [[]]; } }, common: { async fetchScreenById() { return { id: 7, name: 'Demo Conference', slug: 'demo-conference', playlist_id: null }; }, async fetchScreenEditData() { return { playlists: [] }; }, async fetchScreenPlayerUrls() { return { 'demo-conference': 'http://player.example/screen/demo-conference' }; }, async fetchPlayerPublicBaseUrl() { return 'http://player.example'; } }, pages: { renderScreenEditPage() { return 'ok'; } }, buildDashboardState: async () => ({ screens: [] }), getScreenDeleteBlockMessage: async () => '', getScreenConnections: async () => [], playerPublicBaseUrl: 'http://player.example', requirePermission() { return function (_req, _res, next) { next(); }; } }); const windowsHandler = handlers['/downloads/kiosk/pulse-signage-kiosk.bat']; assert.equal(Array.isArray(windowsHandler), true); const res = { headers: {}, statusCode: 200, set(name, value) { this.headers[name.toLowerCase()] = value; }, attachment(filename) { this.headers['content-disposition'] = `attachment; filename="${filename}"`; }, type(value) { this.headers['content-type'] = value; }, send(value) { this.body = value; }, status(code) { this.statusCode = code; return this; } }; await windowsHandler[1]({ params: { id: '7' } }, res, () => {}); assert.equal(res.statusCode, 200); assert.match(res.headers['content-disposition'], /pulse-signage-kiosk\.bat/); assert.match(res.body, /TARGET_URL=http:\/\/player\.example/); assert.match(res.body, /--kiosk/); });