From 18e0f1d9991342b39ae37d243c6ba965dd7c57e4 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Wed, 2 Sep 2026 16:46:44 +0500 Subject: [PATCH] =?UTF-8?q?test(tradein):=20=D0=B8=D0=B7=D0=BE=D0=BB=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20test=5Frbac.py=20=D0=BE?= =?UTF-8?q?=D1=82=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=80=D0=B5=D0=B5=D1=81=D1=82=D1=80=D0=B0=20(#3316)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI-красное на голове ветки: 4 теста в tests/test_rbac.py ждали YAML-роль (kopylov=pilot, user1=pilot), а в CI-базе реестр засеян миграцией 193 (kopylov=manager, user*=employee) — DB-first резолвер честно отдавал роль из БД. Локально те же тесты были зелёными ровно потому, что БД нет и работал YAML-fallback: результат файла зависел от ОКРУЖЕНИЯ, а такой тест не проверяет ничего. Чинится не подгонкой чисел в ассертах, а изоляцией: файл проверяет ИМЕННО legacy-путь roles.yaml (разбор файла, globs, guard и /me на trusted-header), и теперь заявляет это явно — autouse-фикстура `_legacy_yaml_only` глушит реестр (`_registry_role` → None). Ассерты на YAML-роли после этого законны в любом окружении. Приоритет реестра, эквивалентность scope employee↔pilot и конфигурация kopylov (DB manager + YAML pilot) покрыты отдельно — tests/test_role_single_source.py. Проверено обоими способами: полный `pytest tests` без сида и он же с плагином-имитацией засеянного реестра (подменяется тот же шов, что и в проде, `identity_store.identity_session`) — 5290 passed, 35 skipped в обоих. --- tradein-mvp/backend/tests/test_rbac.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tradein-mvp/backend/tests/test_rbac.py b/tradein-mvp/backend/tests/test_rbac.py index ea0837dd..dc3ecc0b 100644 --- a/tradein-mvp/backend/tests/test_rbac.py +++ b/tradein-mvp/backend/tests/test_rbac.py @@ -42,6 +42,23 @@ def _reset_auth_cache() -> None: auth_mod.reset_cache_for_tests() +@pytest.fixture(autouse=True) +def _legacy_yaml_only(monkeypatch: pytest.MonkeyPatch) -> None: + """Реестр в ЭТОМ файле молчит — здесь проверяется legacy-путь roles.yaml. + + #3316 сделал `get_role` DB-first (реестр → YAML-fallback), и без этой + изоляции результат файла зависел бы от ОКРУЖЕНИЯ: локально без БД шла + YAML-ветка и всё было зелено, а в CI, где реестр засеян миграцией 193 + (kopylov=manager, user*=employee), те же ассерты краснели. Тест, который + отвечает по-разному в двух окружениях, не проверяет ничего. + + Здесь закреплена ровно YAML-семантика (разбор файла, globs, поведение + guard'а и /me на trusted-header пути); DB-first, приоритет реестра и + эквивалентность scope employee↔pilot покрыты tests/test_role_single_source.py. + """ + monkeypatch.setattr(auth_mod, "_registry_role", lambda username: None) + + # --------------------------------------------------------------------------- # Test app — использует РЕАЛЬНЫЙ rbac_guard (app/core/rbac.py), а не копию. # ---------------------------------------------------------------------------