import { parseBrainConfig, resolveConfig } from './brain-config.mjs'; describe('parseBrainConfig', () => { it('читает YAML-frontmatter ключи', () => { const md = '---\nconfig_version: 1\nregistry_path: docs/registry/nodes.yaml\nnormative_files:\n - docs/Pravila_raboty_Claude_v1_1.md\n---\nтело'; const c = parseBrainConfig(md); expect(c.config_version).toBe(1); expect(c.registry_path).toBe('docs/registry/nodes.yaml'); expect(c.normative_files).toEqual(['docs/Pravila_raboty_Claude_v1_1.md']); }); it('читает список из нескольких элементов', () => { const md = '---\nnormative_files:\n - a.md\n - b.md\n - c.md\n---'; expect(parseBrainConfig(md).normative_files).toEqual(['a.md', 'b.md', 'c.md']); }); it('нет файла/пусто → пустой объект (дефолты применит resolveConfig)', () => { expect(parseBrainConfig('')).toEqual({}); expect(parseBrainConfig(null)).toEqual({}); }); it('текст без frontmatter → пустой объект', () => { expect(parseBrainConfig('тело без разделителей')).toEqual({}); }); }); describe('resolveConfig fail-safe (§D3)', () => { it('state_dir отсутствует → безопасный дефолт', () => { expect(resolveConfig({}).state_dir).toBe('.claude/brain-state'); }); it('evidence_archive отсутствует → безопасный дефолт', () => { expect(resolveConfig({}).evidence_archive).toBe('brain-state'); }); it('project_url_whitelist пуст → fail-closed маркер (внешка закрыта)', () => { const r = resolveConfig({}); expect(r.project_url_whitelist).toEqual([]); expect(r.project_url_whitelist_failClosed).toBe(true); }); it('project_url_whitelist непуст → fail-closed снят', () => { const r = resolveConfig({ project_url_whitelist: ['liderra.ru'] }); expect(r.project_url_whitelist).toEqual(['liderra.ru']); expect(r.project_url_whitelist_failClosed).toBe(false); }); it('normative_files пуст → [] (legitimate)', () => { expect(resolveConfig({}).normative_files).toEqual([]); }); it('registry_path пуст → пустая строка (зависимости off осознанно)', () => { expect(resolveConfig({}).registry_path).toBe(''); }); it('classifier_context пуст → generic-строка', () => { expect(resolveConfig({}).classifier_context).toMatch(/generic|общий/i); }); it('economy_default пуст → дефолт 100', () => { expect(resolveConfig({}).economy_default).toBe('100'); }); it('переданные значения переживают resolveConfig', () => { const r = resolveConfig({ state_dir: 'docs/observer', registry_path: 'docs/registry/nodes.yaml' }); expect(r.state_dir).toBe('docs/observer'); expect(r.registry_path).toBe('docs/registry/nodes.yaml'); }); }); describe('resolveConfig protected_paths (Task 4 security, §D1/§D2)', () => { it('отсутствует → [] (fail-CLOSED augment пуст = база защищает полностью)', () => { expect(resolveConfig({}).protected_paths).toEqual([]); }); it('список пробрасывается как есть', () => { expect(resolveConfig({ protected_paths: ['secrets/keys'] }).protected_paths) .toEqual(['secrets/keys']); }); }); import { resolveStateDir } from './brain-config.mjs'; describe('resolveStateDir fail-safe (§D2)', () => { it('непустая строка → как есть, без fallback', () => { expect(resolveStateDir('docs/observer')).toEqual({ stateDir: 'docs/observer', warnedFallback: false }); }); it('пусто / пробелы → безопасный дефолт + warnedFallback', () => { expect(resolveStateDir('')).toEqual({ stateDir: '.claude/brain-state', warnedFallback: true }); expect(resolveStateDir(' ')).toEqual({ stateDir: '.claude/brain-state', warnedFallback: true }); }); it('не-строка → безопасный дефолт + warnedFallback (не падает)', () => { expect(resolveStateDir(null)).toEqual({ stateDir: '.claude/brain-state', warnedFallback: true }); expect(resolveStateDir(undefined)).toEqual({ stateDir: '.claude/brain-state', warnedFallback: true }); }); });