clawdie-ai/setup/secrets.test.ts
Operator & Codex 6de0ed87ab Remove legacy Mevy references (Sam & Codex)
Sweep active code, tests, identity files, public docs, CMS seed content, and stale handoffs so old assistant-name fixtures no longer leak into current Clawdie/system-namespace behavior. Keep the skills-memory SQL artifact unchanged per regeneration policy.

---

Build: pass

Tests: pass — 2197 passed (164 files)

---
Build: pass | Tests: pass — 2197 passed (650 files)
2026-05-07 11:16:40 +02:00

100 lines
3.8 KiB
TypeScript

import fs from 'fs';
import path from 'path';
import { describe, expect, it } from 'vitest';
import { ensureSplitBrainSecrets } from './secrets.js';
function mkTemp(prefix: string): string {
const base = path.join(process.cwd(), 'tmp', 'tests');
fs.mkdirSync(base, { recursive: true });
return fs.mkdtempSync(path.join(base, prefix));
}
describe('split-brain secret sync', () => {
it('generates passwords and derived DB URLs from agent identity', () => {
const priorDbHost = process.env.DB_HOST;
const priorDbRuntime = process.env.DB_RUNTIME;
const priorWardenDbIp = process.env.WARDEN_DB_IP;
delete process.env.DB_HOST;
delete process.env.DB_RUNTIME;
delete process.env.WARDEN_DB_IP;
const projectRoot = mkTemp('clawdie-secrets-');
fs.writeFileSync(
path.join(projectRoot, '.env'),
['TENANT_ID=alpha', 'WARDEN_SUBNET_BASE=10.0.0', ''].join('\n'),
);
try {
const secrets = ensureSplitBrainSecrets(projectRoot);
const envContent = fs.readFileSync(
path.join(projectRoot, '.env'),
'utf-8',
);
expect(secrets.skillsDbUser).toBe('alpha_reader');
expect(secrets.memoryDbUser).toBe('alpha_brain');
expect(secrets.skillsDbName).toBe('alpha_skills');
expect(secrets.memoryDbName).toBe('alpha_brain');
expect(secrets.forgejoDbUser).toBe('alpha_forgejo');
expect(secrets.forgejoDbName).toBe('alpha_forgejo');
expect(envContent).toMatch(/^POSTGRES_ADMIN_PASSWORD=.+$/m);
expect(envContent).toMatch(/^SKILLS_DB_PASSWORD=.+$/m);
expect(envContent).toMatch(/^MEMORY_DB_PASSWORD=.+$/m);
expect(envContent).toMatch(/^FORGEJO_DB_PASSWORD=.+$/m);
expect(secrets.dbHost).toBe('10.0.0.5');
expect(envContent).toContain('@10.0.0.5:5432/alpha_skills');
expect(envContent).toContain('@10.0.0.5:5432/alpha_brain');
expect(envContent).toContain('@10.0.0.5:5432/alpha_forgejo');
} finally {
if (priorDbHost === undefined) delete process.env.DB_HOST;
else process.env.DB_HOST = priorDbHost;
if (priorDbRuntime === undefined) delete process.env.DB_RUNTIME;
else process.env.DB_RUNTIME = priorDbRuntime;
if (priorWardenDbIp === undefined) delete process.env.WARDEN_DB_IP;
else process.env.WARDEN_DB_IP = priorWardenDbIp;
}
});
it('preserves existing passwords on rerun', () => {
const projectRoot = mkTemp('clawdie-secrets-');
fs.writeFileSync(
path.join(projectRoot, '.env'),
[
'TENANT_ID=clawdie',
'WARDEN_SUBNET_BASE=10.0.0',
'POSTGRES_ADMIN_PASSWORD=keep-admin',
'SKILLS_DB_PASSWORD=keep-skills',
'MEMORY_DB_PASSWORD=keep-memory',
'FORGEJO_DB_PASSWORD=keep-forgejo',
'STRAPI_DB_PASSWORD=keep-strapi',
].join('\n') + '\n',
);
const secrets = ensureSplitBrainSecrets(projectRoot);
expect(secrets.postgresAdminPassword).toBe('keep-admin');
expect(secrets.skillsDbPassword).toBe('keep-skills');
expect(secrets.memoryDbPassword).toBe('keep-memory');
expect(secrets.forgejoDbPassword).toBe('keep-forgejo');
expect(secrets.strapiDbPassword).toBe('keep-strapi');
});
it('derives PostgreSQL-safe identifiers from hyphenated agent names', () => {
const projectRoot = mkTemp('clawdie-secrets-');
fs.writeFileSync(
path.join(projectRoot, '.env'),
'TENANT_ID=clawdie-ai\nWARDEN_SUBNET_BASE=192.168.100\n',
);
const secrets = ensureSplitBrainSecrets(projectRoot);
expect(secrets.skillsDbUser).toBe('clawdie_ai_reader');
expect(secrets.skillsDbName).toBe('clawdie_ai_skills');
expect(secrets.memoryDbUser).toBe('clawdie_ai_brain');
expect(secrets.memoryDbName).toBe('clawdie_ai_brain');
expect(secrets.forgejoDbUser).toBe('clawdie_ai_forgejo');
expect(secrets.forgejoDbName).toBe('clawdie_ai_forgejo');
});
});