51 lines
2.8 KiB
Python
51 lines
2.8 KiB
Python
"""The chosen physical plate survives the real timers API and a reload."""
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from hockey_data.service import HockeyDataService
|
|
from tests.test_stage1_match_access import env, timer
|
|
|
|
|
|
def penalty(identity, side, minutes):
|
|
return {"id": identity, "side": side, "teamPenalty": True, "infraction": {"id": "minor"},
|
|
"preset": str(minutes), "durationMs": minutes * 60000, "remainingMs": minutes * 60000,
|
|
"running": False, "startedOnce": True, "finished": False}
|
|
|
|
|
|
@pytest.mark.parametrize("long_side", ["home", "away"])
|
|
def test_display_owner_survives_timer_api_and_strength_transition(env, long_side):
|
|
assert env.claim().status_code == 200
|
|
short_side = "away" if long_side == "home" else "home"
|
|
long = penalty("long-four", long_side, 4)
|
|
short = penalty("short-two", short_side, 2)
|
|
cycle = {"had_advantage": True, "last_advantage_side": long_side,
|
|
"display_owner_side": long_side, "display_owner_event_key": "hockey_penalty_dashboard:long-four"}
|
|
body = timer(600000, False)
|
|
body["penalty_board"] = {"penalties": [short, long], "history": [], "advantage_cycle": cycle}
|
|
saved = env.client.put("/api/hockey/games/g/control/timers", headers=env.headers(), json=body)
|
|
assert saved.status_code == 200, saved.text
|
|
# A separate participant reads the actual persisted state, not a local response echo.
|
|
reloaded = env.client.get("/api/hockey/games/g/control", headers=env.headers("b")).json()
|
|
assert reloaded["timers"]["penalty_board"]["advantage_cycle"] == cycle
|
|
assert reloaded["strength"]["advantage_side"] == ""
|
|
# The 2:00 portion expires. The longer penalty keeps its physical plate even
|
|
# though the actual hockey advantage now belongs to the opposite team.
|
|
long["remainingMs"] = 120000
|
|
cycle["last_advantage_side"] = short_side
|
|
body["penalty_board"]["penalties"] = [long]
|
|
saved = env.client.put("/api/hockey/games/g/control/timers", headers=env.headers(), json=body)
|
|
assert saved.status_code == 200, saved.text
|
|
reloaded = env.client.get("/api/hockey/games/g/control", headers=env.headers("b")).json()
|
|
assert reloaded["timers"]["penalty_board"]["advantage_cycle"] == cycle
|
|
assert reloaded["strength"]["advantage_side"] == short_side
|
|
|
|
|
|
def test_invalid_display_owner_does_not_override_legacy_advantage():
|
|
legacy = {"had_advantage": True, "last_advantage_side": "away"}
|
|
for bad in ({"display_owner_side": "other", "display_owner_event_key": "board:p"},
|
|
{"display_owner_side": "home", "display_owner_event_key": ""},
|
|
{"display_owner_side": "home", "display_owner_event_key": ["board:p"]}):
|
|
result = HockeyDataService._normalise_game_timer_state({"penalty_board": {"advantage_cycle": {**legacy, **bad}}})
|
|
assert result["penalty_board"]["advantage_cycle"] == legacy
|