Show read-only server reading hours in settings

This commit is contained in:
Codex committed 2026-10-14 22:42:54 +02:00
1 parent de8e7ed988
commit ddd9c62c40
9 files changed
+89 -7

No files matched your search

+10 -1
View File
@@ -1,7 +1,7 @@
'use strict';
const test = require('node:test');
const assert = require('node:assert/strict');
const { parseSchedule, scheduled, answerMatches, createReadingAccess } = require('../reading-access');
const { parseSchedule, scheduled, publicSchedule, answerMatches, createReadingAccess } = require('../reading-access');
const windows = parseSchedule(JSON.stringify({
0: [['08:00', '01:00']], 1: [['07:00', '12:00'], ['13:00', '24:00']],
@@ -25,6 +25,15 @@ test('schedule config rejects malformed and zero-length windows', () => {
assert.throws(() => parseSchedule('{"1":[["25:00","26:00"]]}', 'Europe/Berlin'));
});
test('public schedule exposes only the configured read-only windows', () => {
const view = publicSchedule(windows);
assert.equal(view.enabled, true);
assert.equal(view.timezone, 'Europe/Berlin');
assert.deepEqual(view.days[1], [['07:00', '12:00'], ['13:00', '24:00']]);
assert.deepEqual(view.days[6], [['08:00', '01:00']]);
assert.deepEqual(publicSchedule(null), { enabled: false, timezone: null, days: [] });
});
test('answers accept aliases and small typos but not unrelated words', () => {
assert.equal(answerMatches(' luffy ', ['Monkey D. Luffy', 'Luffy']), true);
assert.equal(answerMatches('Lufy', ['Luffy']), true);
+10 -1
View File
@@ -1,7 +1,7 @@
'use strict';
const test = require('node:test');
const assert = require('node:assert/strict');
const { SETTINGS_SECTIONS, SCRAPER_TABS, settingsRoute } = require('../public/settings-nav');
const { SETTINGS_SECTIONS, SCRAPER_TABS, settingsRoute, readingDayText } = require('../public/settings-nav');
test('settings organize unique routes into User and Admin, with scraper-local tabs', () => {
assert.equal(new Set(SETTINGS_SECTIONS.map(s => s.id)).size, SETTINGS_SECTIONS.length);
@@ -21,3 +21,12 @@ test('settings deep links default safely and never route ordinary readers into a
assert.deepEqual(settingsRoute('#admin/scraper/sources', true), { id: 'admin/scraper', tab: 'sources' });
assert.equal(settingsRoute('#admin/scraper/unknown', true).tab, 'activity');
});
test('reading-hours rows include overnight carry from the previous day', () => {
const schedule = { days: [
[['08:00', '01:00']], [['07:00', '24:00']], [], [], [], [], [['08:00', '01:00']],
] };
assert.equal(readingDayText(schedule, 0), '00:00–01:00 (from Saturday) · 08:00–01:00 (next day)');
assert.equal(readingDayText(schedule, 1), '00:00–01:00 (from Sunday) · 07:00–24:00');
assert.equal(readingDayText(schedule, 2), 'Closed all day');
});