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'); });