diff --git a/newsfragments/1503.change.rst b/newsfragments/1503.change.rst new file mode 100644 index 00000000..b773a5e3 --- /dev/null +++ b/newsfragments/1503.change.rst @@ -0,0 +1,2 @@ +Say what was received, rather than "unexpected shape", when the Vuforia +credentials API returns something which is not JSON. diff --git a/src/vws_web_tools/__init__.py b/src/vws_web_tools/__init__.py index 6c9e88c7..398afb6c 100644 --- a/src/vws_web_tools/__init__.py +++ b/src/vws_web_tools/__init__.py @@ -1321,7 +1321,12 @@ def _json_request( try: response_body: object = response.json() except requests.JSONDecodeError as exc: - message = "The Vuforia credentials response had an unexpected shape." + content_type = response.headers.get("Content-Type", "unset") + message = ( + f"Expected JSON from {url}, but the response had status " + f"{response.status_code} and content type {content_type}: " + f"{response.text[:500]}" + ) raise RuntimeError(message) from exc return response_body diff --git a/tests/test_model_target_web_api_details.py b/tests/test_model_target_web_api_details.py index 87c68e2e..f78ce070 100644 --- a/tests/test_model_target_web_api_details.py +++ b/tests/test_model_target_web_api_details.py @@ -3,6 +3,7 @@ # ruff: noqa: ANN401, SLF001 """Tests for Model Target Web API detail helpers.""" +import re from typing import Any import pytest @@ -237,13 +238,19 @@ def test_json_request_raises_runtime_error_for_connection_failure() -> None: def test_json_request_raises_runtime_error_for_invalid_json() -> None: - """Invalid JSON responses raise a stable runtime error.""" + """A response which is not JSON says what was received instead.""" session = _Session( - response=_response(content=b"not json", status_code=200) + response=_response(content=b"error", status_code=200) ) with pytest.raises( - expected_exception=RuntimeError, match="unexpected shape" + expected_exception=RuntimeError, + match=re.escape( + pattern=( + "Expected JSON from https://example.com, but the response " + "had status 200 and content type unset: error" + ), + ), ): vws_web_tools._json_request( session=session,