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