Files
brain/tools/brain-config.test.mjs
T
2026-06-15 14:16:14 +03:00

96 lines
4.3 KiB
JavaScript

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 });
});
});