Files
pulse-signage/test/timetables-routes.test.js
2026-08-09 11:57:40 +01:00

155 lines
3.8 KiB
JavaScript

const test = require('node:test');
const assert = require('node:assert/strict');
require('../src/common');
const registerTimetableRoutes = require('../src/web/routes/data-sources/timetables/routes');
function createApp() {
const handlers = {};
return {
handlers: handlers,
app: {
get(path, ...routeHandlers) {
handlers['GET ' + path] = routeHandlers;
},
post(path, ...routeHandlers) {
handlers['POST ' + path] = routeHandlers;
}
}
};
}
function createConnection() {
const queries = [];
return {
queries: queries,
async beginTransaction() {
queries.push(['beginTransaction']);
},
async query(sql, params) {
queries.push([sql, params]);
if (String(sql).indexOf('INSERT INTO i_timetable_groups') !== -1) {
return [{ insertId: 42 }];
}
return [{}];
},
async commit() {
queries.push(['commit']);
},
async rollback() {
queries.push(['rollback']);
},
release() {
queries.push(['release']);
}
};
}
test('timetable create and update persist the selected timezone', async () => {
const connection = createConnection();
const { app, handlers } = createApp();
registerTimetableRoutes(app, {
pool: {
getConnection() {
return connection;
}
},
common: {
fetchTimetableGroupById: async function () {
return {
id: 7,
name: 'Existing',
short_description: 'Old description',
timezone: 'Europe/London'
};
},
fetchDuplicateName: async function () {
return false;
},
buildTimetableGroupPayload: function (req) {
return {
name: req.body.name,
shortDescription: req.body.short_description,
timezone: req.body.timezone
};
},
fetchTimetableEntriesByGroupId: async function () {
return [];
}
},
getAuditUserId: function () {
return 9;
},
redirectAfterSave: function (_req, res, url) {
res.redirect(url);
},
parseDateTimeLocal: function (value) {
return value ? new Date(value) : null;
},
requirePermission: function () {
return function (_req, _res, next) {
next();
};
}
});
const createRoute = handlers['POST /data-sources/timetables'][1];
const updateRoute = handlers['POST /data-sources/timetables/:id'][1];
const createResponse = {
redirects: [],
redirect(url) {
this.redirects.push(url);
},
status() {
return this;
}
};
await createRoute({
body: {
name: 'Morning',
short_description: 'Breakfast block',
timezone: 'Europe/Berlin'
},
currentUser: { id: 1 },
query: {}
}, createResponse, function () {});
assert.deepEqual(connection.queries[1], [
'INSERT INTO i_timetable_groups (name, short_description, timezone, created_by, modified_by) VALUES (?, ?, ?, ?, ?)',
['Morning', 'Breakfast block', 'Europe/Berlin', 9, 9]
]);
assert.equal(createResponse.redirects[0], '/data-sources/timetables/42/edit');
connection.queries.length = 0;
const updateResponse = {
redirects: [],
redirect(url) {
this.redirects.push(url);
},
status() {
return this;
}
};
await updateRoute({
params: { id: '7' },
body: {
name: 'Morning',
short_description: 'Breakfast block',
timezone: 'Europe/Berlin'
},
currentUser: { id: 1 },
query: {}
}, updateResponse, function () {});
assert.deepEqual(connection.queries[1], [
'UPDATE i_timetable_groups SET name = ?, short_description = ?, timezone = ?, modified_by = ? WHERE id = ?',
['Morning', 'Breakfast block', 'Europe/Berlin', 9, 7]
]);
assert.equal(updateResponse.redirects[0], '/data-sources/timetables/7/edit');
});