test(setup): cover operator pack automation flow

This commit is contained in:
William Valentin
2026-02-16 15:00:09 -08:00
parent 3210e75c94
commit 3a9be91f1d
2 changed files with 95 additions and 2 deletions
+3 -2
View File
@@ -197,6 +197,7 @@
"files_modified": [
"src/cli/setup/config.ts",
"src/cli/setup/config.test.ts",
"src/cli/setup/automation.test.ts",
"src/cli/setup/automation.ts",
"src/automation/heartbeat.ts",
"src/automation/heartbeat.test.ts",
@@ -208,7 +209,7 @@
"README.md",
"docs/plans/state.json"
],
"test_status": "pnpm test:run src/cli/setup/config.test.ts src/automation/heartbeat.test.ts src/config/schema.test.ts src/cli/doctor.test.ts + pnpm typecheck passing"
"test_status": "pnpm test:run src/cli/setup/automation.test.ts src/cli/setup/config.test.ts src/automation/heartbeat.test.ts src/config/schema.test.ts src/cli/doctor.test.ts + pnpm typecheck passing"
},
"backup-session-summary-audit-trail": {
"status": "completed",
@@ -3494,7 +3495,7 @@
}
},
"overall_progress": {
"total_test_count": 1863,
"total_test_count": 1865,
"all_tests_passing": true,
"p0_completion": "3/3 (100%)",
"p1_completion": "4/4 (100%)",
+92
View File
@@ -0,0 +1,92 @@
import { describe, it, expect } from 'vitest';
import { setupAutomation } from './automation.js';
import { ConfigBuilder } from './config.js';
import type { Prompter } from './prompts.js';
function makePrompter(answers: {
confirms?: boolean[];
asks?: string[];
}): Prompter {
const confirms = [...(answers.confirms ?? [])];
const asks = [...(answers.asks ?? [])];
return {
ask: async (_question: string, defaultValue?: string) => {
if (asks.length > 0) {
return asks.shift() ?? '';
}
return defaultValue ?? '';
},
confirm: async (_question: string, defaultYes?: boolean) => {
if (confirms.length > 0) {
return confirms.shift() ?? false;
}
return defaultYes ?? false;
},
choose: async <T = string>(_question: string, options: Array<{ value: T }>) => options[0].value,
password: async () => '',
println: () => {},
};
}
describe('setupAutomation', () => {
it('applies operator pack defaults when enabled', async () => {
const builder = new ConfigBuilder();
builder.setTelegram('123:ABC', [987654321]);
const p = makePrompter({
confirms: [
true, // enable operator pack
true, // include minio sync
false, // enable cron scheduler
false, // enable webhook receiver
false, // configure google services
],
asks: [
'0 3 * * *', // backup schedule
'0 7 * * 1-5', // daily briefing schedule
],
});
await setupAutomation(p, builder);
const config = builder.build() as Record<string, unknown>;
const backup = config.backup as Record<string, unknown>;
const automation = config.automation as Record<string, unknown>;
const heartbeat = automation.heartbeat as Record<string, unknown>;
const briefing = automation.daily_briefing as Record<string, unknown>;
const minioSync = automation.minio_sync as Record<string, unknown>;
expect(backup.enabled).toBe(true);
expect(backup.schedule).toBe('0 3 * * *');
expect(heartbeat.enabled).toBe(true);
expect(heartbeat.notify_cooldown).toBe('30m');
expect(briefing.enabled).toBe(true);
expect(briefing.schedule).toBe('0 7 * * 1-5');
expect(minioSync.enabled).toBe(true);
});
it('leaves operator pack disabled when not selected', async () => {
const builder = new ConfigBuilder();
const p = makePrompter({
confirms: [
false, // enable operator pack
false, // enable cron scheduler
false, // enable webhook receiver
false, // configure google services
],
});
await setupAutomation(p, builder);
const config = builder.build() as Record<string, unknown>;
const backup = config.backup as Record<string, unknown> | undefined;
const automation = config.automation as Record<string, unknown> | undefined;
expect(backup).toBeUndefined();
expect(automation?.daily_briefing).toBeUndefined();
expect(automation?.heartbeat).toBeUndefined();
expect(automation?.minio_sync).toBeUndefined();
});
});