from __future__ import annotations
import httpx
from inspirehep_mcp.client import (
DEFAULT_FIELDS,
InspireHEPClient,
build_author_query,
build_fulltext_query,
build_title_query,
normalize_record,
)
def test_build_title_query_includes_author_count_and_escaping() -> None:
query = build_title_query('neutrino "mass"', large_collaboration=False)
assert query == 'title "neutrino \\"mass\\"" and ac 1->10'
def test_build_title_query_with_year_filter() -> None:
query = build_title_query("neutrino", large_collaboration=False, year=2020)
assert query == 'title "neutrino" and year 2020 and ac 1->10'
def test_build_author_query_includes_author_count() -> None:
query = build_author_query(["Witten, Edward"], large_collaboration=False)
assert query == 'author "Witten, Edward" and ac 1->10'
def test_build_author_query_with_year_filter() -> None:
query = build_author_query(["Witten, Edward"], large_collaboration=False, year=1998)
assert query == 'author "Witten, Edward" and year 1998 and ac 1->10'
def test_build_fulltext_query_with_year_filter() -> None:
query = build_fulltext_query("supersymmetry breaking", large_collaboration=False, year=2012)
assert query == 'ft "supersymmetry breaking" and year 2012 and ac 1->10'
def test_build_query_with_large_collaboration_enabled() -> None:
query = build_author_query(["Witten, Edward", "Maldacena, Juan"], large_collaboration=True)
assert query == 'author "Witten, Edward" and author "Maldacena, Juan"'
def test_normalize_record_extracts_required_fields() -> None:
metadata = {
"titles": [{"title": "A Nice Paper"}],
"authors": [{"full_name": "Alice"}, {"full_name": "Bob"}],
"abstracts": [{"value": " We study things. \n\n In detail. "}],
"publication_info": [{"year": 2024}],
"citation_count": 123,
"arxiv_eprints": [{"value": "2401.01234"}],
}
normalized = normalize_record(metadata)
assert normalized["title"] == "A Nice Paper"
assert normalized["authors"] == ["Alice", "Bob"]
assert normalized["abstract"] == "We study things. In detail."
assert normalized["year"] == 2024
assert normalized["citation_count"] == 123
assert normalized["arxiv_url"] == "https://arxiv.org/abs/2401.01234"
def test_normalize_record_uses_fallbacks_for_year_and_arxiv() -> None:
metadata = {
"titles": [{"title": "Legacy ID Paper"}],
"authors": [{"full_name": "Carol"}],
"abstracts": [{"value": "Summary"}],
"imprints": [{"date": "2018-03-11"}],
"external_system_identifiers": [{"schema": "arXiv", "value": "hep-th/9901001"}],
}
normalized = normalize_record(metadata)
assert normalized["year"] == 2018
assert normalized["arxiv_url"] == "https://arxiv.org/abs/hep-th/9901001"
async def test_search_literature_calls_api_with_expected_params() -> None:
async def handler(request: httpx.Request) -> httpx.Response:
assert request.url.path == "/api/literature"
params = dict(request.url.params)
assert params["q"] == 'title "axion" and ac 1->10'
assert params["size"] == "3"
assert params["sort"] == "mostcited"
assert params["fields"] == DEFAULT_FIELDS
return httpx.Response(
status_code=200,
json={
"hits": {
"hits": [
{
"metadata": {
"titles": [{"title": "Axion paper"}],
"authors": [{"full_name": "Author A"}],
"abstracts": [{"value": "A"}],
"publication_info": [{"year": 2021}],
"citation_count": 9,
}
}
]
}
},
)
transport = httpx.MockTransport(handler)
async with httpx.AsyncClient(base_url="https://inspirehep.net", transport=transport) as http_client:
client = InspireHEPClient(http_client=http_client)
result = await client.search_literature(
query='title "axion" and ac 1->10',
limit=3,
sort="mostcited",
)
assert len(result.records) == 1
assert result.records[0]["title"] == "Axion paper"
assert result.records[0]["citation_count"] == 9