"""Write hand-crafted stub XML fixtures into tests/fixtures/bgg_cache/. BGG's XML API now requires a registered application token, which we don't have yet, so these fixtures are realistic approximations of real responses (shapes verified against the API docs) rather than recordings. Once a BGG_API_TOKEN exists: delete tests/fixtures/bgg_cache/ and run scripts/record_fixtures.py — it writes real recordings under the SAME filenames, and the test suite must still pass. Usage: uv run python scripts/write_stub_fixtures.py """ from __future__ import annotations from pathlib import Path from bggpipe.bgg_client import cache_key FIXTURE_CACHE = Path("tests/fixtures/bgg_cache") SEARCH_TYPES = "boardgame,boardgameexpansion" def search_item(bgg_id: int, name: str, year: int | None, type_: str) -> str: year_xml = f'' if year else "" return ( f'' f'{year_xml}' ) WINGSPAN_FAMILY = ( search_item(266192, "Wingspan", 2019, "boardgame") + search_item(290448, "Wingspan: European Expansion", 2019, "boardgameexpansion") + search_item(300580, "Wingspan: Oceania Expansion", 2020, "boardgameexpansion") + search_item(366161, "Wingspan Asia", 2022, "boardgame") ) SEARCHES = { "Catan": ( search_item(13, "CATAN", 1995, "boardgame") + search_item(926, "CATAN: Seafarers", 1997, "boardgameexpansion") + search_item(27760, "Catan Dice Game", 2007, "boardgame") + search_item(133038, "CATAN 3D Collector's Edition", 2005, "boardgame") ), "Wingspan": WINGSPAN_FAMILY, "Wingspan: European Expansion": WINGSPAN_FAMILY, "Wingspan Europe": WINGSPAN_FAMILY, "Café International": ( search_item(373, "Café International", 1989, "boardgame") + search_item(8103, "Café International: Das Kartenspiel", 2001, "boardgame") ), "Citadels": ( search_item(478, "Citadels", 2000, "boardgame") + search_item(205398, "Citadels", 2016, "boardgame") ), "Blorvath: Quest of the Zzyzx": "", } THINGS = { # Citadels tie-break: neither edition dominates 10x -> stays ambiguous. ("478,205398", "stats"): """ """, # Wingspan versions: 2019 Stonemaier English must beat the 2020 printing. ("266192", "versions"): """ """, } def main() -> None: FIXTURE_CACHE.mkdir(parents=True, exist_ok=True) for query, items in SEARCHES.items(): key = cache_key("search", {"query": query, "type": SEARCH_TYPES}) total = items.count("{items}') for (ids, flavor), xml in THINGS.items(): key = cache_key("thing", {"id": ids, flavor: "1"}) (FIXTURE_CACHE / key).write_text(xml) for f in sorted(FIXTURE_CACHE.iterdir()): print(f" {f.name}") if __name__ == "__main__": main()