Рейтинг: партии без соперников не считаются, понятная причина недоступной партии
В профиле Ivan висели две «партии» с одним участником, которые не открывались. Dev-удаление аккаунта (dev_admin) вычёркивает игрока из партий, не трогая сами партии, и 17.06 в dev-БД так опустели партии 2, 3, 6 и 7. Они засчитывались оставшемуся в число игр с ΔR 0.0, показывались в истории и списке группы, а бэкфилл 0014 проставил им last_standing. Партия меньше чем с двумя участниками больше не считается игрой: её нет в рейтинге и счётчиках (load_history), в истории игрока и в списке партий группы; админка её по-прежнему видит. Бэкфилл last_standing в 0014 теперь требует хотя бы двух участников (на уже мигрированных БД такие партии и так скрыты). «Партия не найдена» при переходе из чужого профиля в партию группы, где зритель не состоит, — это 403; страница партии теперь так и пишет. Тест: партия, опустевшая после dev-удаления, не попадает в историю, список и счётчик группы, рейтинг считается только по настоящей партии. #80 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
This commit is contained in:
@@ -180,6 +180,39 @@ def test_best_match_is_biggest_rating_gain(client: TestClient, engine):
|
||||
assert data["items"][0]["id"] == first["id"]
|
||||
|
||||
|
||||
def test_match_left_with_one_participant_is_not_a_game(client: TestClient, engine, make_admin):
|
||||
"""Dev-удаление аккаунта вычёркивает игрока из партий, не трогая сами партии. Партия,
|
||||
где остался один участник, — не игра: её нет в рейтинге, историях и списках группы
|
||||
(карточка «с одним игроком» раньше висела в профиле)."""
|
||||
me = login(client, "Выживший")
|
||||
gid, fids = _group(client)
|
||||
b = add_group_member(engine, gid, "Удалённый")
|
||||
c = add_group_member(engine, gid, "Соперник")
|
||||
orphan = _duel(client, gid, fids, me["id"], b)
|
||||
kept = _duel(client, gid, fids, c, me["id"])
|
||||
|
||||
make_admin("admin", "secret123")
|
||||
assert client.post(
|
||||
"/api/admin/auth/login",
|
||||
json={"username": "admin", "password": "secret123"},
|
||||
headers=csrf_headers(client),
|
||||
).status_code == 200
|
||||
assert client.delete(f"/api/admin/dev/users/{b}", headers=csrf_headers(client)).status_code == 200
|
||||
# Админка партию по-прежнему видит — удалить её можно оттуда.
|
||||
assert client.get(f"/api/admin/matches/{orphan['id']}").status_code == 200
|
||||
|
||||
history = client.get(f"/api/users/{me['id']}/matches").json()
|
||||
assert (history["total"], [i["id"] for i in history["items"]]) == (1, [kept["id"]])
|
||||
group_list = client.get(f"/api/groups/{gid}/matches").json()
|
||||
assert (group_list["total"], [i["id"] for i in group_list["items"]]) == (1, [kept["id"]])
|
||||
assert client.get(f"/api/groups/{gid}/stats").json()["total_matches"] == 1
|
||||
|
||||
# В рейтинге — только настоящая партия: дуэль новичков, проигрыш −32.
|
||||
board = _board(client)
|
||||
assert (board[me["id"]]["games"], board[me["id"]]["score"]) == (1, 1468)
|
||||
assert board[c]["score"] == 1532
|
||||
|
||||
|
||||
def test_history_shows_rating_delta_of_its_owner(client: TestClient, engine):
|
||||
"""История игрока несёт изменение его общего рейтинга за каждую партию (#77)."""
|
||||
me = login(client, "Историк")
|
||||
|
||||
Reference in New Issue
Block a user