397777089e
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
40 lines
2.1 KiB
JavaScript
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('');
|
|
});
|
|
});
|