"""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