dorfteich/apps/backup/src/mail.test.ts
Claude Fable 5 8dbff86537
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
Add backup sidecar: nightly dump, volume archive, prune, status, restore (#83)
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
2026-07-11 17:29:15 +02:00

31 lines
1.2 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { renderFailureMail } from './mail.js';
const input = {
backupId: '20260711-030000',
error: 'pg_dump failed: connection refused',
lastSuccessAt: '2026-07-10T03:00:12.000Z',
};
describe('renderFailureMail', () => {
it('renders the English alert with all details interpolated', () => {
const mail = renderFailureMail(input, 'en', 'dorfteich-test');
expect(mail.subject).toBe('[dorfteich-test] Backup failed (20260711-030000)');
expect(mail.text).toContain('Backup id: 20260711-030000');
expect(mail.text).toContain('Error: pg_dump failed: connection refused');
expect(mail.text).toContain('Last successful backup: 2026-07-10T03:00:12.000Z');
});
it('renders the German alert', () => {
const mail = renderFailureMail(input, 'de', 'dorfteich-test');
expect(mail.subject).toBe('[dorfteich-test] Backup fehlgeschlagen (20260711-030000)');
expect(mail.text).toContain('Fehler: pg_dump failed: connection refused');
});
it('states when no backup ever succeeded', () => {
const mail = renderFailureMail({ ...input, lastSuccessAt: null }, 'en', 'Dorfteich');
expect(mail.text).toContain('Last successful backup: none yet');
});
});