fix: project current match live data safely
This commit is contained in:
118
backend/tests/test_current_match_payload.py
Normal file
118
backend/tests/test_current_match_payload.py
Normal file
@@ -0,0 +1,118 @@
|
||||
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"]
|
||||
Reference in New Issue
Block a user