Closer/functions/dist/notifications/quietHours.test.js

60 lines
4.2 KiB
JavaScript
Raw Normal View History

"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