From 7bc00fdac8569663da392ad9a56ecea4c36c6e69 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 21 May 2026 15:49:57 +0000 Subject: [PATCH] =?UTF-8?q?GoogleSolarApiClient=20retries=20on=20transient?= =?UTF-8?q?=20HTTP=20errors=20=F0=9F=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solar/test_google_solar_api_client.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/infrastructure/solar/test_google_solar_api_client.py b/tests/infrastructure/solar/test_google_solar_api_client.py index b7a7e45d..9a38e836 100644 --- a/tests/infrastructure/solar/test_google_solar_api_client.py +++ b/tests/infrastructure/solar/test_google_solar_api_client.py @@ -31,3 +31,30 @@ def test_get_building_insights_returns_parsed_json() -> None: # Assert assert result == payload mock_get.assert_called_once() + + +# --------------------------------------------------------------------------- +# Slice 2: Transient HTTP errors trigger retries +# --------------------------------------------------------------------------- + + +def test_get_building_insights_retries_on_transient_error() -> None: + # Arrange + client = GoogleSolarApiClient(api_key="test-key") + payload: dict[str, Any] = {"solarPotential": {"maxArrayPanelsCount": 20}} + + transient_error = requests.exceptions.ConnectionError("timeout") + transient_error.response = None # type: ignore[attr-defined] + + success_response = MagicMock() + success_response.json.return_value = payload + success_response.raise_for_status.return_value = None + + with patch("requests.get", side_effect=[transient_error, success_response]) as mock_get: + with patch("time.sleep"): + # Act + result = client.get_building_insights(longitude=-0.1278, latitude=51.5074) + + # Assert + assert result == payload + assert mock_get.call_count == 2