Files
brain/tools/router-exploration.test.mjs
T

34 lines
1.6 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import { DEFAULT_EXPLORATION, tallyUsage, proposeProbe } from './router-exploration.mjs';
describe('DEFAULT_EXPLORATION (по умолчанию ВЫКЛючена)', () => {
it('rate = 0', () => { expect(DEFAULT_EXPLORATION.rate).toBe(0); });
});
describe('tallyUsage (счётчик использования узлов)', () => {
it('инкремент по узлу', () => {
const c = tallyUsage(tallyUsage({}, '#a'), '#a');
expect(c['#a']).toBe(2);
});
});
describe('proposeProbe (#3 — проба = ВОПРОС владельцу, не авто)', () => {
const cands = [{ id: '#a' }, { id: '#b' }, { id: '#c' }];
const usage = { '#a': 100, '#b': 100, '#c': 1 };
it('rate=0 → нет пробы (анти-самоослепление выключено по умолчанию)', () => {
expect(proposeProbe({ rate: 0, usageCounts: usage, candidates: cands })).toBe(null);
});
it('rate>0 → предлагает наименее использованный, requiresOwnerApproval', () => {
const p = proposeProbe({ rate: 0.2, usageCounts: usage, candidates: cands });
expect(p.probe).toBe('#c');
expect(p.requiresOwnerApproval).toBe(true);
expect(typeof p.justification).toBe('string');
expect(typeof p.risk).toBe('string');
});
it('риск-гард: высокорисковый узел не предлагается к пробе', () => {
const riskOf = (id) => id === '#c';
const p = proposeProbe({ rate: 0.2, usageCounts: usage, candidates: cands, riskOf });
expect(p === null || p.probe !== '#c').toBe(true);
});
});