Добавлена функция удаления аккаунтов с каскадным удалением из всех записей для дева

This commit is contained in:
2026-06-17 16:34:29 +03:00
parent 865c967d5e
commit 3291c67b2c
9 changed files with 271 additions and 73 deletions
+58
View File
@@ -106,6 +106,64 @@ def test_admin_edit_match_and_filters(client: TestClient, make_admin):
assert bp["faction_name"] == "Хаоситы"
def test_dev_delete_account_keeps_matches(client: TestClient, make_admin):
"""DEV-удаление: аккаунт удаляется, партии живут (игрок вычёркивается),
его созданные партии и группы переназначаются на админа."""
me = login(client, "Аня") # владелец группы и создатель партии
gid = client.post(
"/api/groups", json={"name": "Группа", "expansion_ids": []}, headers=csrf_headers(client)
).json()["id"]
client.post("/api/auth/dev/users", json={"nickname": "Боря"}, headers=csrf_headers(client))
b = client.post(
f"/api/groups/{gid}/members", json={"nickname": "Боря"}, headers=csrf_headers(client)
).json()["user_id"]
factions = {f["code"]: f["id"] for f in client.get(f"/api/groups/{gid}/factions").json()}
mid = create_finished_match(
client,
gid,
[
{"user_id": me["id"], "faction_id": factions["orks"], "place": 1},
{"user_id": b, "faction_id": factions["eldar"], "place": 2},
],
)["id"]
admin_id = make_admin("admin", "secret123")
r = client.post(
"/api/admin/auth/login",
json={"username": "admin", "password": "secret123"},
headers=csrf_headers(client),
)
assert r.status_code == 200, r.text
# Удаляем участника Борю → партия жива, его строка участия вычеркнута.
r = client.delete(f"/api/admin/dev/users/{b}", headers=csrf_headers(client))
assert r.status_code == 200, r.text
assert all(u["id"] != b for u in client.get("/api/admin/users").json())
detail = client.get(f"/api/admin/matches/{mid}").json()
assert [p["user_id"] for p in detail["participants"]] == [me["id"]] # Боря вычеркнут
assert detail["player_count"] == 2 # player_count НЕ пересчитывается (осознанно)
# Удаляем создателя/владельца Аню → партия и группа сохраняются, переходят к админу.
r = client.delete(f"/api/admin/dev/users/{me['id']}", headers=csrf_headers(client))
assert r.status_code == 200, r.text
assert client.get(f"/api/admin/matches/{mid}").json()["created_by"] == admin_id
grp = next(g for g in client.get("/api/admin/groups").json() if g["id"] == gid)
assert grp["owner_id"] == admin_id
def test_dev_delete_account_rejects_admin(client: TestClient, make_admin):
"""Админа удалить нельзя."""
admin_id = make_admin("admin", "secret123")
r = client.post(
"/api/admin/auth/login",
json={"username": "admin", "password": "secret123"},
headers=csrf_headers(client),
)
assert r.status_code == 200, r.text
r = client.delete(f"/api/admin/dev/users/{admin_id}", headers=csrf_headers(client))
assert r.status_code == 422, r.text
def test_admin_rename_faction_system_wide(client: TestClient, make_admin):
me = login(client, "Кто-то")
gid = client.post(