From c3b032b861df8f34d16ea7d4bf3f638643616f6e Mon Sep 17 00:00:00 2001 From: Samuel Scully Date: Sat, 10 May 2025 14:33:03 +0100 Subject: [PATCH] Replace httpretty with responses in tests --- setup.py | 2 +- test/test_all.py | 42 ++++++++++++++------------- test/test_error_blocked.py | 9 +++--- test/test_error_invalid_input.py | 12 ++++---- test/test_error_not_authorized.py | 9 +++--- test/test_error_ratelimit_exceeded.py | 20 ++++++------- test/test_error_unknown.py | 25 ++++++++-------- test/test_headers.py | 17 ++++++----- test/test_session.py | 18 ++++++------ tox.ini | 4 +-- 10 files changed, 81 insertions(+), 77 deletions(-) diff --git a/setup.py b/setup.py index c22f693..8044906 100644 --- a/setup.py +++ b/setup.py @@ -71,7 +71,7 @@ ], test_suite='pytest', tests_require=[ - 'httpretty>=1.1.4', + 'responses>=0.25.7', 'pylint==2.17.4', 'pytest>=7.4.0' ], diff --git a/test/test_all.py b/test/test_all.py index d4dea20..9ebccc5 100644 --- a/test/test_all.py +++ b/test/test_all.py @@ -3,9 +3,8 @@ from pathlib import Path import os -import httpretty +import responses -from httpretty import httprettified from opencage.geocoder import OpenCageGeocode # reduce maximum backoff retry time from 120s to 1s @@ -22,51 +21,54 @@ def _any_result_around(results, lat=None, lon=None): return True return False -@httprettified +@responses.activate def test_gb_postcode(): - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, - body=Path('test/fixtures/uk_postcode.json').read_text(encoding="utf-8") + body=Path('test/fixtures/uk_postcode.json').read_text(encoding="utf-8"), + status=200 ) results = geocoder.geocode("EC1M 5RF") assert _any_result_around(results, lat=51.5201666, lon=-0.0985142) -@httprettified +@responses.activate def test_australia(): - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, - body=Path('test/fixtures/mudgee_australia.json').read_text(encoding="utf-8") + body=Path('test/fixtures/mudgee_australia.json').read_text(encoding="utf-8"), + status=200 ) results = geocoder.geocode("Mudgee, Australia") assert _any_result_around(results, lat=-32.5980702, lon=149.5886383) -@httprettified +@responses.activate def test_munster(): - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, - body=Path('test/fixtures/muenster.json').read_text(encoding="utf-8") + body=Path('test/fixtures/muenster.json').read_text(encoding="utf-8"), + status=200 ) results = geocoder.geocode("Münster") assert _any_result_around(results, lat=51.9625101, lon=7.6251879) -@httprettified +@responses.activate def test_donostia(): - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, - body=Path('test/fixtures/donostia.json').read_text(encoding="utf-8") - + body=Path('test/fixtures/donostia.json').read_text(encoding="utf-8"), + status=200 ) - results =geocoder.geocode("Donostia") + results = geocoder.geocode("Donostia") assert _any_result_around(results, lat=43.300836, lon=-1.9809529) # test that the results are in unicode diff --git a/test/test_error_blocked.py b/test/test_error_blocked.py index 66e374f..afb70f7 100644 --- a/test/test_error_blocked.py +++ b/test/test_error_blocked.py @@ -1,19 +1,18 @@ from pathlib import Path import pytest -import httpretty +import responses -from httpretty import httprettified from opencage.geocoder import OpenCageGeocode from opencage.geocoder import ForbiddenError geocoder = OpenCageGeocode('2e10e5e828262eb243ec0b54681d699a') # will always return 403 -@httprettified +@responses.activate def test_api_key_blocked(): - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, body=Path('test/fixtures/403_apikey_disabled.json').read_text(encoding="utf-8"), status=403, diff --git a/test/test_error_invalid_input.py b/test/test_error_invalid_input.py index 01e8c6f..e0ff04e 100644 --- a/test/test_error_invalid_input.py +++ b/test/test_error_invalid_input.py @@ -1,19 +1,19 @@ import pytest -import httpretty +import responses -from httpretty import httprettified from opencage.geocoder import OpenCageGeocode from opencage.geocoder import InvalidInputError geocoder = OpenCageGeocode('abcde') -@httprettified +@responses.activate def test_must_be_unicode_string(): - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, - body='{"results":{}}' + body='{"results":{}}', + status=200 ) # Should not give errors diff --git a/test/test_error_not_authorized.py b/test/test_error_not_authorized.py index cdf2bf5..4183cf5 100644 --- a/test/test_error_not_authorized.py +++ b/test/test_error_not_authorized.py @@ -1,18 +1,17 @@ from pathlib import Path -import httpretty import pytest +import responses -from httpretty import httprettified from opencage.geocoder import OpenCageGeocode from opencage.geocoder import NotAuthorizedError geocoder = OpenCageGeocode('unauthorized-key') -@httprettified +@responses.activate def test_api_key_not_authorized(): - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, body=Path('test/fixtures/401_not_authorized.json').read_text(encoding="utf-8"), status=401, diff --git a/test/test_error_ratelimit_exceeded.py b/test/test_error_ratelimit_exceeded.py index 627f95b..2522fd0 100644 --- a/test/test_error_ratelimit_exceeded.py +++ b/test/test_error_ratelimit_exceeded.py @@ -1,34 +1,34 @@ from pathlib import Path -import httpretty import pytest +import responses -from httpretty import httprettified from opencage.geocoder import OpenCageGeocode from opencage.geocoder import RateLimitExceededError geocoder = OpenCageGeocode('abcde') -@httprettified +@responses.activate def test_no_rate_limit(): - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, - body=Path('test/fixtures/no_ratelimit.json').read_text(encoding="utf-8") + body=Path('test/fixtures/no_ratelimit.json').read_text(encoding="utf-8"), + status=200 ) # shouldn't raise an exception geocoder.geocode("whatever") -@httprettified +@responses.activate def test_rate_limit_exceeded(): # 4372eff77b8343cebfc843eb4da4ddc4 will always return 402 - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, body=Path('test/fixtures/402_rate_limit_exceeded.json').read_text(encoding="utf-8"), status=402, - adding_headers={ + headers={ 'X-RateLimit-Limit': '2500', 'X-RateLimit-Remaining': '0', 'X-RateLimit-Reset': '1402185600' diff --git a/test/test_error_unknown.py b/test/test_error_unknown.py index fa5853f..be310cf 100644 --- a/test/test_error_unknown.py +++ b/test/test_error_unknown.py @@ -1,18 +1,18 @@ import pytest -import httpretty +import responses -from httpretty import httprettified from opencage.geocoder import OpenCageGeocode from opencage.geocoder import UnknownError geocoder = OpenCageGeocode('abcde') -@httprettified +@responses.activate def test_http_500_status(): - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, + body='{}', status=500, ) @@ -21,14 +21,14 @@ def test_http_500_status(): assert str(excinfo.value) == '500 status code from API' -@httprettified +@responses.activate def test_non_json(): "These kinds of errors come from webserver and may not be JSON" - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, body='

503 Service Unavailable

', - forcing_headers={ + headers={ 'Content-Type': 'text/html', }, status=503 @@ -39,12 +39,13 @@ def test_non_json(): assert str(excinfo.value) == 'Non-JSON result from server' -@httprettified +@responses.activate def test_no_results_key(): - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, body='{"spam": "eggs"}', + status=200, # Need to specify status code with responses ) with pytest.raises(UnknownError) as excinfo: diff --git a/test/test_headers.py b/test/test_headers.py index b48b4a8..644ddb4 100644 --- a/test/test_headers.py +++ b/test/test_headers.py @@ -4,9 +4,8 @@ import os import re -import httpretty +import responses -from httpretty import httprettified from opencage.geocoder import OpenCageGeocode # reduce maximum backoff retry time from 120s to 1s @@ -16,15 +15,19 @@ user_agent_format = re.compile(r'^opencage-python/[\d\.]+ Python/[\d\.]+ (requests|aiohttp)/[\d\.]+ \(OpenCage Test\)$') -@httprettified +@responses.activate def test_sync(): - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, - body=Path('test/fixtures/uk_postcode.json').read_text(encoding="utf-8") + body=Path('test/fixtures/uk_postcode.json').read_text(encoding="utf-8"), + status=200 ) geocoder.geocode("EC1M 5RF") - user_agent = httpretty.last_request().headers['User-Agent'] + + # Check the User-Agent header in the most recent request + request = responses.calls[-1].request + user_agent = request.headers['User-Agent'] assert user_agent_format.match(user_agent) is not None diff --git a/test/test_session.py b/test/test_session.py index 01fc937..449eb9e 100644 --- a/test/test_session.py +++ b/test/test_session.py @@ -2,10 +2,9 @@ from pathlib import Path -import httpretty import pytest +import responses -from httpretty import httprettified from opencage.geocoder import OpenCageGeocode from opencage.geocoder import NotAuthorizedError @@ -16,23 +15,24 @@ def _any_result_around(results, lat=None, lon=None): return True return False -@httprettified +@responses.activate def test_success(): with OpenCageGeocode('abcde') as geocoder: - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, - body=Path('test/fixtures/uk_postcode.json').read_text(encoding="utf-8") + body=Path('test/fixtures/uk_postcode.json').read_text(encoding="utf-8"), + status=200 ) results = geocoder.geocode("EC1M 5RF") assert _any_result_around(results, lat=51.5201666, lon=-0.0985142) -@httprettified +@responses.activate def test_failure(): with OpenCageGeocode('unauthorized-key') as geocoder: - httpretty.register_uri( - httpretty.GET, + responses.add( + responses.GET, geocoder.url, body=Path('test/fixtures/401_not_authorized.json').read_text(encoding="utf-8"), status=401, diff --git a/tox.ini b/tox.ini index 2fd78f4..e67f6fc 100644 --- a/tox.ini +++ b/tox.ini @@ -12,7 +12,7 @@ python = [testenv] deps = - httpretty + responses pytest pytest-aiohttp pytest-asyncio @@ -22,7 +22,7 @@ commands = [testenv:lint] usedevelop = True deps = - httpretty + responses pylint==2.17.4 pytest commands =