test_http_service.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import pytest
  2. from unittest.mock import patch, MagicMock
  3. from src.services.http_service import HTTPService, DEBUG_DATA
  4. @pytest.fixture
  5. def http_service():
  6. config = {
  7. 'http': {
  8. 'server_url': 'http://api.example.com',
  9. 'endpoint': 'cells',
  10. 'username': 'testuser',
  11. 'password': 'testpass',
  12. 'debug': False
  13. }
  14. }
  15. return HTTPService(config)
  16. @pytest.fixture
  17. def mock_response():
  18. mock = MagicMock()
  19. mock.status_code = 200
  20. mock.json.return_value = {
  21. "id": 1234,
  22. "cell_type": {
  23. "id": 16,
  24. "name": "INR18650-35E",
  25. "manufacturer": "Samsung",
  26. "capacity": 3450,
  27. "nominal_voltage": 3.7,
  28. "max_voltage": 4.2,
  29. "min_voltage": 2.5
  30. }
  31. }
  32. return mock
  33. def test_successful_fetch(http_service, mock_response):
  34. # Arrange
  35. with patch('requests.get', return_value=mock_response) as mock_get:
  36. # Act
  37. result = http_service.fetch_cell_info(1234)
  38. # Assert
  39. mock_get.assert_called_once_with(
  40. 'http://api.example.com/cells/1234/',
  41. auth=('testuser', 'testpass'),
  42. headers={"Accept": "application/json"}
  43. )
  44. assert result['id'] == 1234
  45. assert result['cell_type']['name'] == 'INR18650-35E'
  46. def test_failed_fetch(http_service):
  47. # Arrange
  48. mock_error_response = MagicMock()
  49. mock_error_response.status_code = 404
  50. with patch('requests.get', return_value=mock_error_response) as mock_get:
  51. # Act & Assert
  52. with pytest.raises(ConnectionError) as exc_info:
  53. http_service.fetch_cell_info(9999)
  54. assert "could not be retreived: 404" in str(exc_info.value)
  55. def test_debug_mode():
  56. # Arrange
  57. config = {
  58. 'http': {
  59. 'server_url': 'http://api.example.com',
  60. 'debug': True
  61. }
  62. }
  63. service = HTTPService(config)
  64. # Act
  65. result = service.fetch_cell_info(1234)
  66. # Assert
  67. assert result == DEBUG_DATA
  68. assert result['cell_type']['name'] == 'INR18650-35E'
  69. assert result['cell_type']['capacity'] == 3450
  70. def test_network_error(http_service):
  71. # Arrange
  72. with patch('requests.get', side_effect=ConnectionError('Network error')):
  73. # Act & Assert
  74. with pytest.raises(ConnectionError) as exc_info:
  75. http_service.fetch_cell_info(1234)
  76. assert "Network error" in str(exc_info.value)
  77. def test_malformed_json(http_service):
  78. # Arrange
  79. mock_bad_response = MagicMock()
  80. mock_bad_response.status_code = 200
  81. mock_bad_response.json.side_effect = ValueError('Invalid JSON')
  82. with patch('requests.get', return_value=mock_bad_response):
  83. # Act & Assert
  84. with pytest.raises(ValueError) as exc_info:
  85. http_service.fetch_cell_info(1234)
  86. assert "Invalid JSON" in str(exc_info.value)