From 7693083be7ed7343447e99f3c22a1e67c3d4cd8b Mon Sep 17 00:00:00 2001 From: Brian Cribbs Date: Wed, 17 May 2017 12:50:37 -0400 Subject: [PATCH] starting unit tests from copypasta --- .../www_static/home-assistant-polymer | 1 - homeassistant/components/light/template.py | 10 +- tests/components/light/test_template.py | 439 ++++++++++++++++++ 3 files changed, 444 insertions(+), 6 deletions(-) delete mode 160000 homeassistant/components/frontend/www_static/home-assistant-polymer create mode 100644 tests/components/light/test_template.py diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer deleted file mode 160000 index aceab5246c1..00000000000 --- a/homeassistant/components/frontend/www_static/home-assistant-polymer +++ /dev/null @@ -1 +0,0 @@ -Subproject commit aceab5246c1cbe1b13e02f298128b272a061b91b diff --git a/homeassistant/components/light/template.py b/homeassistant/components/light/template.py index dcf3e94da7f..b53992a2fbb 100644 --- a/homeassistant/components/light/template.py +++ b/homeassistant/components/light/template.py @@ -115,20 +115,20 @@ class LightTemplate(Light): self._state = state.state == STATE_ON @callback - def template_switch_state_listener(entity, old_state, new_state): + def template_light_state_listener(entity, old_state, new_state): """Handle target device state changes.""" self.hass.async_add_job(self.async_update_ha_state(True)) @callback - def template_switch_startup(event): + def template_light_startup(event): """Update template on startup.""" async_track_state_change( - self.hass, self._entities, template_switch_state_listener) + self.hass, self._entities, template_light_state_listener) self.hass.async_add_job(self.async_update_ha_state(True)) self.hass.bus.async_listen_once( - EVENT_HOMEASSISTANT_START, template_switch_startup) + EVENT_HOMEASSISTANT_START, template_light_startup) @property def brightness(self): @@ -180,7 +180,7 @@ class LightTemplate(Light): self._state = state in ('true', STATE_ON) else: _LOGGER.error( - 'Received invalid switch is_on state: %s. ' + + 'Received invalid light is_on state: %s. ' + 'Expected: %s', state, ', '.join(_VALID_STATES)) self._state = None diff --git a/tests/components/light/test_template.py b/tests/components/light/test_template.py new file mode 100644 index 00000000000..c03c6e30531 --- /dev/null +++ b/tests/components/light/test_template.py @@ -0,0 +1,439 @@ +"""The tests for the Template light platform.""" +import asyncio + +from homeassistant.core import callback, State, CoreState +from homeassistant import setup +import homeassistant.components as core +from homeassistant.const import STATE_ON, STATE_OFF +from homeassistant.helpers.restore_state import DATA_RESTORE_CACHE + +from tests.common import ( + get_test_home_assistant, assert_setup_component, mock_component) + + +class TestTemplateLight: + """Test the Template light.""" + + hass = None + calls = None + # pylint: disable=invalid-name + + def setup_method(self, method): + """Setup things to be run when tests are started.""" + self.hass = get_test_home_assistant() + self.calls = [] + + @callback + def record_call(service): + """Track function calls..""" + self.calls.append(service) + + self.hass.services.register('test', 'automation', record_call) + + def teardown_method(self, method): + """Stop everything that was started.""" + self.hass.stop() + + def test_template_state_text(self): + """"Test the state text of a template.""" + with assert_setup_component(1): + assert setup.setup_component(self.hass, 'light', { + 'light': { + 'platform': 'template', + 'lights': { + 'test_template_light': { + 'value_template': + "{{ states.light.test_state.state }}", + 'turn_on': { + 'service': 'light.turn_on', + 'entity_id': 'light.test_state' + }, + 'turn_off': { + 'service': 'light.turn_off', + 'entity_id': 'light.test_state' + }, + 'set_level': { + 'service': 'light.turn_on', + 'data_template': { + 'entity_id': 'light.test_state', + 'brightness': '{{brightness}}' + } + } + } + } + } + }) + + self.hass.start() + self.hass.block_till_done() + + state = self.hass.states.set('light.test_state', STATE_ON) + self.hass.block_till_done() + + state = self.hass.states.get('light.test_template_light') + assert state.state == STATE_ON + + state = self.hass.states.set('light.test_state', STATE_OFF) + self.hass.block_till_done() + + state = self.hass.states.get('light.test_template_light') + assert state.state == STATE_OFF + + def test_template_state_boolean_on(self): + """Test the setting of the state with boolean on.""" + with assert_setup_component(1): + assert setup.setup_component(self.hass, 'light', { + 'light': { + 'platform': 'template', + 'lights': { + 'test_template_light': { + 'value_template': "{{ 1 == 1 }}", + 'turn_on': { + 'service': 'light.turn_on', + 'entity_id': 'light.test_state' + }, + 'turn_off': { + 'service': 'light.turn_off', + 'entity_id': 'light.test_state' + }, + 'set_level': { + 'service': 'light.turn_on', + 'data_template': { + 'entity_id': 'light.test_state', + 'brightness': '{{brightness}}' + } + } + } + } + } + }) + + self.hass.start() + self.hass.block_till_done() + + state = self.hass.states.get('light.test_template_light') + assert state.state == STATE_ON + + def test_template_state_boolean_off(self): + """Test the setting of the state with off.""" + with assert_setup_component(1): + assert setup.setup_component(self.hass, 'light', { + 'light': { + 'platform': 'template', + 'lights': { + 'test_template_light': { + 'value_template': "{{ 1 == 2 }}", + 'turn_on': { + 'service': 'light.turn_on', + 'entity_id': 'light.test_state' + }, + 'turn_off': { + 'service': 'light.turn_off', + 'entity_id': 'light.test_state' + }, + 'set_level': { + 'service': 'light.turn_on', + 'data_template': { + 'entity_id': 'light.test_state', + 'brightness': '{{brightness}}' + } + } + } + } + } + }) + + self.hass.start() + self.hass.block_till_done() + + state = self.hass.states.get('light.test_template_light') + assert state.state == STATE_OFF + + def test_template_syntax_error(self): + """Test templating syntax error.""" + with assert_setup_component(1): + assert setup.setup_component(self.hass, 'light', { + 'light': { + 'platform': 'template', + 'lights': { + 'test_template_light': { + 'value_template': "{%- if false -%}", + 'turn_on': { + 'service': 'light.turn_on', + 'entity_id': 'light.test_state' + }, + 'turn_off': { + 'service': 'light.turn_off', + 'entity_id': 'light.test_state' + }, + 'set_level': { + 'service': 'light.turn_on', + 'data_template': { + 'entity_id': 'light.test_state', + 'brightness': '{{brightness}}' + } + } + } + } + } + }) + + self.hass.start() + self.hass.block_till_done() + + assert self.hass.states.all() == [] + + def test_invalid_name_does_not_create(self): + """Test invalid name.""" + with assert_setup_component(0): + assert setup.setup_component(self.hass, 'switch', { + 'switch': { + 'platform': 'template', + 'switches': { + 'test INVALID switch': { + 'value_template': + "{{ rubbish }", + 'turn_on': { + 'service': 'switch.turn_on', + 'entity_id': 'switch.test_state' + }, + 'turn_off': { + 'service': 'switch.turn_off', + 'entity_id': 'switch.test_state' + }, + } + } + } + }) + + self.hass.start() + self.hass.block_till_done() + + assert self.hass.states.all() == [] + + def test_invalid_switch_does_not_create(self): + """Test invalid switch.""" + with assert_setup_component(0): + assert setup.setup_component(self.hass, 'switch', { + 'switch': { + 'platform': 'template', + 'switches': { + 'test_template_switch': 'Invalid' + } + } + }) + + self.hass.start() + self.hass.block_till_done() + + assert self.hass.states.all() == [] + + def test_no_switches_does_not_create(self): + """Test if there are no switches no creation.""" + with assert_setup_component(0): + assert setup.setup_component(self.hass, 'switch', { + 'switch': { + 'platform': 'template' + } + }) + + self.hass.start() + self.hass.block_till_done() + + assert self.hass.states.all() == [] + + def test_missing_template_does_not_create(self): + """Test missing template.""" + with assert_setup_component(0): + assert setup.setup_component(self.hass, 'switch', { + 'switch': { + 'platform': 'template', + 'switches': { + 'test_template_switch': { + 'not_value_template': + "{{ states.switch.test_state.state }}", + 'turn_on': { + 'service': 'switch.turn_on', + 'entity_id': 'switch.test_state' + }, + 'turn_off': { + 'service': 'switch.turn_off', + 'entity_id': 'switch.test_state' + }, + } + } + } + }) + + self.hass.start() + self.hass.block_till_done() + + assert self.hass.states.all() == [] + + def test_missing_on_does_not_create(self): + """Test missing on.""" + with assert_setup_component(0): + assert setup.setup_component(self.hass, 'switch', { + 'switch': { + 'platform': 'template', + 'switches': { + 'test_template_switch': { + 'value_template': + "{{ states.switch.test_state.state }}", + 'not_on': { + 'service': 'switch.turn_on', + 'entity_id': 'switch.test_state' + }, + 'turn_off': { + 'service': 'switch.turn_off', + 'entity_id': 'switch.test_state' + }, + } + } + } + }) + + self.hass.start() + self.hass.block_till_done() + + assert self.hass.states.all() == [] + + def test_missing_off_does_not_create(self): + """Test missing off.""" + with assert_setup_component(0): + assert setup.setup_component(self.hass, 'switch', { + 'switch': { + 'platform': 'template', + 'switches': { + 'test_template_switch': { + 'value_template': + "{{ states.switch.test_state.state }}", + 'turn_on': { + 'service': 'switch.turn_on', + 'entity_id': 'switch.test_state' + }, + 'not_off': { + 'service': 'switch.turn_off', + 'entity_id': 'switch.test_state' + }, + } + } + } + }) + + self.hass.start() + self.hass.block_till_done() + + assert self.hass.states.all() == [] + + def test_on_action(self): + """Test on action.""" + assert setup.setup_component(self.hass, 'switch', { + 'switch': { + 'platform': 'template', + 'switches': { + 'test_template_switch': { + 'value_template': + "{{ states.switch.test_state.state }}", + 'turn_on': { + 'service': 'test.automation' + }, + 'turn_off': { + 'service': 'switch.turn_off', + 'entity_id': 'switch.test_state' + }, + } + } + } + }) + + self.hass.start() + self.hass.block_till_done() + + self.hass.states.set('switch.test_state', STATE_OFF) + self.hass.block_till_done() + + state = self.hass.states.get('switch.test_template_switch') + assert state.state == STATE_OFF + + core.switch.turn_on(self.hass, 'switch.test_template_switch') + self.hass.block_till_done() + + assert len(self.calls) == 1 + + def test_off_action(self): + """Test off action.""" + assert setup.setup_component(self.hass, 'switch', { + 'switch': { + 'platform': 'template', + 'switches': { + 'test_template_switch': { + 'value_template': + "{{ states.switch.test_state.state }}", + 'turn_on': { + 'service': 'switch.turn_on', + 'entity_id': 'switch.test_state' + + }, + 'turn_off': { + 'service': 'test.automation' + }, + } + } + } + }) + + self.hass.start() + self.hass.block_till_done() + + self.hass.states.set('switch.test_state', STATE_ON) + self.hass.block_till_done() + + state = self.hass.states.get('switch.test_template_switch') + assert state.state == STATE_ON + + core.switch.turn_off(self.hass, 'switch.test_template_switch') + self.hass.block_till_done() + + assert len(self.calls) == 1 + + +@asyncio.coroutine +def test_restore_state(hass): + """Ensure states are restored on startup.""" + hass.data[DATA_RESTORE_CACHE] = { + 'switch.test_template_switch': + State('switch.test_template_switch', 'on'), + } + + hass.state = CoreState.starting + mock_component(hass, 'recorder') + + yield from setup.async_setup_component(hass, 'switch', { + 'switch': { + 'platform': 'template', + 'switches': { + 'test_template_switch': { + 'value_template': + "{{ states.switch.test_state.state }}", + 'turn_on': { + 'service': 'switch.turn_on', + 'entity_id': 'switch.test_state' + }, + 'turn_off': { + 'service': 'switch.turn_off', + 'entity_id': 'switch.test_state' + }, + } + } + } + }) + + state = hass.states.get('switch.test_template_switch') + assert state.state == 'on' + + yield from hass.async_start() + yield from hass.async_block_till_done() + + state = hass.states.get('switch.test_template_switch') + assert state.state == 'unavailable'