test_mqtt_service.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import pytest
  2. from unittest.mock import MagicMock, patch, call
  3. import json
  4. from src.services.mqtt_service import MQTTService, InsertedCell
  5. from src.models.device import DeviceStatus
  6. @pytest.fixture
  7. def mock_mqtt_client():
  8. with patch('paho.mqtt.client.Client') as mock:
  9. client_instance = MagicMock()
  10. mock.return_value = client_instance
  11. yield client_instance
  12. @pytest.fixture
  13. def mqtt_service(mock_mqtt_client):
  14. config = {
  15. 'mqtt': {
  16. 'broker_address': 'localhost',
  17. 'port': 1883,
  18. 'keepalive': 60,
  19. 'username': 'test',
  20. 'password': 'test',
  21. 'debug': False
  22. }
  23. }
  24. service = MQTTService(config)
  25. return service
  26. def test_init_and_connect(mock_mqtt_client):
  27. # Arrange
  28. config = {
  29. 'mqtt': {
  30. 'broker_address': 'test.mosquitto.org',
  31. 'port': 1883,
  32. 'keepalive': 60,
  33. 'username': 'test',
  34. 'password': 'test',
  35. 'debug': False
  36. }
  37. }
  38. # Act
  39. service = MQTTService(config)
  40. # Assert
  41. mock_mqtt_client.username_pw_set.assert_called_once_with('test', 'test')
  42. mock_mqtt_client.connect.assert_called_once_with('test.mosquitto.org', 1883, 60)
  43. mock_mqtt_client.loop_start.assert_called_once()
  44. def test_register_device(mqtt_service):
  45. # Arrange
  46. device_id = 1
  47. num_slots = 4
  48. callback = lambda x: x
  49. # Act
  50. mqtt_service.register_device(device_id, num_slots, callback)
  51. # Assert
  52. assert mqtt_service.devices[device_id] == num_slots
  53. assert len(mqtt_service.insertion_callbacks[device_id]) == num_slots
  54. for slot in range(num_slots):
  55. assert mqtt_service.insertion_callbacks[device_id][slot] == callback
  56. def test_on_message_callback(mqtt_service):
  57. # Arrange
  58. device_id = 1
  59. slot_id = 0
  60. cell_id = 123
  61. callback_mock = MagicMock()
  62. mqtt_service.register_device(device_id, 1, callback_mock)
  63. msg = MagicMock()
  64. msg.topic = f"cells_inserted/device_{device_id}"
  65. msg.payload = json.dumps({
  66. "slot_id": slot_id,
  67. "cell_id": cell_id
  68. }).encode()
  69. # Act
  70. mqtt_service.on_message(None, None, msg)
  71. # Assert
  72. callback_mock.assert_called_once()
  73. args = callback_mock.call_args[0][0]
  74. assert isinstance(args, InsertedCell)
  75. assert args.device_id == device_id
  76. assert args.slot_id == slot_id
  77. assert args.cell_id == cell_id
  78. def test_cell_finished_publishing(mqtt_service, mock_mqtt_client):
  79. # Arrange
  80. device_id = "device1"
  81. slot_id = 0
  82. cell_id = 123
  83. capacity = 2500.0
  84. status = DeviceStatus.DONE
  85. mqtt_service.register_device(device_id, 1)
  86. # Act
  87. mqtt_service.cell_finished(device_id, slot_id, cell_id, capacity, status)
  88. # Assert
  89. expected_payload = {
  90. "device_id": device_id,
  91. "slot_id": slot_id,
  92. "cell_id": cell_id,
  93. "capacity": capacity,
  94. "status": status.name
  95. }
  96. mock_mqtt_client.publish.assert_called_once_with(
  97. f"measurement_done/{device_id}",
  98. json.dumps(expected_payload)
  99. )
  100. def test_cleanup(mqtt_service, mock_mqtt_client):
  101. # Act
  102. mqtt_service.cleanup()
  103. # Assert
  104. mock_mqtt_client.loop_stop.assert_called_once()
  105. mock_mqtt_client.disconnect.assert_called_once()
  106. def test_debug_mode(mock_mqtt_client):
  107. # Arrange
  108. config = {
  109. 'mqtt': {
  110. 'broker_address': 'localhost',
  111. 'port': 1883,
  112. 'keepalive': 60,
  113. 'username': 'test',
  114. 'password': 'test',
  115. 'debug': True
  116. }
  117. }
  118. # Act
  119. service = MQTTService(config)
  120. # Assert
  121. mock_mqtt_client.connect.assert_not_called()
  122. mock_mqtt_client.loop_start.assert_not_called()