64x64 avatarmedium looked soft on high-DPI screens. Switching the GetPlayerSummaries field to avatarfull (184x184) and constraining display size to 64px via .live-state .avatar gives sharp rendering on retina/4k panels at the cost of a slightly larger CDN fetch (still hot-linked, so no proxying cost). Also adds the previously-missing CSS for the live-state player grid: avatar+name+meta arranged in a tight 2-column grid per card, link spans the avatar+name so the meta stays non-interactive. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
78 lines
2.8 KiB
Python
78 lines
2.8 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
import pytest
|
|
|
|
from l4d2web.services import steam_users
|
|
|
|
|
|
class _FakeResponse:
|
|
def __init__(self, json_body: dict[str, Any], status: int = 200) -> None:
|
|
self._body = json_body
|
|
self.status_code = status
|
|
|
|
def raise_for_status(self) -> None:
|
|
if self.status_code >= 400:
|
|
raise RuntimeError(f"http {self.status_code}")
|
|
|
|
def json(self) -> dict[str, Any]:
|
|
return self._body
|
|
|
|
|
|
def _patched_get(monkeypatch: pytest.MonkeyPatch, body: dict, capture: list) -> None:
|
|
def fake_get(url: str, params: dict, timeout: float = 30.0) -> _FakeResponse:
|
|
capture.append({"url": url, "params": params, "timeout": timeout})
|
|
return _FakeResponse(body)
|
|
|
|
monkeypatch.setattr(steam_users, "_session_get", fake_get)
|
|
|
|
|
|
def test_fetch_profiles_batch_builds_correct_request(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
captured: list = []
|
|
body = {"response": {"players": [
|
|
{"steamid": "76561197960828710", "personaname": "Alice",
|
|
"avatarfull": "https://avatars.../alice_full.jpg"},
|
|
]}}
|
|
_patched_get(monkeypatch, body, captured)
|
|
|
|
profiles = steam_users.fetch_profiles_batch(
|
|
["76561197960828710", "76561198021234567"], api_key="KEY"
|
|
)
|
|
|
|
assert captured[0]["url"].endswith("/GetPlayerSummaries/v0002/")
|
|
assert captured[0]["params"]["key"] == "KEY"
|
|
assert captured[0]["params"]["steamids"] == "76561197960828710,76561198021234567"
|
|
assert len(profiles) == 1
|
|
p = profiles[0]
|
|
assert p.steam_id_64 == "76561197960828710"
|
|
assert p.persona_name == "Alice"
|
|
assert p.avatar_url.endswith("alice_full.jpg")
|
|
|
|
|
|
def test_fetch_profiles_batch_skips_private_or_missing(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
# The Steam API simply omits non-resolvable IDs from the response. Caller
|
|
# should accept that and return only what's there.
|
|
body = {"response": {"players": [
|
|
{"steamid": "76561197960828710", "personaname": "Alice",
|
|
"avatarfull": "https://avatars.../alice_full.jpg"},
|
|
]}}
|
|
_patched_get(monkeypatch, body, [])
|
|
profiles = steam_users.fetch_profiles_batch(
|
|
["76561197960828710", "76561197999999999"], api_key="KEY"
|
|
)
|
|
assert len(profiles) == 1
|
|
assert profiles[0].steam_id_64 == "76561197960828710"
|
|
|
|
|
|
def test_fetch_profiles_batch_chunks_by_100(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
ids = [str(76561197960000000 + i) for i in range(150)]
|
|
calls: list = []
|
|
body = {"response": {"players": []}}
|
|
_patched_get(monkeypatch, body, calls)
|
|
|
|
steam_users.fetch_profiles_batch(ids, api_key="KEY")
|
|
|
|
assert len(calls) == 2
|
|
assert calls[0]["params"]["steamids"].count(",") == 99 # 100 ids -> 99 commas
|
|
assert calls[1]["params"]["steamids"].count(",") == 49 # 50 ids
|