import assert from 'node:assert/strict'; import { addHistoryEntries, removeHistoryEntry, loadFromJSON, saveToJSON } from '../js/data.js'; function makeState(history = []) { return { employees: [], calendar: { holidays: [], companyClosures: [] }, history: [...history] }; } // addHistoryEntries: two entries with same date but different employees both kept { const state = makeState(); addHistoryEntries(state, [ { date: '2026-04-01', employeeId: 'alice', manual: false }, { date: '2026-04-01', employeeId: 'bob', manual: false } ]); assert.equal(state.history.length, 2, 'two distinct entries kept on same date'); const ids = state.history.map(h => h.employeeId).sort(); assert.deepEqual(ids, ['alice', 'bob'], 'both employees present'); } // addHistoryEntries: same (date, employeeId) replaced, others on same date untouched { const state = makeState([ { date: '2026-04-01', employeeId: 'alice', manual: false }, { date: '2026-04-01', employeeId: 'bob', manual: false } ]); addHistoryEntries(state, [ { date: '2026-04-01', employeeId: 'alice', manual: true } ]); assert.equal(state.history.length, 2, 'still two entries'); const alice = state.history.find(h => h.employeeId === 'alice'); assert.equal(alice.manual, true, 'alice replaced with manual=true'); const bob = state.history.find(h => h.employeeId === 'bob'); assert.equal(bob.manual, false, 'bob untouched'); } // addHistoryEntries: empty input → no change { const state = makeState([{ date: '2026-04-01', employeeId: 'alice', manual: false }]); addHistoryEntries(state, []); assert.equal(state.history.length, 1, 'empty entries → no change'); } // removeHistoryEntry without employeeId: removes all entries on that date { const state = makeState([ { date: '2026-04-01', employeeId: 'alice', manual: false }, { date: '2026-04-01', employeeId: 'bob', manual: false }, { date: '2026-04-02', employeeId: 'alice', manual: false } ]); removeHistoryEntry(state, '2026-04-01'); assert.equal(state.history.length, 1, 'only 2026-04-02 alice remains'); assert.equal(state.history[0].date, '2026-04-02', 'remaining entry is 2026-04-02'); } // removeHistoryEntry with employeeId: removes only that one entry { const state = makeState([ { date: '2026-04-01', employeeId: 'alice', manual: false }, { date: '2026-04-01', employeeId: 'bob', manual: false } ]); removeHistoryEntry(state, '2026-04-01', 'alice'); assert.equal(state.history.length, 1, 'one entry remains'); assert.equal(state.history[0].employeeId, 'bob', 'bob still there'); } // removeHistoryEntry with employeeId that does not exist: no-op { const state = makeState([ { date: '2026-04-01', employeeId: 'alice', manual: false } ]); removeHistoryEntry(state, '2026-04-01', 'nonexistent'); 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.');