Beispiel #1
0
def test__mqtt_update_device_info_callback_ignore_retained(
    caplog: _pytest.logging.LogCaptureFixture, ) -> None:
    ActorMock = _mock_actor_class(
        request_info_levels=(_MQTTTopicPlaceholder.MAC_ADDRESS, "request"))
    message = MQTTMessage(topic=b"aa:bb:cc:dd:ee:ff/request")
    message.payload = b""
    message.retain = True
    with unittest.mock.patch.object(
            ActorMock, "__init__",
            return_value=None) as init_mock, unittest.mock.patch.object(
                ActorMock,
                "execute_command") as execute_command_mock, caplog.at_level(
                    logging.DEBUG):
        ActorMock._mqtt_update_device_info_callback(
            "client_dummy",
            _MQTTCallbackUserdata(
                retry_count=21,
                device_passwords={},
                fetch_device_info=True,
                mqtt_topic_prefix="ignored",
            ),
            message,
        )
    init_mock.assert_not_called()
    execute_command_mock.assert_not_called()
    assert caplog.record_tuples == [
        (
            "switchbot_mqtt._actors.base",
            logging.DEBUG,
            "received topic=aa:bb:cc:dd:ee:ff/request payload=b''",
        ),
        ("switchbot_mqtt._actors.base", logging.INFO,
         "ignoring retained message"),
    ]
Beispiel #2
0
def test__mqtt_command_callback_ignore_retained(
        caplog: _pytest.logging.LogCaptureFixture, topic: bytes,
        payload: bytes) -> None:
    ActorMock = _mock_actor_class(
        command_topic_levels=_ButtonAutomator.MQTT_COMMAND_TOPIC_LEVELS)
    message = MQTTMessage(topic=topic)
    message.payload = payload
    message.retain = True
    with unittest.mock.patch.object(
            ActorMock, "__init__",
            return_value=None) as init_mock, unittest.mock.patch.object(
                ActorMock,
                "execute_command") as execute_command_mock, caplog.at_level(
                    logging.DEBUG):
        ActorMock._mqtt_command_callback(
            "client_dummy",
            _MQTTCallbackUserdata(
                retry_count=4,
                device_passwords={},
                fetch_device_info=True,
                mqtt_topic_prefix="homeassistant/",
            ),
            message,
        )
    init_mock.assert_not_called()
    execute_command_mock.assert_not_called()
    assert caplog.record_tuples == [
        (
            "switchbot_mqtt._actors.base",
            logging.DEBUG,
            f"received topic={topic.decode()} payload={payload!r}",
        ),
        ("switchbot_mqtt._actors.base", logging.INFO,
         "ignoring retained message"),
    ]
Beispiel #3
0
def test__mqtt_on_message_ignored_retained(topic: bytes, payload: bytes):
    message = MQTTMessage(topic=topic)
    message.payload = payload
    message.retain = True
    with unittest.mock.patch("switchbot_mqtt._send_command") as send_command_mock:
        switchbot_mqtt._mqtt_on_message(None, None, message)
    assert not send_command_mock.called
Beispiel #4
0
def test__mqtt_set_position_callback_ignore_retained(
    caplog: _pytest.logging.LogCaptureFixture, ) -> None:
    callback_userdata = _MQTTCallbackUserdata(
        retry_count=3,
        device_passwords={},
        fetch_device_info=False,
        mqtt_topic_prefix="whatever",
    )
    message = MQTTMessage(
        topic=
        b"homeassistant/cover/switchbot-curtain/aa:bb:cc:dd:ee:ff/position/set-percent"
    )
    message.payload = b"42"
    message.retain = True
    with unittest.mock.patch(
            "switchbot.SwitchbotCurtain") as device_init_mock, caplog.at_level(
                logging.INFO):
        _CurtainMotor._mqtt_set_position_callback(mqtt_client="client dummy",
                                                  userdata=callback_userdata,
                                                  message=message)
    device_init_mock.assert_not_called()
    assert caplog.record_tuples == [
        (
            "switchbot_mqtt._actors",
            logging.INFO,
            "ignoring retained message on topic"
            " homeassistant/cover/switchbot-curtain/aa:bb:cc:dd:ee:ff/position/set-percent",
        ),
    ]
Beispiel #5
0
def test__mqtt_command_callback_ignore_retained(caplog, topic: bytes,
                                                payload: bytes):
    ActorMock = _mock_actor_class(
        switchbot_mqtt._ButtonAutomator.MQTT_COMMAND_TOPIC_LEVELS)
    message = MQTTMessage(topic=topic)
    message.payload = payload
    message.retain = True
    with unittest.mock.patch.object(
            ActorMock, "__init__",
            return_value=None) as init_mock, unittest.mock.patch.object(
                ActorMock,
                "execute_command") as execute_command_mock, caplog.at_level(
                    logging.DEBUG):
        ActorMock._mqtt_command_callback(
            "client_dummy",
            switchbot_mqtt._MQTTCallbackUserdata(retry_count=4,
                                                 device_passwords={}),
            message,
        )
    init_mock.assert_not_called()
    execute_command_mock.assert_not_called()
    assert caplog.record_tuples == [
        (
            "switchbot_mqtt",
            logging.DEBUG,
            "received topic={} payload={!r}".format(topic.decode(), payload),
        ),
        ("switchbot_mqtt", logging.INFO, "ignoring retained message"),
    ]
Beispiel #6
0
 def private_publish(self, topic, payload=None, qos=0, retain=False):
     """
     Queue message internally without distribute to MQTT.
     """
     msg = MQTTMessage(topic=topic.encode())
     msg.payload = payload.encode() if payload else None
     msg.qos = qos
     msg.retain = retain
     self._queue.put(msg)
Beispiel #7
0
def test_mqtt_message_callback_poweroff_retained(caplog, mqtt_topic: str,
                                                 payload: bytes):
    message = MQTTMessage(topic=mqtt_topic.encode())
    message.payload = payload
    message.retain = True
    with unittest.mock.patch.object(
            systemctl_mqtt._MQTT_TOPIC_SUFFIX_ACTION_MAPPING["poweroff"],
            "trigger") as trigger_mock, caplog.at_level(logging.DEBUG):
        systemctl_mqtt._MQTT_TOPIC_SUFFIX_ACTION_MAPPING[
            "poweroff"].mqtt_message_callback(
                None,
                None,
                message  # type: ignore
            )
    trigger_mock.assert_not_called()
    assert len(caplog.records) == 2
    assert caplog.records[0].levelno == logging.DEBUG
    assert caplog.records[0].message == (
        "received topic={} payload={!r}".format(mqtt_topic, payload))
    assert caplog.records[1].levelno == logging.INFO
    assert caplog.records[1].message == "ignoring retained message"