Пример #1
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"),
    ]
Пример #2
0
def test__mqtt_command_callback_invalid_mac_address(caplog, mac_address: str,
                                                    payload: bytes):
    ActorMock = _mock_actor_class(
        switchbot_mqtt._ButtonAutomator.MQTT_COMMAND_TOPIC_LEVELS)
    topic = "homeassistant/switch/switchbot/{}/set".format(
        mac_address).encode()
    message = MQTTMessage(topic=topic)
    message.payload = payload
    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=3,
                                                 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.WARNING,
            "invalid mac address {}".format(mac_address),
        ),
    ]
Пример #3
0
def test__mqtt_command_callback_password(mac_address, expected_password):
    ActorMock = _mock_actor_class([
        "switchbot",
        switchbot_mqtt._MQTTTopicPlaceholder.MAC_ADDRESS,
    ])
    message = MQTTMessage(topic=b"switchbot/" + mac_address.encode())
    message.payload = b"whatever"
    callback_userdata = switchbot_mqtt._MQTTCallbackUserdata(
        retry_count=3,
        device_passwords={
            "11:22:33:44:55:77": "test",
            "aa:bb:cc:dd:ee:ff": "secret",
            "11:22:33:dd:ee:ff": "äöü",
        },
    )
    with unittest.mock.patch.object(
            ActorMock, "__init__",
            return_value=None) as init_mock, unittest.mock.patch.object(
                ActorMock, "execute_command") as execute_command_mock:
        ActorMock._mqtt_command_callback("client_dummy", callback_userdata,
                                         message)
    init_mock.assert_called_once_with(mac_address=mac_address,
                                      retry_count=3,
                                      password=expected_password)
    execute_command_mock.assert_called_once_with(
        mqtt_client="client_dummy", mqtt_message_payload=b"whatever")
Пример #4
0
def test__mqtt_command_callback(
    caplog,
    command_topic_levels: typing.List[switchbot_mqtt._MQTTTopicLevel],
    topic: bytes,
    payload: bytes,
    expected_mac_address: str,
    retry_count: int,
):
    ActorMock = _mock_actor_class(command_topic_levels)
    message = MQTTMessage(topic=topic)
    message.payload = payload
    callback_userdata = switchbot_mqtt._MQTTCallbackUserdata(
        retry_count=retry_count, device_passwords={})
    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", callback_userdata,
                                         message)
    init_mock.assert_called_once_with(mac_address=expected_mac_address,
                                      retry_count=retry_count,
                                      password=None)
    execute_command_mock.assert_called_once_with(mqtt_client="client_dummy",
                                                 mqtt_message_payload=payload)
    assert caplog.record_tuples == [(
        "switchbot_mqtt",
        logging.DEBUG,
        "received topic={} payload={!r}".format(topic.decode(), payload),
    )]
Пример #5
0
def test__run_authentication(mqtt_host, mqtt_port, mqtt_username,
                             mqtt_password):
    with unittest.mock.patch("paho.mqtt.client.Client") as mqtt_client_mock:
        switchbot_mqtt._run(
            mqtt_host=mqtt_host,
            mqtt_port=mqtt_port,
            mqtt_username=mqtt_username,
            mqtt_password=mqtt_password,
            retry_count=7,
            device_passwords={},
        )
    mqtt_client_mock.assert_called_once_with(
        userdata=switchbot_mqtt._MQTTCallbackUserdata(retry_count=7,
                                                      device_passwords={}))
    mqtt_client_mock().username_pw_set.assert_called_once_with(
        username=mqtt_username, password=mqtt_password)
Пример #6
0
def test__run(caplog, mqtt_host, mqtt_port, retry_count, device_passwords):
    with unittest.mock.patch(
            "paho.mqtt.client.Client") as mqtt_client_mock, caplog.at_level(
                logging.DEBUG):
        switchbot_mqtt._run(
            mqtt_host=mqtt_host,
            mqtt_port=mqtt_port,
            mqtt_username=None,
            mqtt_password=None,
            retry_count=retry_count,
            device_passwords=device_passwords,
        )
    mqtt_client_mock.assert_called_once_with(
        userdata=switchbot_mqtt._MQTTCallbackUserdata(
            retry_count=retry_count,
            device_passwords=device_passwords,
        ))
    assert not mqtt_client_mock().username_pw_set.called
    mqtt_client_mock().connect.assert_called_once_with(host=mqtt_host,
                                                       port=mqtt_port)
    mqtt_client_mock().socket().getpeername.return_value = (mqtt_host,
                                                            mqtt_port)
    with caplog.at_level(logging.DEBUG):
        mqtt_client_mock().on_connect(mqtt_client_mock(), None, {}, 0)
    assert mqtt_client_mock().subscribe.call_args_list == [
        unittest.mock.call("homeassistant/switch/switchbot/+/set"),
        unittest.mock.call("homeassistant/cover/switchbot-curtain/+/set"),
    ]
    assert mqtt_client_mock().message_callback_add.call_args_list == [
        unittest.mock.call(
            sub="homeassistant/switch/switchbot/+/set",
            callback=switchbot_mqtt._ButtonAutomator._mqtt_command_callback,
        ),
        unittest.mock.call(
            sub="homeassistant/cover/switchbot-curtain/+/set",
            callback=switchbot_mqtt._CurtainMotor._mqtt_command_callback,
        ),
    ]
    mqtt_client_mock().loop_forever.assert_called_once_with()
    assert caplog.record_tuples == [
        (
            "switchbot_mqtt",
            logging.INFO,
            "connecting to MQTT broker {}:{}".format(mqtt_host, mqtt_port),
        ),
        (
            "switchbot_mqtt",
            logging.DEBUG,
            "connected to MQTT broker {}:{}".format(mqtt_host, mqtt_port),
        ),
        (
            "switchbot_mqtt",
            logging.INFO,
            "subscribing to MQTT topic 'homeassistant/switch/switchbot/+/set'",
        ),
        (
            "switchbot_mqtt",
            logging.INFO,
            "subscribing to MQTT topic 'homeassistant/cover/switchbot-curtain/+/set'",
        ),
    ]