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.
68 lines
2.8 KiB
TypeScript
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');
|
|
});
|
|
});
|
|
});
|