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
31 lines
1.2 KiB
TypeScript
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');
|
|
});
|
|
});
|