diff --git a/brainles_preprocessing/utils/zenodo.py b/brainles_preprocessing/utils/zenodo.py index b43f9d7..e4b9f2b 100644 --- a/brainles_preprocessing/utils/zenodo.py +++ b/brainles_preprocessing/utils/zenodo.py @@ -137,9 +137,25 @@ def _get_metadata_and_archive_url(self) -> Tuple[Dict, str] | None: try: response = requests.get(f"{self.BASE_URL}/{self.record_id}") if response.status_code != 200: + # Include the response body for easier debugging. + # Zenodo returns JSON error details in the response body. + try: + error_detail = response.json() + except ValueError: + error_detail = response.text.strip() + + if response.status_code == 404: + error_prefix = ( + f"Cannot find record '{self.record_id}' on Zenodo" + ) + else: + error_prefix = ( + f"Failed to fetch record '{self.record_id}' from Zenodo" + ) error_msg = ( - f"Cannot find record '{self.record_id}' on Zenodo " - f"({response.status_code=})." + f"{error_prefix} " + f"(status_code={response.status_code}). " + f"Response: {error_detail}" ) logger.error(error_msg) raise ZenodoException(error_msg) diff --git a/tests/test_zenodo.py b/tests/test_zenodo.py index 7815b22..7653d4d 100644 --- a/tests/test_zenodo.py +++ b/tests/test_zenodo.py @@ -57,11 +57,28 @@ def test_get_metadata_and_archive_url_success( def test_get_metadata_and_archive_url_failure(monkeypatch): response_mock = MagicMock() response_mock.status_code = 404 + response_mock.json.return_value = { + "message": "The record does not exist.", + "status": 404, + } monkeypatch.setattr("requests.get", lambda *args, **kwargs: response_mock) record = ZenodoRecord("invalid", Path("/tmp"), "test") - with pytest.raises(ZenodoException): + with pytest.raises(ZenodoException, match="The record does not exist"): + record._get_metadata_and_archive_url() + + +def test_get_metadata_and_archive_url_failure_with_text_body(monkeypatch): + response_mock = MagicMock() + response_mock.status_code = 403 + response_mock.json.side_effect = ValueError("No JSON") + response_mock.text = "Rate limit exceeded. Please try again later." + + monkeypatch.setattr("requests.get", lambda *args, **kwargs: response_mock) + record = ZenodoRecord("123", Path("/tmp"), "test") + + with pytest.raises(ZenodoException, match="Rate limit exceeded"): record._get_metadata_and_archive_url()