scholarr/tests/unit/test_scholar_source.py

50 lines
1.4 KiB
Python

import pytest
from app.services.scholar import rate_limit as scholar_rate_limit
from app.services.scholar.source import FetchResult, LiveScholarSource, _build_profile_url
def test_build_profile_url_includes_pagesize_for_initial_page() -> None:
url = _build_profile_url(
scholar_id="abcDEF123456",
cstart=0,
pagesize=100,
)
assert "user=abcDEF123456" in url
assert "pagesize=100" in url
assert "cstart=" not in url
@pytest.mark.asyncio
async def test_live_scholar_source_applies_global_throttle(monkeypatch: pytest.MonkeyPatch) -> None:
captured_interval: list[float] = []
async def _fake_wait_for_scholar_slot(*, min_interval_seconds: float) -> None:
captured_interval.append(min_interval_seconds)
monkeypatch.setattr(
scholar_rate_limit,
"wait_for_scholar_slot",
_fake_wait_for_scholar_slot,
)
expected_result = FetchResult(
requested_url="https://example.test/scholar",
status_code=200,
final_url="https://example.test/scholar",
body="ok",
error=None,
)
source = LiveScholarSource(min_interval_seconds=7.0)
monkeypatch.setattr(source, "_fetch_sync", lambda _url: expected_result)
result = await source.fetch_profile_page_html(
"abcDEF123456",
cstart=0,
pagesize=100,
)
assert result == expected_result
assert captured_interval == [7.0]