41 lines
1.5 KiB
TypeScript
41 lines
1.5 KiB
TypeScript
import assert from 'node:assert/strict';
|
|||
|
|
import { test } from 'node:test';
|
||
|
|
import { isSnoozeActive, nextTimeAtHour, SNOOZE_INDEFINITE } from './snooze';
|
||
|
|
|
||
|
|
test('isSnoozeActive: future instant is active, past/zero is not', () => {
|
||
|
|
const now = 1_000_000;
|
||
|
|
assert.equal(isSnoozeActive(now + 1, now), true);
|
||
|
|
assert.equal(isSnoozeActive(now, now), false);
|
||
|
|
assert.equal(isSnoozeActive(now - 1, now), false);
|
||
|
|
assert.equal(isSnoozeActive(0, now), false);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('isSnoozeActive: SNOOZE_INDEFINITE stays active far into the future', () => {
|
||
|
|
const farFuture = Date.UTC(2100, 0, 1);
|
||
|
|
assert.equal(isSnoozeActive(SNOOZE_INDEFINITE, farFuture), true);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('nextTimeAtHour: picks today when the hour is still ahead', () => {
|
||
|
|
const now = new Date(2026, 0, 5, 6, 30).getTime(); // 06:30 local
|
||
|
|
const target = nextTimeAtHour(8, now);
|
||
|
|
const d = new Date(target);
|
||
|
|
assert.equal(d.getHours(), 8);
|
||
|
|
assert.equal(d.getMinutes(), 0);
|
||
|
|
assert.equal(d.getDate(), 5); // still today
|
||
|
|
assert.ok(target > now);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('nextTimeAtHour: rolls to tomorrow when the hour has passed', () => {
|
||
|
|
const now = new Date(2026, 0, 5, 9, 0).getTime(); // 09:00 local, past 08:00
|
||
|
|
const target = nextTimeAtHour(8, now);
|
||
|
|
const d = new Date(target);
|
||
|
|
assert.equal(d.getHours(), 8);
|
||
|
|
assert.equal(d.getDate(), 6); // tomorrow
|
||
|
|
});
|
||
|
|
|
||
|
|
test('nextTimeAtHour: exactly at the hour rolls to tomorrow (soonest future)', () => {
|
||
|
|
const now = new Date(2026, 0, 5, 8, 0).getTime(); // exactly 08:00
|
||
|
|
const target = nextTimeAtHour(8, now);
|
||
|
|
assert.equal(new Date(target).getDate(), 6);
|
||
|
|
});
|