arm-web/src/widgets/DocumentReview/reviewCounters.test.ts
Andrey Epifancev 0242486eac fix(#49): зелёный make check и исправления после ревью (AURORA-144)
- маршрут /documents/:document_id возвращён: старые ссылки («Открыть подтверждённую форму») снова открывают
  документ; ЮЛ и консолидация для переключателя документов берутся из документа и его файла, а не из адреса;
  в списке переключателя — вторая строка (тип · формат · дата), ББ и ОФР одного PDF различимы
- чек-лист: ОФР — ячейка INCOME (было 'OFR' → всегда «Отсутствует»), сборка строк — buildChecklistRows с тестами,
  rowKey по ЮЛ, типы ответа GET …/checklist
- удаление файла по id файла (fileId строки), а не по id документа (было 404); ошибка — без закрытия окна
- замена: настоящая загрузка нового файла в ту же консолидацию (автозамена ядра, 05-domain-rules §9.5 п. 3),
  причина — комментарием к заменяемому документу; кнопка доступна только в версии в работе
- комментарий: путь без хвостового «/», типы, закрытие только после успеха, лимит 4000
- счётчики над таблицей формы — модуль reviewCounters (по needs_review, как подсветка) с тестами;
  buildStatementGrid возвращён к test (падали 3 теста)
- PageTitle и store возвращены к test (ширина переключателя — внутри DocumentPage; имя ЮЛ — пропсом)
- цвет подписей полей в теме: #667085 (опечатка #665087)
- типы во всех новых компонентах: tsc 0 ошибок, ESLint/biome без ошибок, vitest 331/331, сборка

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:14:09 +04:00

68 lines
2.1 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import type { HeaderFieldOut, StatementOut, ValueOut } from '../../types/api';
import { countReviewValues } from './reviewCounters';
const v = (extra: Partial<ValueOut> = {}): ValueOut => ({
id: 'v',
column_id: 'c1',
column_index: 0,
amount: '1.00',
string_value: null,
text: null,
confidence: '100',
is_recognized: true,
is_modified: false,
original_amount: null,
needs_review: false,
is_confirmed: false,
...extra,
});
const field = (extra: Partial<HeaderFieldOut> = {}): HeaderFieldOut => ({
value: 'x',
original_value: 'x',
verified: null,
modified: null,
...extra,
});
const statement = (values: ValueOut[], header: Partial<StatementOut['header']> = {}) =>
({
header: {
inn: field(),
report_date: field(),
units: field(),
organization_name_modified: false,
needs_review_fields: [],
...header,
},
lines: [{ id: 'l1', values }],
}) as unknown as StatementOut;
describe('countReviewValues', () => {
it('чистая форма — нули', () => {
expect(countReviewValues(statement([v(), v()]))).toEqual({ changed: 0, needsReview: 0 });
});
it('на проверку — needs_review без подтверждения и без правки (как подсветка ячейки)', () => {
const values = [
v({ needs_review: true }),
v({ needs_review: true, is_confirmed: true }),
v({ needs_review: true, is_modified: true }),
// достроенная сервером ячейка: is_recognized = null, на проверку не считается
v({ id: null, is_recognized: null, amount: null }),
];
expect(countReviewValues(statement(values))).toEqual({ changed: 1, needsReview: 1 });
});
it('шапка: правки полей и наименования, поля из needs_review_fields без подтверждения', () => {
const s = statement([], {
inn: field({ modified: true }),
report_date: field({ verified: true }),
organization_name_modified: true,
needs_review_fields: ['report_date', 'units'],
});
expect(countReviewValues(s)).toEqual({ changed: 2, needsReview: 1 });
});
});