Browse Source

_report_state; adapt logging; no longer wait for publish (froze)

Fabian Peter Hammerle 3 years ago
parent
commit
7fce0c4545
2 changed files with 31 additions and 14 deletions
  1. 8 8
      switchbot_mqtt/__init__.py
  2. 23 6
      tests/test_mqtt.py

+ 8 - 8
switchbot_mqtt/__init__.py

@@ -81,16 +81,16 @@ def _report_state(
     switchbot_state: _SwitchbotState,
 ) -> None:
     # https://pypi.org/project/paho-mqtt/#publishing
+    topic = _MQTT_STATE_TOPIC.replace(
+        _MQTT_TOPIC_MAC_ADDRESS_PLACEHOLDER, switchbot_mac_address
+    )
+    payload = _MQTT_STATE_PAYLOAD_MAPPING[switchbot_state]
+    _LOGGER.debug("publishing topic=%s payload=%r", topic, payload)
     message_info: paho.mqtt.client.MQTTMessageInfo = mqtt_client.publish(
-        topic=_MQTT_STATE_TOPIC.replace(
-            _MQTT_TOPIC_MAC_ADDRESS_PLACEHOLDER, switchbot_mac_address
-        ),
-        payload=_MQTT_STATE_PAYLOAD_MAPPING[switchbot_state],
-        retain=True,
+        topic=topic, payload=payload, retain=True,
     )
-    print("TODO", message_info.rc)
-    message_info.wait_for_publish()
-    print("TODO", message_info.rc, message_info.is_published)
+    if message_info.rc != paho.mqtt.client.MQTT_ERR_SUCCESS:
+        _LOGGER.error("failed to publish state (rc=%d)", message_info.rc)
 
 
 def _send_command(

+ 23 - 6
tests/test_mqtt.py

@@ -1,7 +1,8 @@
+import logging
 import unittest.mock
 
 import pytest
-from paho.mqtt.client import MQTTMessage
+from paho.mqtt.client import MQTT_ERR_QUEUE_SIZE, MQTT_ERR_SUCCESS, MQTTMessage
 
 import switchbot_mqtt
 
@@ -166,18 +167,34 @@ def test__mqtt_on_message_ignored_retained(
         (switchbot_mqtt._SwitchbotState.OFF, b"OFF"),
     ],
 )
+@pytest.mark.parametrize(
+    "return_code", [MQTT_ERR_SUCCESS, MQTT_ERR_QUEUE_SIZE],
+)
 def test__report_state(
+    caplog,
     state: switchbot_mqtt._SwitchbotState,
     switchbot_mac_address: str,
     expected_topic: str,
     expected_payload: bytes,
+    return_code: int,
 ):
     mqtt_client_mock = unittest.mock.MagicMock()
-    switchbot_mqtt._report_state(
-        mqtt_client=mqtt_client_mock,
-        switchbot_mac_address=switchbot_mac_address,
-        switchbot_state=state,
-    )
+    mqtt_client_mock.publish.return_value.rc = return_code
+    with caplog.at_level(logging.WARNING):
+        switchbot_mqtt._report_state(
+            mqtt_client=mqtt_client_mock,
+            switchbot_mac_address=switchbot_mac_address,
+            switchbot_state=state,
+        )
     mqtt_client_mock.publish.assert_called_once_with(
         topic=expected_topic, payload=expected_payload, retain=True,
     )
+    if return_code == MQTT_ERR_SUCCESS:
+        assert len(caplog.records) == 0
+    else:
+        assert len(caplog.records) == 1
+        assert caplog.record_tuples[0] == (
+            "switchbot_mqtt",
+            logging.ERROR,
+            "failed to publish state (rc={})".format(return_code),
+        )