/** * Durability cron generators (v0.42.44, D2 + D12): pure-string renderers. * Asserts the cron is DB-free (gbrain sources pull --path, NOT `pull `), * secret-free, self-disabling, and that the launchd plist is periodic. */ import { describe, test, expect } from 'bun:test'; import { renderCronWrapper, generateBrainPullPlist } from '../src/core/brain-repo-durability.ts'; const TOKEN = 'ghp_SHOULD_NEVER_APPEAR'; describe('renderCronWrapper (D2 DB-free)', () => { const w = renderCronWrapper('wiki', '/data/clones/wiki', 'main', '/usr/local/bin/gbrain', '/home/u/.gbrain/brain-push.log'); test('calls the DB-free path command, not the engine-opening one', () => { expect(w).toContain("sources pull --path '/data/clones/wiki'"); expect(w).toContain("--branch 'main'"); expect(w).not.toMatch(/sources pull '?wiki'?(\s|$)/); // never `sources pull wiki` }); test('self-disables when the captured checkout is gone', () => { expect(w).toContain("if [ ! -d '/data/clones/wiki/.git' ]"); expect(w).toContain('path gone, skipping'); }); test('sources the shell profile (secret-free) and never bakes a token', () => { expect(w).toContain('source ~/.zshenv'); expect(w.includes(TOKEN)).toBe(false); }); }); describe('generateBrainPullPlist (D12 launchd)', () => { const plist = generateBrainPullPlist('com.gbrain.brain-pull.wiki', '/home/u/.gbrain/brain-pull-wiki.sh', '/home/u', 1800); test('is periodic (StartInterval), not a KeepAlive daemon', () => { expect(plist).toContain('StartInterval1800'); expect(plist).not.toContain('KeepAlive'); }); test('carries the per-source label and the wrapper path only (no secret)', () => { expect(plist).toContain('com.gbrain.brain-pull.wiki'); expect(plist).toContain('/home/u/.gbrain/brain-pull-wiki.sh'); expect(plist.includes(TOKEN)).toBe(false); }); });