arm-core/web/src/widgets/DocumentReview/headerFields.test.ts
Andrey Epifancev 1a35829074 fix(web): синхронизация встроенного фронта с arm-web@test (4a02512) (#133)
Перенесён диапазон arm-web 0f2bbc8..4a02512 (23 коммитов, 51 файлов набора
синхронизации) скриптом docs/scripts/sync-web.sh. После переноса web/ и
arm-web@test идентичны по набору. Коммиты arm-web:
- 4fb477d Подпись пустой цели «цель не заполнена», тесты null/null (ревью I-1, M-1, M-2, M-4)
- cb36ec8 Нарушения проверок: expected/actual и индекс колонки могут быть null (#45)
- b4b8c04 openspec(statements-v2): решения по итогам прогона в браузере (T11.D-1…D-5, #43)
- aa3054e docs(arm-web): экран формы v5.19 — README и карта модулей (#43)
- 88a4920 fix(arm-web): нераспознанный текст суммы, пустые подстроки без расшифровок, свёрнутый список предупреждений (#43)
- a3199d6 fix(arm-web): вёрстка экрана проверки формы — ширины колонок, значки в ячейке, шапка, ссылка кнопкой (#43)
- 12fcea7 fix(statement): защитные значения по умолчанию для ядра без v5.19 (M-2, #43)
- 4783593 fix(statement): ссылка на строки без кода всегда видна, сортировка по row_index, Alert для ошибки скрытого поля кода, постоянный aria-label (T9.1, T9.2, T9.4, T7.1, T8.1, T3.3, M-3, #43)
- d965fdc fix(statement): округление уверенности в подсказках шапки, пустые тексты в подсказках, комментарий шапки (T5.1, T5.2, M-1, T3.1, #43)
- 6556e3d fix(statement): не отправлять поля шапки, равные текущим (I-2, #43)
- 8d2deb9 docs(openspec): решения без обсуждения из исполнения и имя кнопки «Подтвердить данные» (#43)
- fc5cc16 fix(files): клики внутри popover не открывают строку, ключи и aria-label (#43)
- fdf9358 feat(files): предупреждения файла структурами и предупреждения документа в панели файлов и у ОСВ (#43)
- 5b11f2d feat(statement): блокировка подтверждения при строках без кода, LINES_UNRESOLVED и DUPLICATE_FORM (#43)
- a779d2a feat(statement): подтверждение ячеек, дата колонки, наименование организации и подтверждение даты (#43)
- d416422 feat(statement): правка строк — код с подсказкой из справочника, меню строки, LINE_CODE_TAKEN (#43)
- ef4d325 refactor(statement): один черновик правок и сборка единственного PATCH (#43)
- 8ab116f feat(statement): шапка — организация, поля на проверку и подсказки распознанного текста (#43)
- 4ae8643 feat(statement): предупреждения и нарушения у строк, ячеек, колонок и в списке документа (#43)
- 34d523a feat(statement): вид строк по статусам, подсветка по needs_review, переключатель расшифровок (#43)
- c2f33e7 feat(statement): раскладка строк без кода и расшифровок на своих местах (#43)
- e4ee7f0 fix(fixtures): коды соотношения, column_index, порядок edition_lines (#43)
- f83b035 feat(types): API формы v5.19 — статусы строк, needs_review, issues, предупреждения файла (#43)

Co-Authored-By: sync-web.sh <noreply@aepif.ru>
2026-10-18 22:56:49 +04:00

89 lines
4.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { describe, expect, it } from 'vitest';
import type { HeaderFieldOut, IssueOut, StatementHeaderOut, StatementOut } from '../../types/api';
import statementV2Json from './__fixtures__/statement-v2.json';
import { headerFields } from './headerFields';
const f = (value: string | null, extra: Partial<HeaderFieldOut> = {}): HeaderFieldOut => ({
value,
original_value: value,
confidence: null,
verified: null,
modified: false,
...extra,
});
const header = (over: Partial<StatementHeaderOut> = {}) =>
({
inn: f('3528104476'),
report_date: f('2024-12-31'),
units: f('тыс. руб.'),
organization_name: 'ООО Ромашка',
organization_name_modified: false,
okei: null,
needs_review_fields: [],
source: {},
okud: null,
okpo: null,
okopf: null,
okfs: null,
address: null,
...over,
}) as StatementHeaderOut;
const fixtureHeader = (statementV2Json as unknown as StatementOut).header;
const fixtureIssue = (statementV2Json as unknown as StatementOut).issues.find((i) => i.id === 'i3') as IssueOut;
describe('headerFields — шапка: организация, поля на проверку, подсказки источника', () => {
it('четыре поля по порядку', () => {
const rows = headerFields(fixtureHeader);
expect(rows.map((r) => [r.field, r.label])).toEqual([
['organization_name', 'Организация'],
['inn', 'ИНН'],
['report_date', 'Дата отчёта'],
['units', 'Единица измерения'],
]);
expect(rows[2].text).toBe('30.09.2025');
});
it('внимание только по needs_review_fields', () => {
const rows = headerFields(fixtureHeader);
expect(rows[2]).toMatchObject({ attention: true, canConfirm: true });
expect(rows[0]).toMatchObject({ attention: false, canConfirm: false });
const low = headerFields(header({ inn: f('312120035', { confidence: '50' }) }));
expect(low[1].attention).toBe(false);
const empty = headerFields(header({ inn: f(null) }));
expect(empty[1]).toMatchObject({ attention: false, text: '—' });
});
it('подтвердить можно только дату с известным значением', () => {
const rows = headerFields(header({ needs_review_fields: ['report_date'], report_date: f(null) }));
expect(rows[2].canConfirm).toBe(false);
});
it('подсказка источника', () => {
expect(headerFields(fixtureHeader)[0].tip).toBe('Распознано: «ООО «Ромашкa»» · уверенность 67%');
const h = header({ source: { organization_name: { text: 'ООО Р', confidence: '67.00' } } });
expect(headerFields(h)[0].tip).toBe('Распознано: «ООО Р» · уверенность 67%');
expect(headerFields(header())[0].tip).toBeUndefined();
});
it('уверенность в подсказке округляется, нечисловая — без хвоста, пустой текст — без подсказки', () => {
const tip = (confidence: string | null, text = 'ООО Р') =>
headerFields(header({ source: { organization_name: { text, confidence } } }))[0].tip;
expect(tip('61.54')).toBe('Распознано: «ООО Р» · уверенность 62%');
expect(tip('abc')).toBe('Распознано: «ООО Р»');
expect(tip('67', ' ')).toBeUndefined();
});
it('исправленное поле — исходное в подсказке', () => {
const rows = headerFields(header({ units: f('руб.', { modified: true, original_value: 'тыс. руб.' }) }));
expect(rows[3]).toMatchObject({ modified: true, tip: 'Исходное: тыс. руб.' });
});
it('исправленная организация', () => {
const h = header({
organization_name_modified: true,
source: { organization_name: { text: 'ООО Р', confidence: '67.00' } },
});
expect(headerFields(h)[0]).toMatchObject({ modified: true, tip: 'Распознано: «ООО Р»' });
});
it('предупреждения поля', () => {
const rows = headerFields(fixtureHeader, new Map([['organization_name', [fixtureIssue]]]));
expect(rows[0].issues).toEqual([fixtureIssue]);
expect(rows[1].issues).toEqual([]);
});
});