fix: use card_type field instead of track_name string in variant renders (#149)
All checks were successful
Ruff Lint / lint (pull_request) Successful in 14s

Closes #149

Replaces fragile track_name string matching ('Pitcher' check) with the
structured card_type field ('sp', 'rp', 'batter') already present in
refractor API data. Prevents silent wrong-type renders when track_name
varies ('Starting Pitcher', 'SP', etc.). Updates test fixtures and adds
assertions that verify the correct card type URL segment.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Cal Corum 2026-04-07 22:32:36 -05:00
parent 224250b03d
commit a56004fbd4
2 changed files with 20 additions and 9 deletions

View File

@ -4257,8 +4257,8 @@ async def _trigger_variant_renders(tier_ups: list) -> None:
if variant is None:
continue
player_id = tier_up["player_id"]
track = tier_up.get("track_name", "Batter")
card_type = "pitching" if track.lower() == "pitcher" else "batting"
ct = tier_up.get("card_type", "batter")
card_type = "pitching" if ct in ("sp", "rp") else "batting"
try:
await db_get(
f"players/{player_id}/{card_type}card/{today}/{variant}",

View File

@ -12,10 +12,15 @@ class TestTriggerVariantRenders:
@pytest.mark.asyncio
async def test_calls_render_url_for_each_tier_up(self):
"""Each tier-up with variant_created triggers a card render GET request."""
"""Each tier-up with variant_created triggers a card render GET request.
card_type field ('sp', 'rp', 'batter') determines the render URL segment
('pitchingcard' or 'battingcard'). This prevents silent wrong-type renders
when track_name strings vary ('Pitcher', 'Starting Pitcher', 'SP', etc.).
"""
tier_ups = [
{"player_id": 100, "variant_created": 7, "track_name": "Batter"},
{"player_id": 200, "variant_created": 3, "track_name": "Pitcher"},
{"player_id": 100, "variant_created": 7, "card_type": "batter"},
{"player_id": 200, "variant_created": 3, "card_type": "sp"},
]
with patch(
@ -26,14 +31,20 @@ class TestTriggerVariantRenders:
assert mock_get.call_count == 2
call_args_list = [call.args[0] for call in mock_get.call_args_list]
assert any("100" in url and "7" in url for url in call_args_list)
assert any("200" in url and "3" in url for url in call_args_list)
assert any(
"100" in url and "battingcard" in url and "7" in url
for url in call_args_list
)
assert any(
"200" in url and "pitchingcard" in url and "3" in url
for url in call_args_list
)
@pytest.mark.asyncio
async def test_skips_tier_ups_without_variant(self):
"""Tier-ups without variant_created are skipped."""
tier_ups = [
{"player_id": 100, "track_name": "Batter"},
{"player_id": 100, "card_type": "batter"},
]
with patch(
@ -46,7 +57,7 @@ class TestTriggerVariantRenders:
async def test_api_failure_does_not_raise(self):
"""Render trigger failures are swallowed — fire-and-forget."""
tier_ups = [
{"player_id": 100, "variant_created": 7, "track_name": "Batter"},
{"player_id": 100, "variant_created": 7, "card_type": "batter"},
]
with patch(