core/tests/components/notify/test_demo.py

214 lines
7.7 KiB
Python
Raw Normal View History

2016-03-09 09:25:50 +00:00
"""The tests for the notify demo platform."""
2015-12-10 07:46:50 +00:00
import unittest
from unittest.mock import patch
2015-12-10 07:46:50 +00:00
import homeassistant.components.notify as notify
from homeassistant.bootstrap import setup_component
2015-12-10 07:46:50 +00:00
from homeassistant.components.notify import demo
from homeassistant.core import callback
from homeassistant.helpers import discovery, script
from tests.common import assert_setup_component, get_test_home_assistant
2015-12-10 07:46:50 +00:00
CONFIG = {
notify.DOMAIN: {
'platform': 'demo'
}
}
2016-02-14 23:08:23 +00:00
2015-12-10 07:46:50 +00:00
class TestNotifyDemo(unittest.TestCase):
2016-03-09 09:25:50 +00:00
"""Test the demo notify."""
2015-12-10 07:46:50 +00:00
def setUp(self): # pylint: disable=invalid-name
2016-03-09 09:25:50 +00:00
"""Setup things to be run when tests are started."""
2016-02-14 23:08:23 +00:00
self.hass = get_test_home_assistant()
2015-12-10 07:46:50 +00:00
self.events = []
self.calls = []
2015-12-10 07:46:50 +00:00
2016-11-04 04:58:18 +00:00
@callback
2015-12-10 07:46:50 +00:00
def record_event(event):
2016-03-09 09:25:50 +00:00
"""Record event to send notification."""
2015-12-10 07:46:50 +00:00
self.events.append(event)
self.hass.bus.listen(demo.EVENT_NOTIFY, record_event)
def tearDown(self): # pylint: disable=invalid-name
2016-03-09 09:25:50 +00:00
""""Stop down everything that was started."""
2015-12-10 07:46:50 +00:00
self.hass.stop()
def _setup_notify(self):
with assert_setup_component(1) as config:
assert setup_component(self.hass, notify.DOMAIN, CONFIG)
assert config[notify.DOMAIN]
def test_setup(self):
"""Test setup."""
self._setup_notify()
@patch('homeassistant.bootstrap.prepare_setup_platform')
def test_no_prepare_setup_platform(self, mock_prep_setup_platform):
"""Test missing notify platform."""
mock_prep_setup_platform.return_value = None
with self.assertLogs('homeassistant.components.notify',
level='ERROR') as log_handle:
self._setup_notify()
self.hass.block_till_done()
assert mock_prep_setup_platform.called
self.assertEqual(
log_handle.output,
['ERROR:homeassistant.components.notify:'
'Unknown notification service specified',
'ERROR:homeassistant.components.notify:'
'Failed to set up platform demo'])
@patch('homeassistant.components.notify.demo.get_service')
def test_no_notify_service(self, mock_demo_get_service):
"""Test missing platform notify service instance."""
mock_demo_get_service.return_value = None
with self.assertLogs('homeassistant.components.notify',
level='ERROR') as log_handle:
self._setup_notify()
self.hass.block_till_done()
assert mock_demo_get_service.called
self.assertEqual(
log_handle.output,
['ERROR:homeassistant.components.notify:'
'Failed to initialize notification service demo',
'ERROR:homeassistant.components.notify:'
'Failed to set up platform demo'])
@patch('homeassistant.components.notify.demo.get_service')
def test_discover_notify(self, mock_demo_get_service):
"""Test discovery of notify demo platform."""
assert notify.DOMAIN not in self.hass.config.components
discovery.load_platform(
self.hass, 'notify', 'demo', {'test_key': 'test_val'}, {})
self.hass.block_till_done()
assert notify.DOMAIN in self.hass.config.components
assert mock_demo_get_service.called
assert mock_demo_get_service.call_args[0] == (
self.hass, {}, {'test_key': 'test_val'})
2016-11-04 04:58:18 +00:00
@callback
def record_calls(self, *args):
"""Helper for recording calls."""
self.calls.append(args)
def test_sending_none_message(self):
"""Test send with None as message."""
self._setup_notify()
notify.send_message(self.hass, None)
self.hass.block_till_done()
self.assertTrue(len(self.events) == 0)
2015-12-10 07:46:50 +00:00
def test_sending_templated_message(self):
2016-03-09 09:25:50 +00:00
"""Send a templated message."""
self._setup_notify()
2015-12-10 07:46:50 +00:00
self.hass.states.set('sensor.temperature', 10)
notify.send_message(self.hass, '{{ states.sensor.temperature.state }}',
'{{ states.sensor.temperature.name }}')
self.hass.block_till_done()
2015-12-10 07:46:50 +00:00
last_event = self.events[-1]
self.assertEqual(last_event.data[notify.ATTR_TITLE], 'temperature')
self.assertEqual(last_event.data[notify.ATTR_MESSAGE], '10')
2016-08-10 03:23:57 +00:00
def test_method_forwards_correct_data(self):
"""Test that all data from the service gets forwarded to service."""
self._setup_notify()
2016-08-10 03:23:57 +00:00
notify.send_message(self.hass, 'my message', 'my title',
{'hello': 'world'})
self.hass.block_till_done()
2016-08-10 03:23:57 +00:00
self.assertTrue(len(self.events) == 1)
data = self.events[0].data
assert {
'message': 'my message',
'title': 'my title',
'data': {'hello': 'world'}
} == data
2016-09-10 14:36:55 +00:00
def test_calling_notify_from_script_loaded_from_yaml_without_title(self):
"""Test if we can call a notify from a script."""
self._setup_notify()
conf = {
'service': 'notify.notify',
'data': {
'data': {
'push': {
'sound':
'US-EN-Morgan-Freeman-Roommate-Is-Arriving.wav'
}
}
},
'data_template': {'message': 'Test 123 {{ 2 + 2 }}\n'},
}
script.call_from_config(self.hass, conf)
self.hass.block_till_done()
self.assertTrue(len(self.events) == 1)
assert {
'message': 'Test 123 4',
2016-09-10 14:36:55 +00:00
'data': {
'push': {
'sound':
'US-EN-Morgan-Freeman-Roommate-Is-Arriving.wav'}}
} == self.events[0].data
def test_calling_notify_from_script_loaded_from_yaml_with_title(self):
"""Test if we can call a notify from a script."""
self._setup_notify()
conf = {
'service': 'notify.notify',
'data': {
'data': {
'push': {
'sound':
'US-EN-Morgan-Freeman-Roommate-Is-Arriving.wav'
}
}
},
'data_template': {
'message': 'Test 123 {{ 2 + 2 }}\n',
'title': 'Test'
}
}
2016-09-10 14:36:55 +00:00
script.call_from_config(self.hass, conf)
self.hass.block_till_done()
2016-09-10 14:36:55 +00:00
self.assertTrue(len(self.events) == 1)
assert {
'message': 'Test 123 4',
'title': 'Test',
'data': {
'push': {
'sound':
'US-EN-Morgan-Freeman-Roommate-Is-Arriving.wav'}}
} == self.events[0].data
def test_targets_are_services(self):
"""Test that all targets are exposed as individual services."""
self._setup_notify()
self.assertIsNotNone(self.hass.services.has_service("notify", "demo"))
service = "demo_test_target_name"
self.assertIsNotNone(self.hass.services.has_service("notify", service))
def test_messages_to_targets_route(self):
"""Test message routing to specific target services."""
self._setup_notify()
self.hass.bus.listen_once("notify", self.record_calls)
self.hass.services.call("notify", "demo_test_target_name",
{'message': 'my message',
'title': 'my title',
'data': {'hello': 'world'}})
self.hass.block_till_done()
data = self.calls[0][0].data
assert {
'message': 'my message',
'target': ['test target id'],
'title': 'my title',
'data': {'hello': 'world'}
} == data