Статистика: любимая фракция — только по сознательному выбору игрока

Партии, где фракция выпала рандомом (was_random), в счётчик любимой
не идут: рандомная раздача о предпочтениях не говорит. Если игрок ни
разу не выбирал фракцию сам — любимой нет вовсе. Лучшая/худшая фракции
и остальная статистика считаются по всем партиям, как раньше.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-18 17:16:28 +03:00
co-authored by Claude Fable 5
parent b349891bdb
commit e7323cc3c4
3 changed files with 79 additions and 5 deletions
+9 -2
View File
@@ -140,8 +140,15 @@ def finish_match(
def create_finished_match(
client: TestClient, group_id: int, players: list[dict], win_reason: str = "objectives"
) -> dict:
"""players: [{user_id, faction_id, place, comment?}] → завершённая партия (для статистики)."""
roster = [{"user_id": p["user_id"], "faction_id": p["faction_id"]} for p in players]
"""players: [{user_id, faction_id, place, comment?, was_random?}] → завершённая партия."""
roster = [
{
"user_id": p["user_id"],
"faction_id": p["faction_id"],
"was_random": p.get("was_random", False),
}
for p in players
]
started = start_match(client, group_id, roster)
assert started.status_code == 200, started.text
results = [
+59
View File
@@ -124,3 +124,62 @@ def test_leaderboard_includes_avatar_url(client: TestClient, engine, monkeypatch
headers=csrf_headers(client),
)
assert "/avatar?v=" in entry_for(me["id"])["avatar_url"] # после загрузки — ссылка
def test_most_played_faction_ignores_random(client: TestClient, engine):
"""Любимая фракция — только по сознательному выбору: рандомные раздачи не в счёт."""
me = login(client, "Фракционер")
exps = [e["id"] for e in client.get("/api/expansions").json()]
gid = client.post(
"/api/groups", json={"name": "Группа", "expansion_ids": exps}, headers=csrf_headers(client)
).json()["id"]
p2 = add_group_member(engine, gid, "Партнёр")
fids = [f["id"] for f in client.get(f"/api/groups/{gid}/factions").json()]
# Дважды играл фракцией A по рандому, один раз фракцией B — по своему выбору.
for _ in range(2):
create_finished_match(
client,
gid,
[
{"user_id": me["id"], "faction_id": fids[0], "place": 1, "was_random": True},
{"user_id": p2, "faction_id": fids[1], "place": 2},
],
)
create_finished_match(
client,
gid,
[
{"user_id": me["id"], "faction_id": fids[2], "place": 1},
{"user_id": p2, "faction_id": fids[1], "place": 2},
],
)
stats = client.get("/api/users/me/stats").json()
assert stats["most_played_faction"]["faction_id"] == fids[2] # B, хоть партий с A больше
# У соперника все фракции выбраны вручную — любимая считается как раньше.
login(client, "Партнёр")
stats2 = client.get("/api/users/me/stats").json()
assert stats2["most_played_faction"]["faction_id"] == fids[1]
def test_most_played_faction_absent_when_all_random(client: TestClient, engine):
"""Если игрок ни разу не выбирал фракцию сам — любимой нет вовсе."""
me = login(client, "Рандомщик")
exps = [e["id"] for e in client.get("/api/expansions").json()]
gid = client.post(
"/api/groups", json={"name": "Группа", "expansion_ids": exps}, headers=csrf_headers(client)
).json()["id"]
p2 = add_group_member(engine, gid, "Оппонент")
fids = [f["id"] for f in client.get(f"/api/groups/{gid}/factions").json()]
create_finished_match(
client,
gid,
[
{"user_id": me["id"], "faction_id": fids[0], "place": 1, "was_random": True},
{"user_id": p2, "faction_id": fids[1], "place": 2, "was_random": True},
],
)
stats = client.get("/api/users/me/stats").json()
assert stats["most_played_faction"] is None