2016-03-07 16:45:37 -08:00
|
|
|
"""The tests for the MQTT component embedded server."""
|
2016-10-17 23:16:36 -04:00
|
|
|
from unittest.mock import Mock, MagicMock, patch
|
2016-03-07 16:45:37 -08:00
|
|
|
|
2018-08-13 02:26:06 -07:00
|
|
|
from homeassistant.const import CONF_PASSWORD
|
2017-03-05 01:41:54 -08:00
|
|
|
from homeassistant.setup import setup_component
|
2016-03-07 16:45:37 -08:00
|
|
|
import homeassistant.components.mqtt as mqtt
|
|
|
|
|
2018-02-15 13:06:14 -08:00
|
|
|
from tests.common import get_test_home_assistant, mock_coro
|
2016-03-07 16:45:37 -08:00
|
|
|
|
|
|
|
|
|
|
|
class TestMQTT:
|
|
|
|
"""Test the MQTT component."""
|
|
|
|
|
|
|
|
def setup_method(self, method):
|
2018-08-19 22:29:08 +02:00
|
|
|
"""Set up things to be run when tests are started."""
|
2016-03-07 16:45:37 -08:00
|
|
|
self.hass = get_test_home_assistant()
|
|
|
|
|
|
|
|
def teardown_method(self, method):
|
|
|
|
"""Stop everything that was started."""
|
|
|
|
self.hass.stop()
|
|
|
|
|
2016-10-17 23:16:36 -04:00
|
|
|
@patch('passlib.apps.custom_app_context', Mock(return_value=''))
|
|
|
|
@patch('tempfile.NamedTemporaryFile', Mock(return_value=MagicMock()))
|
2016-11-10 22:45:38 -08:00
|
|
|
@patch('hbmqtt.broker.Broker', Mock(return_value=MagicMock()))
|
2017-02-18 23:17:18 +01:00
|
|
|
@patch('hbmqtt.broker.Broker.start', Mock(return_value=mock_coro()))
|
2016-03-07 16:45:37 -08:00
|
|
|
@patch('homeassistant.components.mqtt.MQTT')
|
2018-08-13 02:26:06 -07:00
|
|
|
def test_creating_config_with_http_pass_only(self, mock_mqtt):
|
|
|
|
"""Test if the MQTT server failed starts.
|
|
|
|
|
2018-08-19 22:29:08 +02:00
|
|
|
Since 0.77, MQTT server has to set up its own password.
|
2018-08-13 02:26:06 -07:00
|
|
|
If user has api_password but don't have mqtt.password, MQTT component
|
|
|
|
will fail to start
|
|
|
|
"""
|
2017-02-19 22:43:10 -08:00
|
|
|
mock_mqtt().async_connect.return_value = mock_coro(True)
|
2016-11-10 22:45:38 -08:00
|
|
|
self.hass.bus.listen_once = MagicMock()
|
2018-08-13 02:26:06 -07:00
|
|
|
assert not setup_component(self.hass, mqtt.DOMAIN, {
|
|
|
|
'http': {'api_password': 'http_secret'}
|
|
|
|
})
|
2016-03-07 16:45:37 -08:00
|
|
|
|
2018-08-13 02:26:06 -07:00
|
|
|
@patch('passlib.apps.custom_app_context', Mock(return_value=''))
|
|
|
|
@patch('tempfile.NamedTemporaryFile', Mock(return_value=MagicMock()))
|
|
|
|
@patch('hbmqtt.broker.Broker', Mock(return_value=MagicMock()))
|
|
|
|
@patch('hbmqtt.broker.Broker.start', Mock(return_value=mock_coro()))
|
|
|
|
@patch('homeassistant.components.mqtt.MQTT')
|
|
|
|
def test_creating_config_with_pass_and_no_http_pass(self, mock_mqtt):
|
|
|
|
"""Test if the MQTT server gets started with password.
|
|
|
|
|
2018-08-19 22:29:08 +02:00
|
|
|
Since 0.77, MQTT server has to set up its own password.
|
2018-08-13 02:26:06 -07:00
|
|
|
"""
|
|
|
|
mock_mqtt().async_connect.return_value = mock_coro(True)
|
|
|
|
self.hass.bus.listen_once = MagicMock()
|
|
|
|
password = 'mqtt_secret'
|
|
|
|
|
|
|
|
assert setup_component(self.hass, mqtt.DOMAIN, {
|
|
|
|
mqtt.DOMAIN: {CONF_PASSWORD: password},
|
|
|
|
})
|
|
|
|
assert mock_mqtt.called
|
|
|
|
from pprint import pprint
|
|
|
|
pprint(mock_mqtt.mock_calls)
|
2018-09-14 11:57:31 +02:00
|
|
|
assert mock_mqtt.mock_calls[1][2]['username'] == 'homeassistant'
|
|
|
|
assert mock_mqtt.mock_calls[1][2]['password'] == password
|
2018-08-13 02:26:06 -07:00
|
|
|
|
|
|
|
@patch('passlib.apps.custom_app_context', Mock(return_value=''))
|
|
|
|
@patch('tempfile.NamedTemporaryFile', Mock(return_value=MagicMock()))
|
|
|
|
@patch('hbmqtt.broker.Broker', Mock(return_value=MagicMock()))
|
|
|
|
@patch('hbmqtt.broker.Broker.start', Mock(return_value=mock_coro()))
|
|
|
|
@patch('homeassistant.components.mqtt.MQTT')
|
|
|
|
def test_creating_config_with_pass_and_http_pass(self, mock_mqtt):
|
|
|
|
"""Test if the MQTT server gets started with password.
|
|
|
|
|
2018-08-19 22:29:08 +02:00
|
|
|
Since 0.77, MQTT server has to set up its own password.
|
2018-08-13 02:26:06 -07:00
|
|
|
"""
|
|
|
|
mock_mqtt().async_connect.return_value = mock_coro(True)
|
|
|
|
self.hass.bus.listen_once = MagicMock()
|
|
|
|
password = 'mqtt_secret'
|
|
|
|
|
|
|
|
self.hass.config.api = MagicMock(api_password='api_password')
|
|
|
|
assert setup_component(self.hass, mqtt.DOMAIN, {
|
|
|
|
'http': {'api_password': 'http_secret'},
|
|
|
|
mqtt.DOMAIN: {CONF_PASSWORD: password},
|
|
|
|
})
|
2016-03-07 16:45:37 -08:00
|
|
|
assert mock_mqtt.called
|
2017-03-01 05:33:19 +01:00
|
|
|
from pprint import pprint
|
|
|
|
pprint(mock_mqtt.mock_calls)
|
2018-09-14 11:57:31 +02:00
|
|
|
assert mock_mqtt.mock_calls[1][2]['username'] == 'homeassistant'
|
|
|
|
assert mock_mqtt.mock_calls[1][2]['password'] == password
|
2016-03-07 16:45:37 -08:00
|
|
|
|
2016-10-17 23:16:36 -04:00
|
|
|
@patch('tempfile.NamedTemporaryFile', Mock(return_value=MagicMock()))
|
2017-02-18 23:17:18 +01:00
|
|
|
@patch('hbmqtt.broker.Broker.start', return_value=mock_coro())
|
2016-11-10 22:45:38 -08:00
|
|
|
def test_broker_config_fails(self, mock_run):
|
2016-03-07 16:45:37 -08:00
|
|
|
"""Test if the MQTT component fails if server fails."""
|
|
|
|
from hbmqtt.broker import BrokerException
|
|
|
|
|
2016-11-10 22:45:38 -08:00
|
|
|
mock_run.side_effect = BrokerException
|
2016-03-07 16:45:37 -08:00
|
|
|
|
|
|
|
self.hass.config.api = MagicMock(api_password=None)
|
2016-10-27 09:16:23 +02:00
|
|
|
|
|
|
|
assert not setup_component(self.hass, mqtt.DOMAIN, {
|
2016-04-04 00:22:04 -04:00
|
|
|
mqtt.DOMAIN: {mqtt.CONF_EMBEDDED: {}}
|
2016-03-07 16:45:37 -08:00
|
|
|
})
|