diff --git a/js/data.js b/js/data.js index 37045ff..56337ba 100644 --- a/js/data.js +++ b/js/data.js @@ -1,3 +1,9 @@ +function parseSettings(raw) { + const n = raw?.moderatorsPerDay; + const valid = Number.isInteger(n) && n >= 1 && n <= 5; + return { moderatorsPerDay: valid ? n : 1 }; +} + export function loadFromJSON(json) { let parsed; try { @@ -16,7 +22,8 @@ export function loadFromJSON(json) { companyClosures: Array.isArray(parsed.calendar.companyClosures) ? parsed.calendar.companyClosures : [] } : { holidays: [], companyClosures: [] }, - history: Array.isArray(parsed.history) ? parsed.history : [] + history: Array.isArray(parsed.history) ? parsed.history : [], + settings: parseSettings(parsed.settings) }; } @@ -24,7 +31,8 @@ export function saveToJSON(state) { return JSON.stringify({ employees: state.employees, calendar: state.calendar, - history: state.history + history: state.history, + settings: state.settings }, null, 2); } diff --git a/tests/data.test.mjs b/tests/data.test.mjs index b3aede8..13d6404 100644 --- a/tests/data.test.mjs +++ b/tests/data.test.mjs @@ -1,5 +1,5 @@ import assert from 'node:assert/strict'; -import { addHistoryEntries, removeHistoryEntry } from '../js/data.js'; +import { addHistoryEntries, removeHistoryEntry, loadFromJSON, saveToJSON } from '../js/data.js'; function makeState(history = []) { return { @@ -76,4 +76,51 @@ function makeState(history = []) { assert.equal(state.history.length, 1, 'no change when employeeId not found'); } +// loadFromJSON: missing settings → default {moderatorsPerDay: 1} +{ + const json = JSON.stringify({ + employees: [], + calendar: { holidays: [], companyClosures: [] }, + history: [] + }); + const loaded = loadFromJSON(json); + assert.deepEqual(loaded.settings, { moderatorsPerDay: 1 }, 'default settings when missing'); +} + +// loadFromJSON: present settings preserved, moderatorsPerDay clamped to [1,5] +{ + const json = JSON.stringify({ + employees: [], calendar: { holidays: [], companyClosures: [] }, history: [], + settings: { moderatorsPerDay: 3 } + }); + const loaded = loadFromJSON(json); + assert.equal(loaded.settings.moderatorsPerDay, 3, 'preserved value'); +} + +// loadFromJSON: invalid moderatorsPerDay (string, out of range) → fallback to 1 +{ + const tooHigh = loadFromJSON(JSON.stringify({ + employees: [], calendar: { holidays: [], companyClosures: [] }, history: [], + settings: { moderatorsPerDay: 99 } + })); + assert.equal(tooHigh.settings.moderatorsPerDay, 1, 'out of range falls back to 1'); + + const wrongType = loadFromJSON(JSON.stringify({ + employees: [], calendar: { holidays: [], companyClosures: [] }, history: [], + settings: { moderatorsPerDay: 'two' } + })); + assert.equal(wrongType.settings.moderatorsPerDay, 1, 'wrong type falls back to 1'); +} + +// saveToJSON: settings are serialized +{ + const state = { + employees: [], calendar: { holidays: [], companyClosures: [] }, history: [], + settings: { moderatorsPerDay: 2 } + }; + const json = saveToJSON(state); + const parsed = JSON.parse(json); + assert.deepEqual(parsed.settings, { moderatorsPerDay: 2 }, 'settings round-trip'); +} + console.log('All data tests passed.');