From f56e3e94c8e0b1aa8e0770dfa8f7c3a2680edcf4 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Thu, 29 Oct 2026 00:15:13 +0400 Subject: [PATCH] =?UTF-8?q?test(sheet):=20=D0=B7=D0=B0=D1=89=D0=B8=D1=82?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=200037=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D0=BB=D0=B5=200051=20(AURORA-1850)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../test_upd_form_cells_subtree_0037_guard.py | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 api/tests/integration/test_upd_form_cells_subtree_0037_guard.py diff --git a/api/tests/integration/test_upd_form_cells_subtree_0037_guard.py b/api/tests/integration/test_upd_form_cells_subtree_0037_guard.py new file mode 100644 index 0000000..1fec5a6 --- /dev/null +++ b/api/tests/integration/test_upd_form_cells_subtree_0037_guard.py @@ -0,0 +1,47 @@ +"""AURORA-1850: защита правки 0037 (LEAF-лимиты АХР и сопоставление num_group_id) после 0051. + +Откат 0037 — нарушение корректности: тесты должны падать, если тело функций вернулось к виду до 0037. +""" + +import re +from decimal import Decimal + +import pytest + +from test_upd_form_cells_full_rows import ( # noqa: F401 (фикстуры и хелперы) + _get_sheet, + _patch_cell, + db_exec, + headers, +) + + +def test_v_form2_view_keeps_0037_limit_formula(client, headers, db_exec): + # LEAF «- принтеры», limit_template.id = 13, код 204620030 (0013_form2_limit.sql:1707) + _patch_cell(client, headers, 4, "AHR_LIMIT", 13, "qty_q1", 4) + row = next(r for r in _get_sheet(client, headers, 4, "AHR_LIMIT") if r["data"].get("id") == 13) + assert Decimal(str(row["data"]["amount_q1"])) == Decimal(4) * Decimal("0.57") * 10900 / 4 + src = db_exec("SELECT pg_get_functiondef(CAST(:s AS regprocedure))", + s="v3.v_form2_view(integer,character varying,text[],integer[])")[0][0] + assert "_form2_ahr_limit_amount" in src + + +OLD_DEPTH3_MATCHER = re.compile(r"ei\.depth\s*=\s*3\s+AND\s*\(") # вид до 0037 + + +def test_ahr_delta_keeps_0037_num_group_matching(client, headers, db_exec): + found = db_exec( + """SELECT lt.id FROM v3.limit_template lt + JOIN v3.expense_item ei ON ei.num_group_id = lt.expense_item_code + AND ei.sheet = 'AHR' AND ei.direction = 'Support' AND ei.depth = 4 + WHERE lt.row_type = 'LEAF' ORDER BY lt.id LIMIT 1""") + if not found: + pytest.skip("нет LEAF шаблона с кодом = num_group_id статьи AHR глубины 4") + lt_id = found[0][0] + _patch_cell(client, headers, 4, "AHR_LIMIT", lt_id, "qty_q1", 4) + delta = db_exec("SELECT row_type FROM v3.get_form2_ahr_satellite_delta(4, 'AHR_LIMIT', :i)", i=lt_id) + assert any(r[0] == "INPUT" for r in delta), "дельта АХР пуста — откат сопоставления 0037" + src = db_exec("SELECT pg_get_functiondef(CAST(:s AS regprocedure))", + s="v3.get_form2_ahr_satellite_delta(integer,character varying,integer)")[0][0] + assert "ei.num_group_id = lt.expense_item_code" in src + assert not OLD_DEPTH3_MATCHER.search(src)