"""XML parser tests against hand-built API2 response shapes.""" from __future__ import annotations import pytest from bggpipe.models import ( BGGResponseError, parse_collection, parse_search, parse_things, ) SEARCH_XML = """ """ THING_XML = """ """ COLLECTION_XML = """ Catan 1995 Wingspan """ NOT_RANKED_XML = """ """ ERROR_XML = ( "Invalid username specified" ) def test_parse_search(): results = parse_search(SEARCH_XML) assert [r.bgg_id for r in results] == [13, 290448] assert results[0].name == "CATAN" assert results[0].year == 1995 assert results[1].type == "boardgameexpansion" assert results[1].name_type == "alternate" assert results[1].year is None def test_parse_things_with_stats_and_versions(): (thing,) = parse_things(THING_XML) assert thing.name == "Wingspan" # primary, not alternate assert thing.owned == 123456 assert thing.rank == 30 # boardgame rank, not the family rank assert len(thing.versions) == 2 english = thing.versions[0] assert english.version_id == 465063 assert english.publishers == ("Stonemaier Games",) assert english.languages == ("English",) def test_parse_things_not_ranked_is_none(): (thing,) = parse_things(NOT_RANKED_XML) assert thing.rank is None assert thing.owned == 12 def test_parse_collection(): catan, wingspan = parse_collection(COLLECTION_XML) assert (catan.object_id, catan.coll_id, catan.own) == (13, 101, True) assert catan.version_id is None assert wingspan.own is False # wishlist item must not count as owned assert wingspan.version_id == 465063 def test_error_document_raises(): with pytest.raises(BGGResponseError, match="Invalid username"): parse_collection(ERROR_XML)