Регрессия: покрытие таблицы корректировок (#198)

У фичи AURORA-1540/1541 (корректировки) и AURORA-1751 (vgo_assignment),
слитых 02.11.2026, не было ни одной проверки в регрессии: ui_smoke.py не
заходил на вкладку корректировок, stand_scenario.py не делал ни одного
запроса к /corrections или /vgo-assignments.

- stand_scenario.py: happy-path GET /vgo-assignments/distribute и
  GET /corrections на каждый сценарий; сохранение корректировки первого
  агрегата и повтор с тем же expected_version_no — 409
  CORRECTION_VERSION_CONFLICT. rb-2024-q3 не имеет подтверждённых форм ББ
  (только ОСВ) — сохранение там штатно получает 422 INVALID_LINE_CODE,
  это не регрессия и репортится как пропуск, не красным.
- ui_smoke.py: страница /groups/{g}/versions/{v}/correction на каждую
  версию сценария.

Проверено: python3 -I scripts/regression/regress.sh --only stand,ui —
зелёный, оба сценария (rb-2024-q3, rb-2025-q1), включая реальный 409 на
rb-2025-q1 и скриншот вкладки «Таблица корректировки» с данными.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-11-02 23:20:06 +04:00
parent 45475b952e
commit b237e0f1e9
2 changed files with 36 additions and 4 deletions

View File

@ -2,9 +2,10 @@
Для каждого сценария expected.json: консолидация ГК/ГСК за период → блокировка → загрузка файлов фикстур в версию → Для каждого сценария expected.json: консолидация ГК/ГСК за период → блокировка → загрузка файлов фикстур в версию →
ожидание распознавания (tabular-parser, scan-gateway + эмулятор ИС) → подтверждение ОСВ-документов → проверки свода ожидание распознавания (tabular-parser, scan-gateway + эмулятор ИС) → подтверждение ОСВ-документов → проверки свода
(summary, пробелы, контрольные строки), экспорта xlsx, шахматки, форм ББ/ОФР; плюс негатив (повтор создания — 409, (summary, пробелы, контрольные строки), экспорта xlsx, шахматки, таблицы корректировок (сохранение и 409
блокировка без права EDIT — 403). Итог — report.json (проверки) и snapshots/<сценарий>.*.json (весь свод, шахматка, CORRECTION_VERSION_CONFLICT), форм ББ/ОФР; плюс негатив (повтор создания — 409, блокировка без права EDIT — 403).
формы); с --baseline снимки сравниваются с прошлым прогоном (расхождения — в report.json, раздел diffs). Итог — report.json (проверки) и snapshots/<сценарий>.*.json (весь свод, шахматка, формы); с --baseline снимки
сравниваются с прошлым прогоном (расхождения — в report.json, раздел diffs).
python3 -I stand_scenario.py --api http://127.0.0.1:18000 --fixtures ../fixtures --expected expected.json --out DIR python3 -I stand_scenario.py --api http://127.0.0.1:18000 --fixtures ../fixtures --expected expected.json --out DIR
[--baseline DIR_ПРОШЛОГО_stand] [--timeout 600] [--baseline DIR_ПРОШЛОГО_stand] [--timeout 600]
@ -348,6 +349,33 @@ def run_scenario(api: Api, sc: dict, ctx: dict, fixtures: Path, rep: Report, out
) )
) )
# таблица корректировок (AURORA-1540/1541) и ручное распределение строк ВГО (AURORA-1751) — без UI-покрытия (#198)
st, _, _ = api.call("GET", f"/consolidations/versions/{vid}/vgo-assignments/distribute")
rep.check(f"{sid}: распределение строк ВГО 200", st == 200, f"{st}")
st, corrections, _ = api.call("GET", f"/consolidations/versions/{vid}/corrections", params={"statement_type": "balance"})
if rep.check(f"{sid}: таблица корректировок 200", st == 200, f"{st}"):
aggregates = corrections["aggregates"]
if rep.check(f"{sid}: таблица корректировок — есть агрегаты", len(aggregates) > 0, f"{len(aggregates)}"):
agg = aggregates[0]
path = f"/consolidations/versions/{vid}/corrections/aggregates/{agg['rule_id']}/{agg['company_1']['id']}/{agg['company_2']['id']}"
body = {
"debit": [{"line_code": agg["side_1"]["article_line"].split("/")[0], "amount": "1.00"}],
"credit": [{"line_code": agg["side_2"]["article_line"].split("/")[0], "amount": "1.00"}],
"comment": "регрессия (#198): проверка сохранения и конфликта версий",
"expected_version_no": None,
}
st1, saved, _ = api.call("PUT", path, body, params={"statement_type": "balance"})
if st1 == 422 and (saved or {}).get("detail", {}).get("code") == "INVALID_LINE_CODE":
# статья не из формы ББ компании — в этом сценарии нет подтверждённых форм (только ОСВ); не регрессия
print(f"{sid}: корректировка — пропуск сохранения, нет формы ББ со статьёй агрегата: {saved}", flush=True)
elif rep.check(f"{sid}: корректировка — сохранение 200", st1 == 200, f"{st1} {str(saved)[:200]}"):
st2, conflict, _ = api.call("PUT", path, body, params={"statement_type": "balance"})
rep.check(
f"{sid}: корректировка — повтор с устаревшим expected_version_no — 409",
st2 == 409 and (conflict or {}).get("detail", {}).get("code") == "CORRECTION_VERSION_CONFLICT",
f"{st2} {conflict}",
)
# формы ББ/ОФР из PDF (эмулятор ИС): типы документов, строки, проверки # формы ББ/ОФР из PDF (эмулятор ИС): типы документов, строки, проверки
stmts = {} stmts = {}
for inn, want in sc["statements"].items(): for inn, want in sc["statements"].items():

View File

@ -47,7 +47,11 @@ def main() -> int:
if g: if g:
pages.append(("group", f"/groups/{g}")) pages.append(("group", f"/groups/{g}"))
for sid, vid in (ids.get("versions") or {}).items(): for sid, vid in (ids.get("versions") or {}).items():
pages += [(f"{sid}-osv", f"/groups/{g}/versions/{vid}/osv"), (f"{sid}-chess", f"/groups/{g}/versions/{vid}/chess")] pages += [
(f"{sid}-osv", f"/groups/{g}/versions/{vid}/osv"),
(f"{sid}-chess", f"/groups/{g}/versions/{vid}/chess"),
(f"{sid}-correction", f"/groups/{g}/versions/{vid}/correction"),
]
for name, doc in (ids.get("documents") or {}).items(): for name, doc in (ids.get("documents") or {}).items():
pages.append((f"doc-{name}", f"/documents/{doc}")) pages.append((f"doc-{name}", f"/documents/{doc}"))