Ревью: закрыть дыры в собственном покрытии
Прогон /code-review по тестам показал, что проверка обхода каталога ачивок ничего не проверяла: httpx нормализует «..» в URL до отправки, запрос уходил на /api/admin/ и до обработчика не доходил — тест был бы зелёным и без защиты. Теперь percent-кодированная форма плюс проверка конверта ошибки, чтобы промах роутинга не выдавал себя за отказ. Добавлено недостающее: передача владения группой (обратная сторона защиты последнего владельца), сдвиг версии партии при загрузке вложения, совпадение кэш-бастера аватара между профилем и лидербордом. Проверка выживания группы после отказа в удалении теперь смотрит на саму группу и её партии, а не только на код ответа. #8 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0186Fk74jkkszahEHSjBzTjD
This commit is contained in:
@@ -138,3 +138,23 @@ def test_non_member_cannot_view(client: TestClient, engine, monkeypatch, tmp_pat
|
||||
login(client, "Чужак") # не состоит в группе
|
||||
g = client.get(f"/api/matches/{mid}/attachments/{aid}")
|
||||
assert g.status_code in (401, 403)
|
||||
|
||||
|
||||
def test_attachment_upload_moves_version(client: TestClient, engine, monkeypatch, tmp_path):
|
||||
"""Вложения видны в MatchRead, но строку matches не трогают.
|
||||
|
||||
Регрессия: из-за этого версия партии не двигалась, и правка со старой версией
|
||||
проходила мимо оптимистичной блокировки."""
|
||||
_use_tmp_uploads(monkeypatch, tmp_path)
|
||||
me, gid, p2, mid = _start(client, engine)
|
||||
v1 = client.get(f"/api/matches/{mid}").json()["version"]
|
||||
|
||||
assert _upload(client, mid).status_code == 200
|
||||
v2 = client.get(f"/api/matches/{mid}").json()["version"]
|
||||
assert v2 != v1
|
||||
|
||||
stale = client.delete(
|
||||
f"/api/matches/{mid}", params={"expected_version": v1}, headers=csrf_headers(client)
|
||||
)
|
||||
assert stale.status_code == 409, stale.text
|
||||
assert stale.json()["error"]["code"] == "STALE_WRITE"
|
||||
|
||||
Reference in New Issue
Block a user