const test = require('node:test'); const assert = require('node:assert/strict'); const express = require('express'); require('../src/common'); const { createRequestAuthHeaders } = require('../src/request-auth'); const registerInternalSyncRoutes = require('../src/web/routes/internal/sync'); test('player media sync requests are queued as background tasks', async () => { const originalSecret = process.env.PULSE_SIGNAGE_SHARED_SECRET; process.env.PULSE_SIGNAGE_SHARED_SECRET = 'test-shared-secret'; const queuedTasks = []; const app = express(); app.use(express.json()); registerInternalSyncRoutes(app, { backgroundTaskQueue: { async enqueueTask(definition) { queuedTasks.push(definition); return { id: 42, key: definition.key, taskType: definition.taskType, title: definition.title, category: definition.category, status: 'queued', createdAt: new Date().toISOString(), startedAt: '', finishedAt: '', errorMessage: '', attempts: 0, metadata: definition.metadata, payload: definition.payload }; } }, uploadSyncService: {}, mediaDir: 'e:/Projects Git/pulse-signage/media' }); app.use(function (error, _req, res, _next) { res.status(error.statusCode || 500).json({ error: String(error && error.message ? error.message : error) }); }); const server = app.listen(0); try { const address = server.address(); const body = { deviceId: 'player-remote', playerPublicBaseUrl: 'https://player.example.test', playerInternalBaseUrl: 'http://player-bridge:8090' }; const headers = Object.assign({ 'content-type': 'application/json' }, createRequestAuthHeaders({ method: 'POST', pathname: '/api/internal/sync/player-media', body: body })); const response = await fetch(`http://127.0.0.1:${address.port}/api/internal/sync/player-media`, { method: 'POST', headers: headers, body: JSON.stringify(body) }); assert.equal(response.status, 202); assert.equal(queuedTasks.length, 1); assert.equal(queuedTasks[0].key, 'player-media-sync'); assert.equal(queuedTasks[0].taskType, 'media-sync'); assert.equal(queuedTasks[0].payload.mode, 'initial'); assert.equal(queuedTasks[0].payload.playerIdentifier, 'player-remote'); assert.equal(queuedTasks[0].metadata.playerLabel, 'player-remote'); } finally { await new Promise(function (resolve) { server.close(resolve); }); process.env.PULSE_SIGNAGE_SHARED_SECRET = originalSecret; } }); test('player font sync requests are queued as background tasks', async () => { const originalSecret = process.env.PULSE_SIGNAGE_SHARED_SECRET; process.env.PULSE_SIGNAGE_SHARED_SECRET = 'test-shared-secret'; const queuedTasks = []; const app = express(); app.use(express.json()); registerInternalSyncRoutes(app, { backgroundTaskQueue: { async enqueueTask(definition) { queuedTasks.push(definition); return { id: 43, key: definition.key, taskType: definition.taskType, title: definition.title, category: definition.category, status: 'queued', createdAt: new Date().toISOString(), startedAt: '', finishedAt: '', errorMessage: '', attempts: 0, metadata: definition.metadata, payload: definition.payload }; } }, uploadSyncService: {}, mediaDir: 'e:/Projects Git/pulse-signage/media' }); app.use(function (error, _req, res, _next) { res.status(error.statusCode || 500).json({ error: String(error && error.message ? error.message : error) }); }); const server = app.listen(0); try { const address = server.address(); const body = { deviceId: 'player-remote', playerPublicBaseUrl: 'https://player.example.test', playerInternalBaseUrl: 'http://player-bridge:8090' }; const headers = Object.assign({ 'content-type': 'application/json' }, createRequestAuthHeaders({ method: 'POST', pathname: '/api/internal/sync/player-font', body: body })); const response = await fetch(`http://127.0.0.1:${address.port}/api/internal/sync/player-font`, { method: 'POST', headers: headers, body: JSON.stringify(body) }); assert.equal(response.status, 202); assert.equal(queuedTasks.length, 1); assert.equal(queuedTasks[0].key, 'player-font-sync'); assert.equal(queuedTasks[0].taskType, 'font-sync'); assert.equal(queuedTasks[0].payload.mode, 'initial'); assert.equal(queuedTasks[0].payload.playerIdentifier, 'player-remote'); assert.equal(queuedTasks[0].metadata.playerLabel, 'player-remote'); } finally { await new Promise(function (resolve) { server.close(resolve); }); process.env.PULSE_SIGNAGE_SHARED_SECRET = originalSecret; } });