"""The tests for the Datadog component.""" from unittest import mock import unittest from homeassistant.const import ( EVENT_LOGBOOK_ENTRY, EVENT_STATE_CHANGED, STATE_OFF, STATE_ON ) from homeassistant.setup import setup_component import homeassistant.components.datadog as datadog import homeassistant.core as ha from tests.common import (assert_setup_component, get_test_home_assistant, MockDependency) class TestDatadog(unittest.TestCase): """Test the Datadog component.""" def setUp(self): # pylint: disable=invalid-name """Set up things to be run when tests are started.""" self.hass = get_test_home_assistant() def tearDown(self): # pylint: disable=invalid-name """Stop everything that was started.""" self.hass.stop() def test_invalid_config(self): """Test invalid configuration.""" with assert_setup_component(0): assert not setup_component(self.hass, datadog.DOMAIN, { datadog.DOMAIN: { 'host1': 'host1' } }) @MockDependency('datadog', 'beer') def test_datadog_setup_full(self, mock_datadog): """Test setup with all data.""" self.hass.bus.listen = mock.MagicMock() mock_connection = mock_datadog.initialize assert setup_component(self.hass, datadog.DOMAIN, { datadog.DOMAIN: { 'host': 'host', 'port': 123, 'rate': 1, 'prefix': 'foo', } }) assert mock_connection.call_count == 1 assert mock_connection.call_args == \ mock.call(statsd_host='host', statsd_port=123) assert self.hass.bus.listen.called assert EVENT_LOGBOOK_ENTRY == \ self.hass.bus.listen.call_args_list[0][0][0] assert EVENT_STATE_CHANGED == \ self.hass.bus.listen.call_args_list[1][0][0] @MockDependency('datadog') def test_datadog_setup_defaults(self, mock_datadog): """Test setup with defaults.""" self.hass.bus.listen = mock.MagicMock() mock_connection = mock_datadog.initialize assert setup_component(self.hass, datadog.DOMAIN, { datadog.DOMAIN: { 'host': 'host', 'port': datadog.DEFAULT_PORT, 'prefix': datadog.DEFAULT_PREFIX, } }) assert mock_connection.call_count == 1 assert mock_connection.call_args == \ mock.call(statsd_host='host', statsd_port=8125) assert self.hass.bus.listen.called @MockDependency('datadog') def test_logbook_entry(self, mock_datadog): """Test event listener.""" self.hass.bus.listen = mock.MagicMock() mock_client = mock_datadog.statsd assert setup_component(self.hass, datadog.DOMAIN, { datadog.DOMAIN: { 'host': 'host', 'rate': datadog.DEFAULT_RATE, } }) assert self.hass.bus.listen.called handler_method = self.hass.bus.listen.call_args_list[0][0][1] event = { 'domain': 'automation', 'entity_id': 'sensor.foo.bar', 'message': 'foo bar biz', 'name': 'triggered something' } handler_method(mock.MagicMock(data=event)) assert mock_client.event.call_count == 1 assert mock_client.event.call_args == \ mock.call( title="Home Assistant", text="%%% \n **{}** {} \n %%%".format( event['name'], event['message'] ), tags=["entity:sensor.foo.bar", "domain:automation"] ) mock_client.event.reset_mock() @MockDependency('datadog') def test_state_changed(self, mock_datadog): """Test event listener.""" self.hass.bus.listen = mock.MagicMock() mock_client = mock_datadog.statsd assert setup_component(self.hass, datadog.DOMAIN, { datadog.DOMAIN: { 'host': 'host', 'prefix': 'ha', 'rate': datadog.DEFAULT_RATE, } }) assert self.hass.bus.listen.called handler_method = self.hass.bus.listen.call_args_list[1][0][1] valid = { '1': 1, '1.0': 1.0, STATE_ON: 1, STATE_OFF: 0 } attributes = { 'elevation': 3.2, 'temperature': 5.0 } for in_, out in valid.items(): state = mock.MagicMock(domain="sensor", entity_id="sensor.foo.bar", state=in_, attributes=attributes) handler_method(mock.MagicMock(data={'new_state': state})) assert mock_client.gauge.call_count == 3 for attribute, value in attributes.items(): mock_client.gauge.assert_has_calls([ mock.call( "ha.sensor.{}".format(attribute), value, sample_rate=1, tags=["entity:{}".format(state.entity_id)] ) ]) assert mock_client.gauge.call_args == \ mock.call("ha.sensor", out, sample_rate=1, tags=[ "entity:{}".format(state.entity_id) ]) mock_client.gauge.reset_mock() for invalid in ('foo', '', object): handler_method(mock.MagicMock(data={ 'new_state': ha.State('domain.test', invalid, {})})) assert not mock_client.gauge.called