"""Tests for HIVE API Client.""" from contextlib import nullcontext as does_not_raise from unittest.mock import MagicMock from unittest.mock import patch import httpx import pytest from src.connectors import hive @patch("src.connectors.hive.httpx_retries.RetryTransport") @patch("httpx.Client") def test_run_task_success(mock_client, mock_transport): """Test run_task with a successful response.""" return_value = {"status": "ok"} mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = return_value mock_client.return_value.__enter__.return_value.post.return_value = mock_response result = hive.run_task("http://example.com/image.jpg") assert result == return_value mock_client.return_value.__enter__.return_value.post.assert_called_once() # httpx-retries only retries idempotent methods by default; without POST in # allowed_methods the whole Retry config is inert. Patching the inner transport # exercises the real RetryTransport + Retry logic. @pytest.mark.parametrize( ("hive_responses", "expected_attempts", "expectation"), [ pytest.param( [httpx.Response(500), httpx.Response(200, json={"status": "ok"})], 2, does_not_raise(), id="transient-500-retried", ), pytest.param( [httpx.Response(400)], 1, pytest.raises(httpx.HTTPStatusError), id="client-error-not-retried", ), ], ) @patch("httpx_retries.retry.time.sleep") @patch("httpx.HTTPTransport.handle_request") def test_run_task_retries_transient_hive_errors( mock_handle_request, mock_sleep, hive_responses, expected_attempts, expectation ): mock_handle_request.side_effect = hive_responses with expectation: hive.run_task("http://example.com/audio.flac") assert mock_handle_request.call_count == expected_attempts @patch("src.connectors.hive.httpx_retries.RetryTransport") @patch("httpx.Client") def test_run_task_http_error(mock_client, mock_transport): """Test run_task with an HTTP error.""" mock_response = MagicMock() mock_response.raise_for_status.side_effect = httpx.HTTPStatusError( "Not Found", request=MagicMock(), response=MagicMock() ) mock_client.return_value.__enter__.return_value.post.return_value = mock_response with pytest.raises(httpx.HTTPStatusError): hive.run_task("http://example.com/image.jpg") mock_client.return_value.__enter__.return_value.post.assert_called_once()