from __future__ import annotations import pytest from app.services.domains.arxiv.errors import ArxivParseError from app.services.domains.arxiv.parser import parse_arxiv_feed _VALID_FEED_XML = """ 2 0 2 http://arxiv.org/abs/1234.5678v2 2020-01-01T00:00:00Z 2019-12-31T00:00:00Z Test Entry Example summary Ada Lovelace Grace Hopper """ def test_parse_arxiv_feed_extracts_entries_and_opensearch_meta() -> None: feed = parse_arxiv_feed(_VALID_FEED_XML) assert feed.opensearch.total_results == 2 assert feed.opensearch.start_index == 0 assert feed.opensearch.items_per_page == 2 assert len(feed.entries) == 1 entry = feed.entries[0] assert entry.arxiv_id == "1234.5678v2" assert entry.title == "Test Entry" assert entry.summary == "Example summary" assert entry.authors == ["Ada Lovelace", "Grace Hopper"] assert entry.primary_category == "cs.AI" assert entry.categories == ["cs.AI", "stat.ML"] def test_parse_arxiv_feed_raises_on_invalid_xml() -> None: with pytest.raises(ArxivParseError): parse_arxiv_feed("") def test_parse_arxiv_feed_raises_on_invalid_opensearch_integer() -> None: payload = _VALID_FEED_XML.replace( "2", "x" ) with pytest.raises(ArxivParseError): parse_arxiv_feed(payload)