from http import HTTPStatus from unittest.mock import patch from app.payloads import build_current_match_payload from app.rcon_client import RconServerTarget from app.routes import resolve_get_payload TARGET = RconServerTarget( name="Comunidad Hispana #01", host="127.0.0.1", port=7779, password="test-password", source_name="test-rcon", external_server_id="comunidad-hispana-01", ) def test_current_match_payload_projects_rich_live_rcon_session_fields(): data = _build_with_rcon_sample( { "normalized": { "server_name": "Comunidad Hispana #01", "status": "online", "current_map": "carentan_warfare", "game_mode": "Warfare", "allied_score": 2, "axis_score": 2, "allied_players": 0, "axis_players": 0, "players": 0, "max_players": 100, "match_time_seconds": 5400, "remaining_match_time_seconds": 0, }, "raw_session": {"mapId": "carentan_warfare", "mapName": "CARENTAN"}, } ) assert data["map"] == "Carentan" assert data["map_id"] == "carentan_warfare" assert data["map_pretty_name"] == "Carentan" assert data["game_mode"] == "Warfare" assert data["allied_score"] == 2 assert data["axis_score"] == 2 assert data["players"] == 0 assert data["player_count_quality"] == "rcon-session-unverified" assert data["player_count_source"] == "rcon-session" assert data["score_source"] == "rcon-session" assert data["map_source"] == "rcon-session" assert data["public_scoreboard_url"] == "https://scoreboard.comunidadhll.es" assert "/games" not in data["public_scoreboard_url"] def test_current_match_payload_preserves_missing_values_as_null(): data = _build_with_rcon_sample( { "normalized": { "server_name": "Comunidad Hispana #01", "status": "online", "current_map": None, "game_mode": None, "players": None, "max_players": None, }, "raw_session": {}, } ) assert data["map"] is None assert data["map_id"] is None assert data["game_mode"] is None assert data["allied_score"] is None assert data["axis_score"] is None assert data["players"] is None assert data["player_count_quality"] is None assert data["player_count_source"] is None assert data["score_source"] is None assert data["map_source"] is None def test_current_match_payload_keeps_explicit_zero_score(): data = _build_with_rcon_sample( { "normalized": { "server_name": "Comunidad Hispana #01", "status": "online", "current_map": "stmariedumont_warfare", "allied_score": 0, "axis_score": 0, }, "raw_session": { "mapId": "stmariedumont_warfare", "mapName": "ST MARIE DU MONT", }, } ) assert data["map"] == "St. Marie Du Mont" assert data["allied_score"] == 0 assert data["axis_score"] == 0 assert data["score_source"] == "rcon-session" def test_current_match_route_rejects_unsupported_server(): status, payload = resolve_get_payload("/api/current-match?server=not-trusted") assert status == HTTPStatus.NOT_FOUND assert payload["status"] == "error" def _build_with_rcon_sample(sample: dict[str, object]) -> dict[str, object]: with ( patch("app.payloads.load_rcon_targets", return_value=(TARGET,)), patch("app.payloads.query_live_server_sample", return_value=sample), ): payload = build_current_match_payload(server_slug="comunidad-hispana-01") return payload["data"]