mtg_python_deckbuilder/code/tests/test_partner_suggestions_telemetry.py

98 lines
No EOL
3.7 KiB
Python

import json
import logging
from typing import Any, Dict
import pytest
from starlette.requests import Request
from code.web.services.telemetry import (
log_partner_suggestion_selected,
log_partner_suggestions_generated,
)
async def _receive() -> Dict[str, Any]:
return {"type": "http.request", "body": b"", "more_body": False}
def _make_request(path: str, method: str = "GET", query_string: str = "") -> Request:
scope = {
"type": "http",
"method": method,
"scheme": "http",
"path": path,
"raw_path": path.encode("utf-8"),
"query_string": query_string.encode("utf-8"),
"headers": [],
"client": ("203.0.113.5", 52345),
"server": ("testserver", 80),
}
request = Request(scope, receive=_receive)
request.state.request_id = "req-123"
return request
def test_log_partner_suggestions_generated_emits_payload(caplog: pytest.LogCaptureFixture) -> None:
request = _make_request("/api/partner/suggestions", query_string="commander=Akiri&mode=partner")
metadata = {"dataset_version": "2025-10-05", "record_count": 42}
with caplog.at_level(logging.INFO, logger="web.partner_suggestions"):
log_partner_suggestions_generated(
request,
commander_display="Akiri, Fearless Voyager",
commander_canonical="akiri, fearless voyager",
include_modes=["partner"],
available_modes=["partner"],
total=3,
mode_counts={"partner": 3},
visible_count=2,
hidden_count=1,
limit_per_mode=5,
visible_limit=3,
include_hidden=False,
refresh_requested=False,
dataset_metadata=metadata,
)
matching = [record for record in caplog.records if record.name == "web.partner_suggestions"]
assert matching, "Expected partner suggestions telemetry log"
payload = json.loads(matching[-1].message)
assert payload["event"] == "partner_suggestions.generated"
assert payload["commander"]["display"] == "Akiri, Fearless Voyager"
assert payload["filters"]["include_modes"] == ["partner"]
assert payload["result"]["mode_counts"]["partner"] == 3
assert payload["result"]["visible_count"] == 2
assert payload["result"]["metadata"]["dataset_version"] == "2025-10-05"
assert payload["query"]["mode"] == "partner"
def test_log_partner_suggestion_selected_emits_payload(caplog: pytest.LogCaptureFixture) -> None:
request = _make_request("/build/partner/preview", method="POST")
with caplog.at_level(logging.INFO, logger="web.partner_suggestions"):
log_partner_suggestion_selected(
request,
commander="Rograkh, Son of Rohgahh",
scope="partner",
partner_enabled=True,
auto_opt_out=False,
auto_assigned=False,
selection_source="suggestion",
secondary_candidate="Silas Renn, Seeker Adept",
background_candidate=None,
resolved_secondary="Silas Renn, Seeker Adept",
resolved_background=None,
partner_mode="partner",
has_preview=True,
warnings=["Color identity expanded"],
error=None,
)
matching = [record for record in caplog.records if record.name == "web.partner_suggestions"]
assert matching, "Expected partner suggestion selection telemetry log"
payload = json.loads(matching[-1].message)
assert payload["event"] == "partner_suggestions.selected"
assert payload["selection_source"] == "suggestion"
assert payload["resolved"]["partner_mode"] == "partner"
assert payload["warnings_count"] == 1
assert payload["has_error"] is False