Files
pulse-signage/test/initial-font-sync-task.test.js
T
lzstealth b71958cb38
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m21s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 32s
Release 2.22.0: normalize playlist schedules and unify player sync
2026-10-27 22:54:38 +00:00

98 lines
3.2 KiB
JavaScript

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