ceo-api/src/notifications/quiet-hours.spec.ts
valentinbvro c8b9be585e refactor: extrage quiet hours in functie pura si o acopera cu teste
Aritmetica ferestrei care traverseaza miezul noptii era netestata si prinsa
intr-o metoda privata. Extrasa in quiet-hours.ts cu 10 teste care acopera
fereastra simpla, traversarea miezului noptii si politica de bypass CRITICAL.

Documenteaza explicit ca agregarea nu reevalueaza quiet hours: incrementarea
unui contor pe o notificare deja vizibila nu e o intrerupere noua.
2026-07-29 14:48:04 +02:00

68 lines
2.8 KiB
TypeScript

import { quietHoursDelay } from './quiet-hours';
const at = (hourUtc: number) => new Date(Date.UTC(2026, 6, 29, hourUtc, 30, 0));
describe('quietHoursDelay', () => {
it('livreaza imediat cand userul n-a configurat quiet hours', () => {
expect(
quietHoursDelay({ start: null, end: null, severity: 'INFORMATION', criticalBypasses: true, now: at(3) }),
).toBeNull();
});
it('trateaza start === end ca fiind fara quiet hours, nu ca 24h de liniste', () => {
expect(
quietHoursDelay({ start: 9, end: 9, severity: 'INFORMATION', criticalBypasses: true, now: at(9) }),
).toBeNull();
});
describe('fereastra simpla, in aceeasi zi (9 -> 17)', () => {
it('amana pana la sfarsitul ferestrei cand suntem inauntru', () => {
const result = quietHoursDelay({ start: 9, end: 17, severity: 'INFORMATION', criticalBypasses: true, now: at(13) });
expect(result?.toISOString()).toBe('2026-07-29T17:00:00.000Z');
});
it('livreaza imediat inainte de inceputul ferestrei', () => {
expect(
quietHoursDelay({ start: 9, end: 17, severity: 'INFORMATION', criticalBypasses: true, now: at(8) }),
).toBeNull();
});
it('livreaza imediat exact la ora de sfarsit -- capatul e exclusiv', () => {
expect(
quietHoursDelay({ start: 9, end: 17, severity: 'INFORMATION', criticalBypasses: true, now: at(17) }),
).toBeNull();
});
});
describe('fereastra care traverseaza miezul noptii (22 -> 7)', () => {
it('seara amana pana dimineata ZILEI URMATOARE', () => {
const result = quietHoursDelay({ start: 22, end: 7, severity: 'INFORMATION', criticalBypasses: true, now: at(23) });
expect(result?.toISOString()).toBe('2026-07-30T07:00:00.000Z');
});
it('noaptea tarziu amana pana dimineata ACELEIASI zi', () => {
const result = quietHoursDelay({ start: 22, end: 7, severity: 'INFORMATION', criticalBypasses: true, now: at(3) });
expect(result?.toISOString()).toBe('2026-07-29T07:00:00.000Z');
});
it('la pranz livreaza imediat -- suntem in afara ferestrei', () => {
expect(
quietHoursDelay({ start: 22, end: 7, severity: 'INFORMATION', criticalBypasses: true, now: at(12) }),
).toBeNull();
});
});
describe('CRITICAL', () => {
it('depaseste quiet hours cand politica userului permite', () => {
expect(
quietHoursDelay({ start: 22, end: 7, severity: 'CRITICAL', criticalBypasses: true, now: at(3) }),
).toBeNull();
});
it('respecta quiet hours cand userul a dezactivat bypass-ul', () => {
// Nu presupunem ca "critical" invinge mereu preferinta explicita a userului.
const result = quietHoursDelay({ start: 22, end: 7, severity: 'CRITICAL', criticalBypasses: false, now: at(3) });
expect(result?.toISOString()).toBe('2026-07-29T07:00:00.000Z');
});
});
});