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: