Release v2.15.2
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 4m34s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 57s

This commit is contained in:
lzstealth committed 2026-10-15 01:50:39 +01:00
1 parent ddcc665f81
commit 7295f83f04
43 files changed
+2526 -104

No files matched your search

+49
View File
@@ -5,6 +5,55 @@ require('../src/common');
const registerManageRoutes = require('../src/web/routes/admin/manage');
test('force-deleting a screen requires a verified empty live-connection list', async () => {
const handlers = {};
const queries = [];
let connectionResponse = { connections: [{ id: 'active-1' }] };
const app = {
post(path, ...routeHandlers) { handlers[path] = routeHandlers; },
get() {}
};
registerManageRoutes(app, {
pool: {
async query(sql, params) {
queries.push({ sql, params });
return [[]];
}
},
common: { async fetchScreenById() { return { id: 7, name: 'Demo', slug: 'demo' }; } },
pages: {},
getScreenDeleteBlockMessage: async () => 'This screen is still linked to onboarding devices.',
getScreenConnections: async () => connectionResponse,
requirePermission() { return function (_req, _res, next) { next(); }; }
});
const handler = handlers['/screens/:id/delete'][1];
const createResponse = function () {
return {
redirect(url) { this.redirectedTo = url; },
status(code) { this.statusCode = code; return this; },
send(body) { this.body = body; }
};
};
const activeResponse = createResponse();
await handler({ params: { id: '7' }, body: { force_delete: '1' } }, activeResponse, () => {});
assert.match(decodeURIComponent(activeResponse.redirectedTo), /still in use by connected players/);
assert.equal(queries.some(function (query) { return /DELETE FROM d_screens/.test(query.sql); }), false);
connectionResponse = { connections: [], degraded: true };
const unverifiableResponse = createResponse();
await handler({ params: { id: '7' }, body: { force_delete: '1' } }, unverifiableResponse, () => {});
assert.match(decodeURIComponent(unverifiableResponse.redirectedTo), /Unable to verify/);
assert.equal(queries.some(function (query) { return /DELETE FROM d_screens/.test(query.sql); }), false);
connectionResponse = { connections: [] };
const idleResponse = createResponse();
await handler({ params: { id: '7' }, body: { force_delete: '1' } }, idleResponse, () => {});
assert.equal(queries.some(function (query) { return /DELETE FROM d_screens/.test(query.sql); }), true);
});
test('screen update keeps the existing slug on edit', async () => {
const handlers = {};
const app = {