Files
perinco-Pulse/server/test/calendar.test.mjs
T
schakal00783andClaude Opus 5.5 b6ba7860bf fix(kalender): Abwesenheiten jahresweise abfragen, Feiertagsnamen
- HRworks /absences erlaubt hoechstens ein Jahr je Aufruf; der Kalender
  reicht weiter und fragt jetzt in Abschnitten von 365 Tagen.
- HRworks liefert zu Feiertagen keinen Namen. Der Name kommt jetzt aus
  dem Datum (feste Feiertage, Ostern-abhaengige, Buss- und Bettag).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 11:41:49 +02:00

64 lines
3.2 KiB
JavaScript

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