Ревью: тесты-регрессии на найденные дефекты

Четыре теста закрывают то, что чинил предыдущий коммит: обход каталога
ачивок через slug, неподвижная версия партии при правке участников,
удаление группы с партиями (409 вместо 500) и разжалование последнего
владельца.

#8

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186Fk74jkkszahEHSjBzTjD
This commit is contained in:
2026-09-09 15:26:42 +03:00
co-authored by Claude Opus 5
parent 9d9e4a345a
commit 62d75ea176
3 changed files with 98 additions and 0 deletions
+36
View File
@@ -75,3 +75,39 @@ def test_stale_finish_rejected(client: TestClient, engine):
headers=csrf_headers(client),
)
assert r.status_code == 409 and r.json()["error"]["code"] == "STALE_WRITE", r.text
def test_participant_edit_moves_version(client: TestClient, engine):
"""Правка одних участников тоже двигает версию партии.
Регрессия: updated_at менялся только при UPDATE строки matches, поэтому после
правки участников версия оставалась прежней и вторая правка со старой версией
проходила вместо 409 — ровно то, от чего защищает блокировка."""
me, p2, mid = _start(client, engine)
fin = finish_match(
client, mid, [{"user_id": me["id"], "place": 1}, {"user_id": p2, "place": 2}],
win_reason="objectives",
)
assert fin.status_code == 200, fin.text
v1 = client.get(f"/api/matches/{mid}").json()["version"]
parts = {p["user_id"]: p["faction_id"] for p in client.get(f"/api/matches/{mid}").json()["participants"]}
swap = [
{"user_id": me["id"], "faction_id": parts[me["id"]], "place": 2},
{"user_id": p2, "faction_id": parts[p2], "place": 1},
]
r = client.patch(
f"/api/matches/{mid}",
json={"participants": swap, "expected_version": v1},
headers=csrf_headers(client),
)
assert r.status_code == 200, r.text
assert client.get(f"/api/matches/{mid}").json()["version"] != v1
stale = client.patch(
f"/api/matches/{mid}",
json={"participants": swap, "expected_version": v1},
headers=csrf_headers(client),
)
assert stale.status_code == 409, stale.text
assert stale.json()["error"]["code"] == "STALE_WRITE"