import test from 'node:test'; import assert from 'node:assert/strict'; import { kalenderEintrag } from '../src/lib/calendarSync.js'; import { holidayName } from '../src/lib/hrworks.js'; import { easterSunday, germanHolidayName } from '../src/lib/dates.js'; const tag = (extra = {}) => ({ holiday: false, holiday_name: null, absences: [], sick_leaves: [], regular_hours: 8, available_hours: 0, ...extra }); const meta = new Map([ ['30_1', { type: '1', name: 'Urlaub', status: 'validatedOk' }], ['30_2', { type: '1', name: 'Urlaub', status: 'requested' }], ['30_3', { type: '3', name: 'Elternzeit', status: 'validatedOk' }], ]); const types = ['absence:1']; test('Kalender: nur genehmigter Urlaub der freigegebenen Arten', () => { assert.deepEqual(kalenderEintrag(tag({ absences: ['30_1'] }), meta, types, { 'absence:1': 'Urlaub' }), { kind: 'vacation', label: 'Urlaub', half: false, }); assert.equal(kalenderEintrag(tag({ absences: ['30_2'] }), meta, types), null, 'nur beantragt'); assert.equal(kalenderEintrag(tag({ absences: ['30_3'] }), meta, types), null, 'Art nicht freigegeben'); assert.equal(kalenderEintrag(tag({ absences: ['99_9'] }), meta, types), null, 'unbekannt'); assert.equal(kalenderEintrag(tag(), meta, types), null); }); test('Kalender: Feiertag vor Urlaub, Wochenende ohne Urlaub, halbe Tage', () => { assert.deepEqual(kalenderEintrag(tag({ holiday: true, holiday_name: 'Tag der Deutschen Einheit', absences: ['30_1'] }), meta, types), { kind: 'holiday', label: 'Tag der Deutschen Einheit', half: false, }); assert.equal(kalenderEintrag(tag({ holiday: true, date: '2026-07-14' }), meta, types).label, 'Feiertag'); assert.equal(kalenderEintrag(tag({ holiday: true, date: '2026-10-03' }), meta, types).label, 'Tag der Deutschen Einheit'); assert.equal(kalenderEintrag(tag({ absences: ['30_1'], regular_hours: 0 }), meta, types), null); assert.equal(kalenderEintrag(tag({ absences: ['30_1'], available_hours: 4 }), meta, types).half, true); }); test('Kalender: eine Krankmeldung verraet sich nicht', () => { // Urlaub bleibt stehen, auch wenn an dem Tag eine Krankmeldung haengt ... assert.equal(kalenderEintrag(tag({ absences: ['30_1'], sick_leaves: ['31_9'] }), meta, types).kind, 'vacation'); // ... und Krankheit allein erscheint nie. assert.equal(kalenderEintrag(tag({ sick_leaves: ['31_9'] }), meta, types), null); }); test('Feiertagsname aus unterschiedlichen Formen', () => { assert.equal(holidayName([{ name: 'Neujahr' }]), 'Neujahr'); assert.equal(holidayName(['Karfreitag']), 'Karfreitag'); assert.equal(holidayName([{}]), null); assert.equal(holidayName(undefined), null); }); test('Feiertagsnamen aus dem Datum', () => { assert.equal(easterSunday(2026), '2026-04-05'); assert.equal(easterSunday(2027), '2027-03-28'); assert.equal(germanHolidayName('2026-04-03'), 'Karfreitag'); assert.equal(germanHolidayName('2026-05-14'), 'Christi Himmelfahrt'); assert.equal(germanHolidayName('2026-05-25'), 'Pfingstmontag'); assert.equal(germanHolidayName('2026-06-04'), 'Fronleichnam'); assert.equal(germanHolidayName('2026-11-18'), 'Buß- und Bettag'); assert.equal(germanHolidayName('2026-12-25'), '1. Weihnachtstag'); assert.equal(germanHolidayName('2026-07-14'), null); });