Перенесён диапазон 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>
89 lines
4.1 KiB
TypeScript
89 lines
4.1 KiB
TypeScript
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([]);
|
||
});
|
||
});
|