Files
everythingbutwork/apps/api/src/lib/streak.test.ts
T
dejanandClaude Opus 4.8 bcae44eeb3
ci / quality (push) Failing after 38s
ci / build (push) Has been skipped
deploy / deploy (push) Successful in 55s
fix(streak): Feiertage, Wochenend-Edge & Lookback-Deckel
- Feiertage: isWerktag berücksichtigt jetzt die 9 bundesweiten gesetzlichen
  Feiertage (Oster-Computus + feste Tage) → ein Feiertag bricht die Streak
  nicht mehr (zählt wie ein Wochenende neutral). Landesspezifische Feiertage
  bewusst (noch) nicht enthalten.
- Wochenend-Edge: Reflexion an Sa/So setzte die angezeigte Streak auf 0
  (Schleife brach am Nicht-Werktag ab). Jetzt wird übersprungen statt gebrochen.
- Lookback von 120 auf 400 Tage erhöht, damit lange Streaks nicht
  abgeschnitten werden.
- Streak-Zähllogik in reine, getestete countStreakDays() ausgelagert
  (8 Streak- + 5 Feiertags-Tests).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 15:42:25 +02:00

88 lines
2.3 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { countStreakDays } from './streak.js';
const S = (...d: string[]) => new Set(d);
const NONE = new Set<string>();
describe('countStreakDays', () => {
it('zählt aufeinanderfolgende volle Werktage', () => {
// Mi/Di/Mo voll, heute Mi
expect(
countStreakDays({
today: '2026-06-10',
fullDates: S('2026-06-10', '2026-06-09', '2026-06-08'),
absenceDates: NONE,
}),
).toBe(3);
});
it('heute noch nicht reflektiert → Schonfrist (zählt ab gestern)', () => {
expect(
countStreakDays({
today: '2026-06-10',
fullDates: S('2026-06-09', '2026-06-08'),
absenceDates: NONE,
}),
).toBe(2);
});
it('bricht bei einem ausgelassenen Werktag', () => {
// 06-09 fehlt
expect(
countStreakDays({
today: '2026-06-10',
fullDates: S('2026-06-10', '2026-06-08'),
absenceDates: NONE,
}),
).toBe(1);
});
it('Wochenende ist neutral (Fr + Mo zählt durch)', () => {
// heute Mo 06-08, Fr 06-05 voll; 06-04 (Do) fehlt → 2
expect(
countStreakDays({
today: '2026-06-08',
fullDates: S('2026-06-08', '2026-06-05'),
absenceDates: NONE,
}),
).toBe(2);
});
it('Abwesenheit ist neutral (überspringen, nicht brechen)', () => {
// heute Mi 06-10 voll, Di 06-09 Urlaub, Mo 06-08 voll
expect(
countStreakDays({
today: '2026-06-10',
fullDates: S('2026-06-10', '2026-06-08'),
absenceDates: S('2026-06-09'),
}),
).toBe(2);
});
it('Feiertag bricht die Streak NICHT (Pfingstmontag 25.05.2026)', () => {
// heute Mi 05-27, Di 05-26 voll, Mo 05-25 Pfingstmontag, Fr 05-22 voll
expect(
countStreakDays({
today: '2026-05-27',
fullDates: S('2026-05-27', '2026-05-26', '2026-05-22'),
absenceDates: NONE,
}),
).toBe(3);
});
it('Reflexion am Wochenende zählt nicht zu 0 (zählt Freitag)', () => {
// heute Sa 06-06, voll am Sa + Fr 06-05; früher nichts
expect(
countStreakDays({
today: '2026-06-06',
fullDates: S('2026-06-06', '2026-06-05'),
absenceDates: NONE,
}),
).toBe(1);
});
it('leere Historie → 0', () => {
expect(countStreakDays({ today: '2026-06-10', fullDates: NONE, absenceDates: NONE })).toBe(0);
});
});