test(rbac): сделать db_only-ветку anon-cloak фальсифицируемой
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 10s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m1s

Ассерт `/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'
This commit is contained in:
bot-backend 2026-09-06 01:04:35 +05:00
parent 990a59e469
commit d5fb675858

View file

@ -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: