const test = require('node:test'); const assert = require('node:assert/strict'); require('../src/common'); const { registerInitialFontSyncTask } = require('../src/web/lib/background-tasks/tasks-startup/font-sync'); const { registerFontSyncTask } = require('../src/web/lib/background-tasks/tasks-adhoc/font-sync'); test('initial font sync queues a separate task for each live player', async () => { const queuedTasks = []; const liveLastSeenAt = new Date(Date.now() - 10_000).toISOString(); const staleLastSeenAt = new Date(Date.now() - 5 * 60 * 1000).toISOString(); await registerInitialFontSyncTask({ pool: { async query() { return [[ { identifier: 'player-one', public_base_url: 'https://player-one.example', internal_base_url: 'http://player-one:8081', last_seen_at: liveLastSeenAt }, { identifier: 'player-two', public_base_url: 'https://player-two.example', internal_base_url: 'http://player-two:8081', last_seen_at: liveLastSeenAt }, { identifier: 'player-stale', public_base_url: 'https://player-stale.example', internal_base_url: 'http://player-stale:8081', last_seen_at: staleLastSeenAt } ]]; } }, backgroundTaskQueue: { async enqueueTask(definition) { queuedTasks.push(definition); return definition; } }, mediaDir: 'e:/Projects Git/pulse-signage/media', uploadSyncService: { async getPlayerTaskMetadata() { return {}; } } }); assert.equal(queuedTasks.length, 2); assert.deepEqual(queuedTasks.map(function (task) { return task.metadata.playerIdentifier; }).sort(), ['player-one', 'player-two']); assert.deepEqual(queuedTasks.map(function (task) { return task.payload.playerIdentifier; }).sort(), ['player-one', 'player-two']); assert.ok(queuedTasks.every(function (task) { return task.key === 'initial-font-sync' && task.title === 'Initial font sync' && task.taskType === 'font-sync'; })); }); test('font sync task fails when a required player upload is unsuccessful', async () => { let handler = null; registerFontSyncTask({ backgroundTaskQueue: { setTaskHandler(taskType, taskHandler) { assert.equal(taskType, 'font-sync'); handler = taskHandler; } }, uploadSyncService: { async pushUploadFileToPlayer() { return false; }, async removeUploadFileFromPlayer() { return false; } } }); await assert.rejects(handler({ payload: { uploadDir: 'media', playerIdentifier: 'player-local', requireSuccess: true, operations: [{ type: 'put', uploadPath: '/media/assets/fonts/test.ttf' }] } }), /Unable to synchronize \/media\/assets\/fonts\/test\.ttf to player player-local\./); await assert.rejects(handler({ payload: { uploadDir: 'media', playerIdentifier: 'player-local', requireSuccess: true, operations: [{ type: 'delete', uploadPath: '/media/assets/fonts/old.ttf' }] } }), /Unable to remove \/media\/assets\/fonts\/old\.ttf from player player-local\./); });