"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const quietHours_1 = require("./quietHours"); // recipientInQuietHours is a pure function (Intl + plain userData), so no firebase-admin mock is needed. // All times below are expressed in UTC and the userData timezone is 'UTC' for determinism. Minutes: // 22:00 = 1320, 08:00 = 480, 10:00 = 600, 12:00 = 720. const at = (iso) => new Date(`2026-01-15T${iso}:00Z`); describe('recipientInQuietHours', () => { describe('fail-open guards', () => { it('returns false when quiet hours is not explicitly enabled', () => { expect((0, quietHours_1.recipientInQuietHours)(undefined, at('23:30'))).toBe(false); expect((0, quietHours_1.recipientInQuietHours)({}, at('23:30'))).toBe(false); expect((0, quietHours_1.recipientInQuietHours)({ quietHoursStartMinutes: 1320, quietHoursEndMinutes: 480, timezone: 'UTC' }, at('23:30'))).toBe(false); }); it('returns false when window or timezone fields are missing/malformed', () => { const base = { quietHoursEnabled: true, timezone: 'UTC' }; expect((0, quietHours_1.recipientInQuietHours)(Object.assign(Object.assign({}, base), { quietHoursEndMinutes: 480 }), at('23:30'))).toBe(false); expect((0, quietHours_1.recipientInQuietHours)(Object.assign(Object.assign({}, base), { quietHoursStartMinutes: 1320 }), at('23:30'))).toBe(false); expect((0, quietHours_1.recipientInQuietHours)({ quietHoursEnabled: true, quietHoursStartMinutes: 1320, quietHoursEndMinutes: 480 }, at('23:30'))).toBe(false); }); it('returns false for an unknown timezone id', () => { expect((0, quietHours_1.recipientInQuietHours)({ quietHoursEnabled: true, quietHoursStartMinutes: 1320, quietHoursEndMinutes: 480, timezone: 'Not/AZone' }, at('23:30'))).toBe(false); }); }); describe('overnight window (22:00 → 08:00)', () => { const qh = { quietHoursEnabled: true, quietHoursStartMinutes: 1320, quietHoursEndMinutes: 480, timezone: 'UTC' }; it('suppresses inside the window, including both boundaries', () => { expect((0, quietHours_1.recipientInQuietHours)(qh, at('23:30'))).toBe(true); expect((0, quietHours_1.recipientInQuietHours)(qh, at('03:00'))).toBe(true); expect((0, quietHours_1.recipientInQuietHours)(qh, at('22:00'))).toBe(true); // start inclusive expect((0, quietHours_1.recipientInQuietHours)(qh, at('08:00'))).toBe(true); // end inclusive }); it('does not suppress outside the window', () => { expect((0, quietHours_1.recipientInQuietHours)(qh, at('08:01'))).toBe(false); expect((0, quietHours_1.recipientInQuietHours)(qh, at('12:00'))).toBe(false); expect((0, quietHours_1.recipientInQuietHours)(qh, at('21:59'))).toBe(false); }); }); describe('same-day window (10:00 → 12:00)', () => { const qh = { quietHoursEnabled: true, quietHoursStartMinutes: 600, quietHoursEndMinutes: 720, timezone: 'UTC' }; it('suppresses inside the window, including both boundaries', () => { expect((0, quietHours_1.recipientInQuietHours)(qh, at('10:30'))).toBe(true); expect((0, quietHours_1.recipientInQuietHours)(qh, at('10:00'))).toBe(true); expect((0, quietHours_1.recipientInQuietHours)(qh, at('12:00'))).toBe(true); }); it('does not suppress outside the window', () => { expect((0, quietHours_1.recipientInQuietHours)(qh, at('09:59'))).toBe(false); expect((0, quietHours_1.recipientInQuietHours)(qh, at('12:01'))).toBe(false); }); }); describe('start == end is "no window"', () => { it('never suppresses (matches the client QuietHoursManager)', () => { const qh = { quietHoursEnabled: true, quietHoursStartMinutes: 1320, quietHoursEndMinutes: 1320, timezone: 'UTC' }; expect((0, quietHours_1.recipientInQuietHours)(qh, at('22:00'))).toBe(false); expect((0, quietHours_1.recipientInQuietHours)(qh, at('03:00'))).toBe(false); expect((0, quietHours_1.recipientInQuietHours)(qh, at('12:00'))).toBe(false); }); }); }); //# sourceMappingURL=quietHours.test.js.map