"""Tests for codex.sources.crossref.""" from __future__ import annotations import httpx import pytest from codex.models import Citation from codex.sources import crossref def test_fetch_abstract_strips_jats(monkeypatch: pytest.MonkeyPatch) -> None: """A JATS-tagged abstract is returned as plain text with tags removed.""" body = { "message": { "abstract": "We prove a theorem about " "polyhedra." } } def mock_get(url: str, params: dict[str, object] | None = None) -> httpx.Response: return httpx.Response(200, json=body) monkeypatch.setattr(crossref, "_get", mock_get) result = crossref.fetch_abstract("10.1007/s00454-019-00132-8") assert result == "We prove a theorem about polyhedra." def test_fetch_abstract_absent_returns_none(monkeypatch: pytest.MonkeyPatch) -> None: """A work with no abstract field (e.g. a book chapter) returns None.""" def mock_get(url: str, params: dict[str, object] | None = None) -> httpx.Response: return httpx.Response(200, json={"message": {"title": ["Some Chapter"]}}) monkeypatch.setattr(crossref, "_get", mock_get) assert crossref.fetch_abstract("10.1007/978-3-642-17413-1_7") is None def test_fetch_abstract_404_returns_none(monkeypatch: pytest.MonkeyPatch) -> None: """A 404 returns None rather than raising.""" def mock_get(url: str, params: dict[str, object] | None = None) -> httpx.Response: raise httpx.HTTPStatusError( "404", request=httpx.Request("GET", url), response=httpx.Response(404, request=httpx.Request("GET", url)), ) monkeypatch.setattr(crossref, "_get", mock_get) assert crossref.fetch_abstract("10.0000/nonexistent") is None # --------------------------------------------------------------------------- # fetch_references (roadmap R-B) # --------------------------------------------------------------------------- def test_fetch_references_returns_doi_edges(monkeypatch: pytest.MonkeyPatch) -> None: """Only references carrying a DOI become Citations; citing_id is the queried DOI.""" body = { "message": { "reference": [ {"key": "ref1", "DOI": "10.1090/s0002-9947-04-03545-7"}, {"key": "ref2", "unstructured": "A book with no DOI, 1992."}, # skipped {"key": "ref3", "DOI": "10.1007/bf02392449", "article-title": "X"}, ] } } def mock_get(url: str, params: dict[str, object] | None = None) -> httpx.Response: return httpx.Response(200, json=body) monkeypatch.setattr(crossref, "_get", mock_get) refs = crossref.fetch_references("10.1007/s00454-019-00132-8") assert refs == [ Citation(citing_id="10.1007/s00454-019-00132-8", cited_id="10.1090/s0002-9947-04-03545-7"), Citation(citing_id="10.1007/s00454-019-00132-8", cited_id="10.1007/bf02392449"), ] def test_fetch_references_no_reference_key_returns_empty(monkeypatch: pytest.MonkeyPatch) -> None: """A work with no deposited reference list returns [].""" def mock_get(url: str, params: dict[str, object] | None = None) -> httpx.Response: return httpx.Response(200, json={"message": {"title": ["No refs deposited"]}}) monkeypatch.setattr(crossref, "_get", mock_get) assert crossref.fetch_references("10.1007/978-3-642-17413-1_7") == [] def test_fetch_references_404_returns_empty(monkeypatch: pytest.MonkeyPatch) -> None: """A 404 returns [] rather than raising.""" def mock_get(url: str, params: dict[str, object] | None = None) -> httpx.Response: raise httpx.HTTPStatusError( "404", request=httpx.Request("GET", url), response=httpx.Response(404, request=httpx.Request("GET", url)), ) monkeypatch.setattr(crossref, "_get", mock_get) assert crossref.fetch_references("10.0000/nonexistent") == []