Files
brain/tools/brain-config.test.mjs
T

70 lines
2.9 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');
});
});