Release 2.8.0
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m49s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 32s

This commit is contained in:
2026-08-16 17:15:31 +01:00
parent 1bdc122995
commit 203d0bfc01
105 changed files with 4185 additions and 677 deletions
+82
View File
@@ -0,0 +1,82 @@
const test = require('node:test');
const assert = require('node:assert/strict');
require('../src/common');
const registerAuditLogRoutes = require('../src/web/routes/settings/audit-log');
test('audit log uses its own read permission and shared pagination partial', async () => {
const handlers = {};
const app = {
get(path, ...routeHandlers) {
handlers[path] = routeHandlers;
}
};
registerAuditLogRoutes(app, {
pool: {
async query(sql) {
if (String(sql).includes('FROM o_audit_events')) {
return [[
{
id: 1,
occurred_at: '2026-08-16T12:00:00.000Z',
category: 'authentication',
event_type: 'login.success',
target_label: 'newer',
details_json: null
},
{
id: 2,
occurred_at: '2026-08-15T12:00:00.000Z',
category: 'authentication',
event_type: 'login.failed',
target_label: 'older',
details_json: null
}
]];
}
return [[]];
}
},
formatDashboardDate() {
return 'Aug 16, 2026';
}
});
assert.ok(handlers['/settings/audit-log']);
const request = {
currentUser: { id: 7, permissions: ['audit-log.read', 'audit-log.allow'] },
query: {}
};
let continued = false;
handlers['/settings/audit-log'][0](request, {}, function () {
continued = true;
});
assert.equal(continued, true);
const response = { send(value) { this.body = value; } };
await handlers['/settings/audit-log'][1](request, response, function (error) {
throw error;
});
assert.match(response.body, /Audit log/);
assert.match(response.body, /table-pagination/);
assert.match(response.body, /data-local-datetime/);
assert.match(response.body, /audit-event-type-options/);
assert.match(response.body, /login\.success/);
assert.ok(response.body.indexOf('login.success') < response.body.indexOf('login.failed'));
assert.match(response.body, />Export</);
assert.ok(handlers['/settings/audit-log/export']);
const exportResponse = {
headers: {},
setHeader(name, value) { this.headers[name] = value; },
send(value) { this.body = value; }
};
await handlers['/settings/audit-log/export'][1](request, exportResponse, function (error) {
throw error;
});
assert.match(exportResponse.headers['Content-Type'], /text\/csv/);
assert.match(exportResponse.body, /Occurred At \(UTC\)/);
assert.match(exportResponse.body, /login.success/);
});