Show MediaWiki API error messages
This commit is contained in:
parent
1442620ece
commit
0188cbe0bf
3 changed files with 98 additions and 7 deletions
|
|
@ -2,7 +2,13 @@ import pytest
|
|||
import pytest_mock
|
||||
import requests
|
||||
import responses
|
||||
from geocode.wikidata import APIResponseError, QueryError, api_call, wdqs
|
||||
from geocode.wikidata import (
|
||||
APIResponseError,
|
||||
QueryError,
|
||||
api_call,
|
||||
mediawiki_error_message,
|
||||
wdqs,
|
||||
)
|
||||
|
||||
max_tries = 5
|
||||
|
||||
|
|
@ -53,6 +59,39 @@ def test_api_call_retries_on_connection_error(
|
|||
assert mocked_sleep.call_count == max_tries - 1
|
||||
|
||||
|
||||
@responses.activate
|
||||
def test_api_call_uses_mediawiki_error_message(
|
||||
mocker: pytest_mock.plugin.MockerFixture,
|
||||
) -> None:
|
||||
"""Test MediaWiki API error messages are preserved."""
|
||||
mocker.patch("time.sleep", return_value=None)
|
||||
mocker.patch("geocode.mail.send_to_admin")
|
||||
|
||||
responses.add(
|
||||
responses.GET,
|
||||
"https://www.wikidata.org/w/api.php",
|
||||
json={"error": {"code": "ratelimited", "info": "Too many requests"}},
|
||||
status=429,
|
||||
headers={"Retry-After": "10"},
|
||||
)
|
||||
|
||||
with pytest.raises(APIResponseError) as exc_info:
|
||||
api_call({"action": "wbgetentities", "ids": "Q42"})
|
||||
|
||||
assert exc_info.value.detail == "Too many requests"
|
||||
assert str(exc_info.value) == "Wikidata API error (HTTP 429): Too many requests"
|
||||
|
||||
|
||||
def test_mediawiki_error_message_falls_back_to_response_text() -> None:
|
||||
"""Test plain-text MediaWiki API errors are preserved."""
|
||||
response = requests.Response()
|
||||
response.status_code = 429
|
||||
response.reason = "Too Many Requests"
|
||||
response._content = b"Please slow down"
|
||||
|
||||
assert mediawiki_error_message(response) == "Please slow down"
|
||||
|
||||
|
||||
def test_wdqs_retry(mocker: pytest_mock.plugin.MockerFixture) -> None:
|
||||
"""Test retry for WDQS API calls."""
|
||||
# Patch 'time.sleep' to instantly return, effectively skipping the sleep
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue