import pytest from unittest.mock import patch, MagicMock from src.services.http_service import HTTPService, DEBUG_DATA @pytest.fixture def http_service(): config = { 'http': { 'server_url': 'http://api.example.com', 'endpoint': 'cells', 'username': 'testuser', 'password': 'testpass', 'debug': False } } return HTTPService(config) @pytest.fixture def mock_response(): mock = MagicMock() mock.status_code = 200 mock.json.return_value = { "id": 1234, "cell_type": { "id": 16, "name": "INR18650-35E", "manufacturer": "Samsung", "capacity": 3450, "nominal_voltage": 3.7, "max_voltage": 4.2, "min_voltage": 2.5 } } return mock def test_successful_fetch(http_service, mock_response): # Arrange with patch('requests.get', return_value=mock_response) as mock_get: # Act result = http_service.fetch_cell_info(1234) # Assert mock_get.assert_called_once_with( 'http://api.example.com/cells/1234/', auth=('testuser', 'testpass'), headers={"Accept": "application/json"} ) assert result['id'] == 1234 assert result['cell_type']['name'] == 'INR18650-35E' def test_failed_fetch(http_service): # Arrange mock_error_response = MagicMock() mock_error_response.status_code = 404 with patch('requests.get', return_value=mock_error_response) as mock_get: # Act & Assert with pytest.raises(ConnectionError) as exc_info: http_service.fetch_cell_info(9999) assert "could not be retreived: 404" in str(exc_info.value) def test_debug_mode(): # Arrange config = { 'http': { 'server_url': 'http://api.example.com', 'debug': True } } service = HTTPService(config) # Act result = service.fetch_cell_info(1234) # Assert assert result == DEBUG_DATA assert result['cell_type']['name'] == 'INR18650-35E' assert result['cell_type']['capacity'] == 3450 def test_network_error(http_service): # Arrange with patch('requests.get', side_effect=ConnectionError('Network error')): # Act & Assert with pytest.raises(ConnectionError) as exc_info: http_service.fetch_cell_info(1234) assert "Network error" in str(exc_info.value) def test_malformed_json(http_service): # Arrange mock_bad_response = MagicMock() mock_bad_response.status_code = 200 mock_bad_response.json.side_effect = ValueError('Invalid JSON') with patch('requests.get', return_value=mock_bad_response): # Act & Assert with pytest.raises(ValueError) as exc_info: http_service.fetch_cell_info(1234) assert "Invalid JSON" in str(exc_info.value)