SSE: не рассылать ratings на правки без влияния на рейтинг; событие group при смене настроек группы
- notify.match_changed получил флаг ratings: фото (игрок и админ) его не шлют, правка
партии — только если изменились входы рейтинга (match_service.rating_inputs до/после).
- PATCH /api/groups/{id} публикует group — переименование и правило 9 раундов видны
остальным участникам сразу.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -81,3 +81,60 @@ def test_deleting_finished_match_reaches_players_outside_group(
|
||||
assert r.status_code == 200, r.text
|
||||
assert _recipients(published, "match") == {me["id"], p2}
|
||||
assert outsider in _recipients(published, "ratings")
|
||||
|
||||
|
||||
def _finished_match(client: TestClient, me: dict, p2: int, gid: int, fids: list[int]) -> int:
|
||||
mid = start_match(
|
||||
client, gid,
|
||||
[{"user_id": me["id"], "faction_id": fids[0]}, {"user_id": p2, "faction_id": fids[1]}],
|
||||
).json()["id"]
|
||||
finish_match(client, mid, [{"user_id": me["id"], "place": 1}, {"user_id": p2, "place": 2}])
|
||||
return mid
|
||||
|
||||
|
||||
def _patch_match(client: TestClient, mid: int, me: dict, p2: int, fids: list[int], **changes):
|
||||
"""PATCH как у формы правки: состав передаётся целиком, даже если меняется комментарий."""
|
||||
places = changes.pop("places", (1, 2))
|
||||
body = {
|
||||
"expected_version": client.get(f"/api/matches/{mid}").json()["version"],
|
||||
"participants": [
|
||||
{"user_id": me["id"], "faction_id": fids[0], "place": places[0]},
|
||||
{"user_id": p2, "faction_id": fids[1], "place": places[1]},
|
||||
],
|
||||
**changes,
|
||||
}
|
||||
r = client.patch(f"/api/matches/{mid}", json=body, headers=csrf_headers(client))
|
||||
assert r.status_code == 200, r.text
|
||||
|
||||
|
||||
def test_comment_edit_does_not_broadcast_ratings(client: TestClient, engine, monkeypatch):
|
||||
"""Правка без влияния на рейтинг — событие только группе: остальным игрокам незачем
|
||||
перезапрашивать все рейтинговые витрины."""
|
||||
me, gid, p2, outsider, fids = _two_groups(client, engine)
|
||||
mid = _finished_match(client, me, p2, gid, fids)
|
||||
|
||||
published = _capture_events(monkeypatch)
|
||||
_patch_match(client, mid, me, p2, fids, overall_comment="Хорошая партия")
|
||||
assert _recipients(published, "match") == {me["id"], p2}
|
||||
assert _recipients(published, "ratings") == set()
|
||||
|
||||
|
||||
def test_result_edit_broadcasts_ratings(client: TestClient, engine, monkeypatch):
|
||||
me, gid, p2, outsider, fids = _two_groups(client, engine)
|
||||
mid = _finished_match(client, me, p2, gid, fids)
|
||||
|
||||
published = _capture_events(monkeypatch)
|
||||
_patch_match(client, mid, me, p2, fids, places=(2, 1))
|
||||
assert outsider in _recipients(published, "ratings")
|
||||
|
||||
|
||||
def test_group_settings_change_reaches_members(client: TestClient, engine, monkeypatch):
|
||||
"""Переключение домашнего правила видно остальным участникам без перезагрузки."""
|
||||
me, gid, p2, outsider, fids = _two_groups(client, engine)
|
||||
|
||||
published = _capture_events(monkeypatch)
|
||||
r = client.patch(
|
||||
f"/api/groups/{gid}", json={"nine_rounds_rule": True}, headers=csrf_headers(client)
|
||||
)
|
||||
assert r.status_code == 200, r.text
|
||||
assert _recipients(published, "group") == {me["id"], p2}
|
||||
|
||||
Reference in New Issue
Block a user