← back to AbramsOS
tests/recurrence.test.js
36 lines
const { test } = require('node:test');
const assert = require('node:assert');
const { nextDue, nextDueDays, daysUntil } = require('../lib/recurrence');
test('nextDue advances by cadence', () => {
assert.equal(nextDue('2026-01-15', 'weekly'), '2026-01-22');
assert.equal(nextDue('2026-01-15', 'biweekly'), '2026-01-29');
assert.equal(nextDue('2026-01-15', 'monthly'), '2026-02-15');
assert.equal(nextDue('2026-01-15', 'quarterly'), '2026-04-15');
assert.equal(nextDue('2026-01-15', 'semiannual'), '2026-07-15');
assert.equal(nextDue('2026-01-15', 'annual'), '2027-01-15');
});
test('nextDue returns null for one-off / unknown / missing', () => {
assert.equal(nextDue('2026-01-15', 'once'), null);
assert.equal(nextDue('2026-01-15', 'bogus'), null);
assert.equal(nextDue(null, 'monthly'), null);
});
test('nextDue rolls year boundary', () => {
assert.equal(nextDue('2026-12-20', 'monthly'), '2027-01-20');
});
test('nextDueDays adds N days', () => {
assert.equal(nextDueDays('2026-01-15', 30), '2026-02-14');
assert.equal(nextDueDays('2026-01-15', 0), null);
assert.equal(nextDueDays(null, 30), null);
});
test('daysUntil sign', () => {
const now = new Date('2026-01-15T12:00:00Z');
assert.equal(daysUntil('2026-01-20', now), 5);
assert.equal(daysUntil('2026-01-10', now), -5);
assert.equal(daysUntil('2026-01-15', now), 0);
});