Files
brain/tools/arbitration-card.test.mjs
T

40 lines
2.1 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import { buildArbitrationCard, ARBITRATION_OPTIONS } from './arbitration-card.mjs';
describe('buildArbitrationCard', () => {
const base = {
side: 'mentor',
level: 'L1',
round: 3,
objectionVerbatim: 'Шаг 2 склеен: чтение и правка в одном пункте — разбей.',
controllerPositionVerbatim: 'Не согласен: шаг 2 атомарен, чтение нужно ровно для этой правки.',
};
it('цитаты переданы ДОСЛОВНО (без перефраза)', () => {
const c = buildArbitrationCard(base);
expect(c.objection).toBe(base.objectionVerbatim);
expect(c.position).toBe(base.controllerPositionVerbatim);
});
it('три варианта выбора в фиксированном порядке', () => {
const c = buildArbitrationCard(base);
expect(c.options.map((o) => o.key)).toEqual(['hold', 'accept', 'own']);
expect(ARBITRATION_OPTIONS).toEqual(['hold', 'accept', 'own']);
});
it('каждый вариант несёт нейтральную строку «что меняет выбор»', () => {
const c = buildArbitrationCard(base);
for (const o of c.options) expect(typeof o.whatChanges === 'string' && o.whatChanges.length > 0).toBe(true);
});
it('есть аффорданс «объясни подробнее»', () => {
expect(buildArbitrationCard(base).explainAffordance).toBe(true);
});
it('сторона судьи меняет заголовок, не ломает форму', () => {
const c = buildArbitrationCard({ ...base, side: 'judge', level: 'L2' });
expect(c.title).toMatch(/судь/i);
expect(c.options.map((o) => o.key)).toEqual(['hold', 'accept', 'own']);
});
it('пустые/нестроковые цитаты не роняют (fail-safe → пустая строка)', () => {
const c = buildArbitrationCard({ ...base, objectionVerbatim: null, controllerPositionVerbatim: undefined });
expect(c.objection).toBe('');
expect(c.position).toBe('');
});
});