All checks were successful
CI / Lint, typecheck, test (push) Successful in 3m9s
CI / Build container images (push) Has been skipped
CD / Build and push images (push) Successful in 3m47s
CD / Deploy to Test (push) Successful in 8s
CD / Smoke tests against Test (push) Successful in 1m10s
CD / Promote to Int (push) Successful in 9s
CI / Auth e2e pack (push) Successful in 5m25s
CI / Import/export fidelity gate (push) Successful in 45s
New apps/backup service (ADR 0015): nightly pg_dump -Fc plus one tar of the uploads/plugins volumes as a consistent restore set on a new backups volume, retention prune that never removes the newest complete set, atomic status.json for the readiness/admin consumers (#85/#86), and a failure mail sent directly via nodemailer (the api may be the broken part) with de/en texts in the shared mails catalog. BACKUP_RUN_ONCE=1 gives the on-demand path; deploy/backup/restore.sh automates the documented restore runbook. The pure secret-store helpers moved to @dorfteich/shared so the sidecar resolves the wizard-written SMTP relay exactly like the api. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EwZ4jR4KFAPvpjWevfUGX1
23 lines
831 B
TypeScript
23 lines
831 B
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import { msUntilNext } from './scheduler.js';
|
|
|
|
// msUntilNext works in local time (the container's TZ); the tests build
|
|
// their expectations with local-time Dates, so they hold in any zone.
|
|
describe('msUntilNext', () => {
|
|
it('targets today when the time is still ahead', () => {
|
|
const now = new Date(2026, 6, 11, 1, 30, 0);
|
|
expect(msUntilNext(now, '03:00')).toBe(90 * 60 * 1000);
|
|
});
|
|
|
|
it('targets tomorrow when the time has passed', () => {
|
|
const now = new Date(2026, 6, 11, 3, 0, 1);
|
|
expect(msUntilNext(now, '03:00')).toBe(24 * 60 * 60 * 1000 - 1000);
|
|
});
|
|
|
|
it('an exact hit schedules a full day ahead (never a zero delay)', () => {
|
|
const now = new Date(2026, 6, 11, 3, 0, 0);
|
|
expect(msUntilNext(now, '03:00')).toBe(24 * 60 * 60 * 1000);
|
|
});
|
|
});
|