From d5fb675858ac2e0983d2c28648b0d82e8dc5b7ca Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sun, 6 Sep 2026 01:04:35 +0500 Subject: [PATCH] =?UTF-8?q?test(rbac):=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20db=5Fonly-=D0=B2=D0=B5=D1=82=D0=BA=D1=83=20anon-?= =?UTF-8?q?cloak=20=D1=84=D0=B0=D0=BB=D1=8C=D1=81=D0=B8=D1=84=D0=B8=D1=86?= =?UTF-8?q?=D0=B8=D1=80=D1=83=D0=B5=D0=BC=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ассерт `/api/v1/me → 401` проходил в обоих мирах: если monkeypatch auth_mode тихо не подействует, запрос без заголовка уходит в ветку «нет заголовка» и даёт тот же 401 (и тот же 404 на admin-пути). Теперь сверяется detail РАВЕНСТВОМ со строкой db_only-ветки; `in` не годится — 'valid session required' является подстрокой dual-текста. Мутация (monkeypatch режима закомментирован) даёт красный: assert 'no authenticated user (valid session required)' == 'valid session required' --- tradein-mvp/backend/tests/test_rbac.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tradein-mvp/backend/tests/test_rbac.py b/tradein-mvp/backend/tests/test_rbac.py index c7fd1ce7..71335416 100644 --- a/tradein-mvp/backend/tests/test_rbac.py +++ b/tradein-mvp/backend/tests/test_rbac.py @@ -486,7 +486,16 @@ def test_anon_admin_cloak_covers_all_unauthenticated_branches( assert (db_only.status_code, db_only.json()) == (baseline.status_code, baseline.json()), ( f"db_only без сессии → {db_only.status_code} {db_only.json()}" ) - assert client.get("/api/v1/me").status_code == 401 + # Различимость ветки: без заголовка 401 на non-admin пути даёт и db_only, и + # dual — отличается только текст. Сравнение РАВЕНСТВОМ, а не `in`: + # db_only-строка является подстрокой dual-строки ("no authenticated user + # (valid session required)"), и `in` прошёл бы, даже если monkeypatch + # режима тихо не подействовал, т.е. ветка была бы нефальсифицируемой. + me = client.get("/api/v1/me") + assert me.status_code == 401 + assert me.json()["detail"] == "valid session required", ( + f"ожидалась db_only-ветка, получено {me.json()['detail']!r}" + ) def test_real_app_does_not_redirect_trailing_slash() -> None: