Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
79 lines
4.1 KiB
TypeScript
79 lines
4.1 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
||
import type { StatementOut } from '../../types/api';
|
||
import statementV2Json from './__fixtures__/statement-v2.json';
|
||
import { applyLineMenu, lineMenuItems, showsCodeInput } from './lineMenu';
|
||
import type { LineAction } from './statementDraft';
|
||
import { type GridRow, buildStatementGrid } from './statementGrid';
|
||
|
||
const { rows } = buildStatementGrid(statementV2Json as StatementOut);
|
||
const row = (key: string): GridRow => {
|
||
const found = rows.find((r) => r.key === key);
|
||
if (!found) throw new Error(key);
|
||
return found;
|
||
};
|
||
const keys = (r: GridRow, action?: LineAction) => lineMenuItems(r, action).map((i) => i.key);
|
||
|
||
describe('lineMenuItems', () => {
|
||
it('unreadable / missing — «Это расшифровка»', () => {
|
||
expect(keys(row('l-u7'))).toEqual(['mark_detail']);
|
||
expect(keys(row('l-m8'))).toEqual(['mark_detail']);
|
||
expect(lineMenuItems(row('l-u7'), undefined)[0].label).toBe('Это расшифровка');
|
||
});
|
||
it('detail — «Назначить код»', () => {
|
||
expect(lineMenuItems(row('l-d2'), undefined)).toEqual([{ key: 'assign_code', label: 'Назначить код' }]);
|
||
});
|
||
it('ok с needsReview — смена и подтверждение кода', () => {
|
||
expect(lineMenuItems(row('l-1230'), undefined)).toEqual([
|
||
{ key: 'mark_detail', label: 'Сделать расшифровкой' },
|
||
{ key: 'change_code', label: 'Сменить код' },
|
||
{ key: 'confirm_code', label: 'Подтвердить код' },
|
||
]);
|
||
});
|
||
it('ok подтверждённая — снять подтверждение', () => {
|
||
const confirmed = { ...row('l-1230'), isConfirmed: true };
|
||
expect(lineMenuItems(confirmed, undefined)).toEqual([
|
||
{ key: 'mark_detail', label: 'Сделать расшифровкой' },
|
||
{ key: 'change_code', label: 'Сменить код' },
|
||
{ key: 'unconfirm_code', label: 'Снять подтверждение кода' },
|
||
]);
|
||
});
|
||
it('при действии последним — «Отменить изменение строки»', () => {
|
||
const items = lineMenuItems(row('l-u7'), { kind: 'detail' });
|
||
expect(items.map((i) => i).pop()).toEqual({ key: 'reset', label: 'Отменить изменение строки' });
|
||
});
|
||
it('шаблонная строка без id — пусто', () => {
|
||
expect(keys(row('code-1250'))).toEqual([]);
|
||
});
|
||
});
|
||
|
||
describe('applyLineMenu', () => {
|
||
it('confirm_code → confirm true', () => {
|
||
expect(applyLineMenu(row('l-1230'), 'confirm_code', {})).toEqual({ 'l-1230': { kind: 'confirm', confirmed: true } });
|
||
expect(applyLineMenu(row('l-1230'), 'unconfirm_code', {})).toEqual({ 'l-1230': { kind: 'confirm', confirmed: false } });
|
||
});
|
||
it('assign_code / change_code / mark_detail', () => {
|
||
expect(applyLineMenu(row('l-d2'), 'assign_code', {})['l-d2']).toEqual({ kind: 'code', code: '' });
|
||
expect(applyLineMenu(row('l-1230'), 'change_code', {})['l-1230']).toEqual({ kind: 'code', code: '1230' });
|
||
expect(applyLineMenu(row('l-u7'), 'mark_detail', {})['l-u7']).toEqual({ kind: 'detail' });
|
||
});
|
||
it('reset убирает ключ, новое действие заменяет прежнее, вход не мутируется', () => {
|
||
const before: Record<string, LineAction> = { 'l-u7': { kind: 'detail' }, other: { kind: 'detail' } };
|
||
expect(applyLineMenu(row('l-u7'), 'reset', before)).toEqual({ other: { kind: 'detail' } });
|
||
expect(applyLineMenu(row('l-1230'), 'confirm_code', { 'l-1230': { kind: 'code', code: '1231' } })['l-1230']).toEqual({
|
||
kind: 'confirm',
|
||
confirmed: true,
|
||
});
|
||
expect(before['l-u7']).toEqual({ kind: 'detail' });
|
||
});
|
||
});
|
||
|
||
describe('showsCodeInput', () => {
|
||
it('unreadable / missing всегда; прочие — только при действии code', () => {
|
||
expect(showsCodeInput(row('l-u7'), undefined)).toBe(true);
|
||
expect(showsCodeInput(row('l-m8'), undefined)).toBe(true);
|
||
expect(showsCodeInput(row('l-1230'), undefined)).toBe(false);
|
||
expect(showsCodeInput(row('l-1230'), { kind: 'code', code: '1230' })).toBe(true);
|
||
expect(showsCodeInput(row('l-d2'), { kind: 'code', code: '' })).toBe(true);
|
||
});
|
||
});
|