test_api.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import pytest
  2. from robot_control.src.api.mqtt_handler import MQTTHandler, MeasurementResult, mqtt
  3. from unittest.mock import Mock, patch
  4. @pytest.fixture
  5. def mock_mqtt_client():
  6. with patch('paho.mqtt.client.Client') as mock_client:
  7. client_instance = Mock()
  8. mock_client.return_value = client_instance
  9. yield client_instance
  10. @pytest.fixture
  11. def mqtt_handler(mock_mqtt_client):
  12. handler = MQTTHandler()
  13. yield handler
  14. handler.cleanup()
  15. # @pytest.fixture
  16. # def real_mqtt_handler():
  17. # handler = MQTTHandler(username="robot", password="robot")
  18. # yield handler
  19. # handler.cleanup()
  20. class TestMQTTHandler:
  21. def test_device_registration(self, mqtt_handler:MQTTHandler):
  22. mqtt_handler.register_device("test_device", 4)
  23. assert "test_device" in mqtt_handler.measurement_callbacks
  24. def test_start_measurement(self, mqtt_handler:MQTTHandler, mock_mqtt_client:mqtt.Client):
  25. callback = Mock()
  26. mqtt_handler.register_device("test_device", 4, callback)
  27. mqtt_handler.start_measurement("test_device", 1, 123)
  28. mock_mqtt_client.publish.assert_called_once()
  29. assert mqtt_handler.measurement_callbacks["test_device"][1] == callback
  30. def test_measurement_callback(self, mqtt_handler:MQTTHandler):
  31. callback = Mock()
  32. mqtt_handler.register_device("test_device", 4, callback)
  33. mqtt_handler.start_measurement("test_device", 1, 123)
  34. # Simulate measurement complete message
  35. result = MeasurementResult(
  36. cell_id=123,
  37. device_id="test_device",
  38. slot_id=1,
  39. capacity=3000.0,
  40. status="complete"
  41. )
  42. # Simulate MQTT message
  43. message = Mock()
  44. message.topic = "measurement_done/test_device"
  45. message.payload = result.model_dump_json().encode()
  46. mqtt_handler.on_message(None, None, message)
  47. callback.assert_called_once()
  48. def test_invalid_device(self, mqtt_handler:MQTTHandler):
  49. with pytest.raises(ValueError):
  50. mqtt_handler.start_measurement("invalid_device", 1, 123)