test_i2c_service.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import pytest
  2. from unittest.mock import MagicMock, patch
  3. from src.services.i2c_service import I2CService, smbus2
  4. from src.models.device import DeviceStatus
  5. from src.models.cell import CellLimits, MeasureValues
  6. @pytest.fixture
  7. def mock_smbus():
  8. with patch('smbus2.SMBus') as mock:
  9. yield mock
  10. @pytest.fixture
  11. def i2c_service(mock_smbus: smbus2.SMBus):
  12. config = {
  13. 'i2c': {
  14. 'bus': 1,
  15. 'debug': False
  16. }
  17. }
  18. return I2CService(config)
  19. def test_request_status_list(i2c_service: I2CService, mock_smbus: smbus2.SMBus):
  20. # Arrange
  21. mock_instance = mock_smbus.return_value
  22. mock_instance.read_i2c_block_data.return_value = [0, 1, 2] # Mix of different states
  23. i2c_address = 0x48
  24. num_slots = 3
  25. # Act
  26. result = i2c_service.request_status_list(i2c_address, num_slots)
  27. # Assert
  28. assert len(result) == 3
  29. assert result[0] == DeviceStatus.EMPTY
  30. assert result[1] == DeviceStatus.INSERTED
  31. assert result[2] == DeviceStatus.MEASURING
  32. mock_instance.read_i2c_block_data.assert_called_once_with(i2c_address, i2c_service.status_register, num_slots)
  33. def test_request_measure_values(i2c_service: I2CService, mock_smbus: smbus2.SMBus):
  34. # Arrange
  35. mock_instance = mock_smbus.return_value
  36. mock_instance.read_i2c_block_data.return_value = [42, 36, 15] # voltage values * 10
  37. i2c_address = 0x48
  38. slot_id = 1
  39. # Act
  40. result = i2c_service.request_measure_values(i2c_address, slot_id)
  41. # Assert
  42. assert isinstance(result, MeasureValues)
  43. mock_instance.read_i2c_block_data.assert_called_once_with(i2c_address, i2c_service.cell_data_register, 3, slot_id)
  44. def test_send_cell_limits(i2c_service: I2CService, mock_smbus: smbus2.SMBus):
  45. # Arrange
  46. mock_instance = mock_smbus.return_value
  47. i2c_address = 0x48
  48. slot_id = 1
  49. limits = CellLimits(min_volt=3.2, max_volt=4.2, max_curr=2.0)
  50. # Act
  51. result = i2c_service.send_cell_limits(i2c_address, slot_id, limits)
  52. # Assert
  53. assert result is True
  54. mock_instance.write_block_data.assert_called_once_with(
  55. i2c_address,
  56. i2c_service.status_register,
  57. [slot_id, limits.min_volt, limits.max_volt, limits.max_curr]
  58. )
  59. def test_debug_mode():
  60. # Arrange
  61. config = {
  62. 'i2c': {
  63. 'debug': True
  64. }
  65. }
  66. service = I2CService(config)
  67. # Act
  68. status_list = service.request_status_list(0x48, 2)
  69. measure_values = service.request_measure_values(0x48, 1)
  70. limits_result = service.send_cell_limits(0x48, 1, CellLimits(3.2, 4.2, 2.0))
  71. # Assert
  72. assert len(status_list) == 2
  73. assert all(status == DeviceStatus.EMPTY for status in status_list)
  74. assert isinstance(measure_values, MeasureValues)
  75. assert limits_result is True