49 lines
2.3 KiB
JavaScript
49 lines
2.3 KiB
JavaScript
|
|
'use strict';
|
||
|
|
|
||
|
|
// BM3 — the reminder notifier used a hard-coded 3-day early reminder and never
|
||
|
|
// read the bill's reminder_days_before, so the "Reminder days before" control
|
||
|
|
// was a no-op. These tests pin the now-honored per-bill lead time (pure logic,
|
||
|
|
// no clock/senders) and the dynamic email wording.
|
||
|
|
const test = require('node:test');
|
||
|
|
const assert = require('node:assert/strict');
|
||
|
|
|
||
|
|
const { _reminders, _email } = require('../services/notificationService');
|
||
|
|
const { reminderTypeFor, leadDaysOf, TYPE_META } = _reminders;
|
||
|
|
|
||
|
|
test('leadDaysOf defaults to 3 and honors an integer reminder_days_before', () => {
|
||
|
|
assert.equal(leadDaysOf({}), 3);
|
||
|
|
assert.equal(leadDaysOf({ reminder_days_before: null }), 3);
|
||
|
|
assert.equal(leadDaysOf({ reminder_days_before: 7 }), 7);
|
||
|
|
assert.equal(leadDaysOf({ reminder_days_before: 0 }), 0);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('a 7-day lead fires the early reminder at 7 days out, NOT at 3', () => {
|
||
|
|
const bill = { reminder_days_before: 7 };
|
||
|
|
assert.equal(reminderTypeFor(bill, 7), 'due_3d', 'early reminder at the chosen lead');
|
||
|
|
assert.equal(reminderTypeFor(bill, 3), null, 'no reminder at the old fixed 3 days');
|
||
|
|
});
|
||
|
|
|
||
|
|
test('default (no reminder_days_before) still fires at 3 days — backwards compatible', () => {
|
||
|
|
assert.equal(reminderTypeFor({}, 3), 'due_3d');
|
||
|
|
assert.equal(reminderTypeFor({}, 5), null);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('1-day and same-day reminders are unaffected and never double up with a small lead', () => {
|
||
|
|
// lead of 1 → the early reminder is suppressed (due_1d covers it)
|
||
|
|
assert.equal(reminderTypeFor({ reminder_days_before: 1 }, 1), 'due_1d');
|
||
|
|
// lead of 0 → due_today covers it
|
||
|
|
assert.equal(reminderTypeFor({ reminder_days_before: 0 }, 0), 'due_today');
|
||
|
|
// generic day/overdue selection
|
||
|
|
assert.equal(reminderTypeFor({ reminder_days_before: 5 }, 1), 'due_1d');
|
||
|
|
assert.equal(reminderTypeFor({ reminder_days_before: 5 }, 0), 'due_today');
|
||
|
|
assert.equal(reminderTypeFor({ reminder_days_before: 5 }, -2), 'overdue');
|
||
|
|
assert.equal(reminderTypeFor({ reminder_days_before: 5 }, 4), null);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('email subject + body reflect the actual lead days', () => {
|
||
|
|
const bill = { name: 'Insurance', expected_amount: 12000, reminder_days_before: 7 };
|
||
|
|
assert.match(TYPE_META.due_3d.subject(bill), /due in 7 days/);
|
||
|
|
const html = _email.buildEmailHtml(bill, 'due_3d', '2026-07-10');
|
||
|
|
assert.match(html, /is due in 7 days/);
|
||
|
|
});
|