def test_if_not_fires_on_entity_change_with_for(self): """Test for not firing on entity change with for.""" assert setup_component(self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'numeric_state', 'entity_id': 'test.entity', 'above': 8, 'below': 12, 'for': { 'seconds': 5 }, }, 'action': { 'service': 'test.automation' } } }) self.hass.states.set('test.entity', 9) self.hass.block_till_done() self.hass.states.set('test.entity', 15) self.hass.block_till_done() fire_time_changed(self.hass, dt_util.utcnow() + timedelta(seconds=10)) self.hass.block_till_done() self.assertEqual(0, len(self.calls))
def test_flux_before_sunrise(self): """Test the flux switch before sunrise.""" platform = loader.get_component("light.test") platform.init() self.assertTrue(light.setup(self.hass, {light.DOMAIN: {CONF_PLATFORM: "test"}})) dev1 = platform.DEVICES[0] # Verify initial state of light state = self.hass.states.get(dev1.entity_id) self.assertEqual(STATE_ON, state.state) self.assertIsNone(state.attributes.get("xy_color")) self.assertIsNone(state.attributes.get("brightness")) test_time = dt_util.now().replace(hour=2, minute=30, second=0) sunset_time = test_time.replace(hour=17, minute=0, second=0) sunrise_time = test_time.replace(hour=5, minute=0, second=0) + timedelta(days=1) with patch("homeassistant.util.dt.now", return_value=test_time): with patch("homeassistant.components.sun.next_rising", return_value=sunrise_time): with patch("homeassistant.components.sun.next_setting", return_value=sunset_time): assert setup_component( self.hass, switch.DOMAIN, {switch.DOMAIN: {"platform": "flux", "name": "flux", "lights": [dev1.entity_id]}}, ) turn_on_calls = mock_service(self.hass, light.DOMAIN, SERVICE_TURN_ON) switch.turn_on(self.hass, "switch.flux") self.hass.pool.block_till_done() fire_time_changed(self.hass, test_time) self.hass.pool.block_till_done() call = turn_on_calls[-1] self.assertEqual(call.data[light.ATTR_BRIGHTNESS], 119) self.assertEqual(call.data[light.ATTR_XY_COLOR], [0.591, 0.395])
def test_delay_template(self): """Test the delay as a template.""" event = 'test_evnt' events = [] @callback def record_event(event): """Add recorded event to set.""" events.append(event) self.hass.bus.listen(event, record_event) script_obj = script.Script(self.hass, cv.SCRIPT_SCHEMA([ {'event': event}, {'delay': '00:00:{{ 5 }}'}, {'event': event}])) script_obj.run() self.hass.block_till_done() assert script_obj.is_running assert script_obj.can_cancel assert script_obj.last_action == event assert len(events) == 1 future = dt_util.utcnow() + timedelta(seconds=5) fire_time_changed(self.hass, future) self.hass.block_till_done() assert not script_obj.is_running assert len(events) == 2
def test_delay(self): """Test the delay.""" event = 'test_event' events = [] def record_event(event): """Add recorded event to set.""" events.append(event) self.hass.bus.listen(event, record_event) script_obj = script.Script(self.hass, [ {'event': event}, {'delay': {'seconds': 5}}, {'event': event}]) script_obj.run() self.hass.pool.block_till_done() assert script_obj.is_running assert script_obj.can_cancel assert script_obj.last_action == event assert len(events) == 1 future = dt_util.utcnow() + timedelta(seconds=5) fire_time_changed(self.hass, future) self.hass.pool.block_till_done() assert not script_obj.is_running assert len(events) == 2
def test_cancel_while_delay(self): """Test the cancelling while the delay is present.""" event = 'test_event' events = [] @callback def record_event(event): """Add recorded event to set.""" events.append(event) self.hass.bus.listen(event, record_event) script_obj = script.Script(self.hass, cv.SCRIPT_SCHEMA([ {'delay': {'seconds': 5}}, {'event': event}])) script_obj.run() self.hass.block_till_done() assert script_obj.is_running assert len(events) == 0 script_obj.stop() assert not script_obj.is_running # Make sure the script is really stopped. future = dt_util.utcnow() + timedelta(seconds=5) fire_time_changed(self.hass, future) self.hass.block_till_done() assert not script_obj.is_running assert len(events) == 0
def test_setup_platform(self): """Test setup of demo platform via configuration.""" utcnow = dt_util.utcnow() # Patching 'utcnow' to gain more control over the timed update. with patch('homeassistant.util.dt.utcnow', return_value=utcnow): with assert_setup_component(1, geo_location.DOMAIN): assert setup_component(self.hass, geo_location.DOMAIN, CONFIG) # In this test, only entities of the geolocation domain have been # generated. all_states = self.hass.states.all() assert len(all_states) == NUMBER_OF_DEMO_DEVICES # Check a single device's attributes. state_first_entry = all_states[0] assert abs( state_first_entry.attributes['latitude'] - self.hass.config.latitude ) < 1.0 assert abs( state_first_entry.attributes['longitude'] - self.hass.config.longitude ) < 1.0 assert state_first_entry.attributes['unit_of_measurement'] == \ DEFAULT_UNIT_OF_MEASUREMENT # Update (replaces 1 device). fire_time_changed(self.hass, utcnow + DEFAULT_UPDATE_INTERVAL) self.hass.block_till_done() # Get all states again, ensure that the number of states is still # the same, but the lists are different. all_states_updated = self.hass.states.all() assert len(all_states_updated) == NUMBER_OF_DEMO_DEVICES assert all_states != all_states_updated
def test_trigger_with_specific_trigger_time(self): """Test disarm after trigger.""" self.assertTrue(setup_component( self.hass, alarm_control_panel.DOMAIN, {'alarm_control_panel': { 'platform': 'manual', 'name': 'test', 'disarmed': { 'trigger_time': 5 }, 'pending_time': 0, 'disarm_after_trigger': True }})) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_trigger(self.hass, entity_id=entity_id) self.hass.block_till_done() self.assertEqual(STATE_ALARM_TRIGGERED, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=5) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state)
def test_arm_home_with_pending(self): """Test arm home method.""" self.assertTrue(alarm_control_panel.setup(self.hass, { 'alarm_control_panel': { 'platform': 'virtual', 'name': 'test', 'code': CODE, 'pending_time': 1 }})) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_arm_home(self.hass, CODE, entity_id) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=1) with patch(('blumate.components.alarm_control_panel.virtual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_ARMED_HOME, self.hass.states.get(entity_id).state)
def test_arm_night_via_command_topic(self): """Test arming night via command topic.""" assert setup_component(self.hass, alarm_control_panel.DOMAIN, { alarm_control_panel.DOMAIN: { 'platform': 'manual_mqtt', 'name': 'test', 'pending_time': 1, 'state_topic': 'alarm/state', 'command_topic': 'alarm/command', 'payload_arm_night': 'ARM_NIGHT', } }) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) # Fire the arm command via MQTT; ensure state changes to pending fire_mqtt_message(self.hass, 'alarm/command', 'ARM_NIGHT') self.hass.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) # Fast-forward a little bit future = dt_util.utcnow() + timedelta(seconds=1) with patch(('homeassistant.components.alarm_control_panel.manual_mqtt.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(STATE_ALARM_ARMED_NIGHT, self.hass.states.get(entity_id).state)
def test_trigger_no_pending(self): """Test triggering when no pending submitted method.""" self.assertTrue(setup_component( self.hass, alarm_control_panel.DOMAIN, {'alarm_control_panel': { 'platform': 'manual', 'name': 'test', 'trigger_time': 1, 'disarm_after_trigger': False }})) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_trigger(self.hass, entity_id=entity_id) self.hass.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=60) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(STATE_ALARM_TRIGGERED, self.hass.states.get(entity_id).state)
def test_sunset_trigger(self): """Test the sunset trigger.""" now = datetime(2015, 9, 15, 23, tzinfo=dt_util.UTC) trigger_time = datetime(2015, 9, 16, 2, tzinfo=dt_util.UTC) with patch('homeassistant.util.dt.utcnow', return_value=now): setup_component(self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'sun', 'event': 'sunset', }, 'action': { 'service': 'test.automation', } } }) automation.turn_off(self.hass) self.hass.block_till_done() fire_time_changed(self.hass, trigger_time) self.hass.block_till_done() self.assertEqual(0, len(self.calls)) with patch('homeassistant.util.dt.utcnow', return_value=now): automation.turn_on(self.hass) self.hass.block_till_done() fire_time_changed(self.hass, trigger_time) self.hass.block_till_done() self.assertEqual(1, len(self.calls))
def test_arm_home_with_pending(self): """Test arm home method.""" self.assertTrue(setup_component( self.hass, alarm_control_panel.DOMAIN, {'alarm_control_panel': { 'platform': 'manual', 'name': 'test', 'code': CODE, 'pending_time': 1, 'disarm_after_trigger': False }})) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_arm_home(self.hass, CODE, entity_id) self.hass.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) state = self.hass.states.get(entity_id) assert state.attributes['post_pending_state'] == STATE_ALARM_ARMED_HOME future = dt_util.utcnow() + timedelta(seconds=1) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() state = self.hass.states.get(entity_id) assert state.state == STATE_ALARM_ARMED_HOME
def test_disarm_during_trigger_with_invalid_code(self): """Test disarming while code is invalid.""" self.assertTrue(alarm_control_panel.setup(self.hass, { 'alarm_control_panel': { 'platform': 'virtual', 'name': 'test', 'pending_time': 5, 'code': CODE + '2' }})) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_trigger(self.hass) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_disarm(self.hass, entity_id=entity_id) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=5) with patch(('blumate.components.alarm_control_panel.virtual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_TRIGGERED, self.hass.states.get(entity_id).state)
def test_armed_away_with_specific_pending(self): """Test arm home method.""" assert setup_component( self.hass, alarm_control_panel.DOMAIN, {'alarm_control_panel': { 'platform': 'manual', 'name': 'test', 'pending_time': 10, 'armed_away': { 'pending_time': 2 } }}) entity_id = 'alarm_control_panel.test' common.alarm_arm_away(self.hass) self.hass.block_till_done() assert STATE_ALARM_PENDING == \ self.hass.states.get(entity_id).state future = dt_util.utcnow() + timedelta(seconds=2) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() assert STATE_ALARM_ARMED_AWAY == \ self.hass.states.get(entity_id).state
def test_if_not_fires_on_entity_change_with_for(self): """Test for not firing on entity change with for.""" self.assertTrue(automation.setup(self.hass, { automation.DOMAIN: { 'trigger': { 'platform': 'state', 'entity_id': 'test.entity', 'to': 'world', 'for': { 'seconds': 5 }, }, 'action': { 'service': 'test.automation' } } })) self.hass.states.set('test.entity', 'world') self.hass.pool.block_till_done() self.hass.states.set('test.entity', 'not_world') self.hass.pool.block_till_done() fire_time_changed(self.hass, dt_util.utcnow() + timedelta(seconds=10)) self.hass.pool.block_till_done() self.assertEqual(0, len(self.calls))
def test_disarm_while_pending_trigger(self): """Test disarming while pending state.""" self.assertTrue(alarm_control_panel.setup(self.hass, { 'alarm_control_panel': { 'platform': 'manual', 'name': 'test', 'trigger_time': 5 }})) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_trigger(self.hass) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_disarm(self.hass, entity_id=entity_id) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=5) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state)
def test_delay(self): """Test the delay.""" event = 'test_event' events = [] context = Context() @callback def record_event(event): """Add recorded event to set.""" events.append(event) self.hass.bus.listen(event, record_event) script_obj = script.Script(self.hass, cv.SCRIPT_SCHEMA([ {'event': event}, {'delay': {'seconds': 5}}, {'event': event}])) script_obj.run(context=context) self.hass.block_till_done() assert script_obj.is_running assert script_obj.can_cancel assert script_obj.last_action == event assert len(events) == 1 future = dt_util.utcnow() + timedelta(seconds=5) fire_time_changed(self.hass, future) self.hass.block_till_done() assert not script_obj.is_running assert len(events) == 2 assert events[0].context is context assert events[1].context is context
def test_track_same_state_simple_trigger_check_funct(self): """Test track_same_change with trigger and check funct.""" callback_runs = [] check_func = [] period = timedelta(minutes=1) @ha.callback def callback_run_callback(): callback_runs.append(1) @ha.callback def async_check_func(entity, from_s, to_s): check_func.append((entity, from_s, to_s)) return True track_same_state( self.hass, period, callback_run_callback, entity_ids='light.Bowl', async_check_same_func=async_check_func) # Adding state to state machine self.hass.states.set("light.Bowl", "on") self.hass.block_till_done() self.assertEqual(0, len(callback_runs)) self.assertEqual('on', check_func[-1][2].state) self.assertEqual('light.bowl', check_func[-1][0]) # change time to track and see if they trigger future = dt_util.utcnow() + period fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(1, len(callback_runs))
def test_update_stale(self): """Test stalled update.""" scanner = get_component('device_tracker.test').SCANNER scanner.reset() scanner.come_home('DEV1') register_time = datetime(2015, 9, 15, 23, tzinfo=dt_util.UTC) scan_time = datetime(2015, 9, 15, 23, 1, tzinfo=dt_util.UTC) with patch('homeassistant.components.device_tracker.dt_util.utcnow', return_value=register_time): self.assertTrue(device_tracker.setup(self.hass, { 'device_tracker': { 'platform': 'test', 'consider_home': 59, }})) self.assertEqual(STATE_HOME, self.hass.states.get('device_tracker.dev1').state) scanner.leave_home('DEV1') with patch('homeassistant.components.device_tracker.dt_util.utcnow', return_value=scan_time): fire_time_changed(self.hass, scan_time) self.hass.pool.block_till_done() self.assertEqual(STATE_NOT_HOME, self.hass.states.get('device_tracker.dev1').state)
def test_sunset_trigger_with_offset(self): self.hass.states.set(sun.ENTITY_ID, sun.STATE_ABOVE_HORIZON, { sun.STATE_ATTR_NEXT_SETTING: '02:00:00 16-09-2015', }) now = datetime(2015, 9, 15, 23, tzinfo=dt_util.UTC) trigger_time = datetime(2015, 9, 16, 2, 30, tzinfo=dt_util.UTC) with patch('homeassistant.components.automation.sun.dt_util.utcnow', return_value=now): self.assertTrue(automation.setup(self.hass, { automation.DOMAIN: { 'trigger': { 'platform': 'sun', 'event': 'sunset', 'offset': '0:30:00' }, 'action': { 'execute_service': 'test.automation', } } })) fire_time_changed(self.hass, trigger_time) self.hass.pool.block_till_done() self.assertEqual(1, len(self.calls))
def test_stop_covers(self): """Test stop cover function.""" with assert_setup_component(2, DOMAIN): assert setup.setup_component(self.hass, DOMAIN, CONFIG) cover.open_cover(self.hass, COVER_GROUP) self.hass.block_till_done() future = dt_util.utcnow() + timedelta(seconds=1) fire_time_changed(self.hass, future) self.hass.block_till_done() cover.stop_cover(self.hass, COVER_GROUP) self.hass.block_till_done() future = dt_util.utcnow() + timedelta(seconds=1) fire_time_changed(self.hass, future) self.hass.block_till_done() state = self.hass.states.get(COVER_GROUP) self.assertEqual(state.state, STATE_OPEN) self.assertEqual(state.attributes.get(ATTR_CURRENT_POSITION), 100) self.assertEqual(self.hass.states.get(DEMO_COVER).state, STATE_OPEN) self.assertEqual(self.hass.states.get(DEMO_COVER_POS) .attributes.get(ATTR_CURRENT_POSITION), 20) self.assertEqual(self.hass.states.get(DEMO_COVER_TILT) .attributes.get(ATTR_CURRENT_POSITION), 80)
def test_update_stale(self): """Test stalled update.""" scanner = get_component(self.hass, 'device_tracker.test').SCANNER scanner.reset() scanner.come_home('DEV1') register_time = datetime(2015, 9, 15, 23, tzinfo=dt_util.UTC) scan_time = datetime(2015, 9, 15, 23, 1, tzinfo=dt_util.UTC) with patch('homeassistant.components.device_tracker.dt_util.utcnow', return_value=register_time): with assert_setup_component(1, device_tracker.DOMAIN): assert setup_component(self.hass, device_tracker.DOMAIN, { device_tracker.DOMAIN: { CONF_PLATFORM: 'test', device_tracker.CONF_CONSIDER_HOME: 59, }}) self.hass.block_till_done() assert STATE_HOME == \ self.hass.states.get('device_tracker.dev1').state scanner.leave_home('DEV1') with patch('homeassistant.components.device_tracker.dt_util.utcnow', return_value=scan_time): fire_time_changed(self.hass, scan_time) self.hass.block_till_done() assert STATE_NOT_HOME == \ self.hass.states.get('device_tracker.dev1').state
def test_arm_custom_bypass_with_pending(self): """Test arm custom bypass method.""" assert setup_component( self.hass, alarm_control_panel.DOMAIN, {'alarm_control_panel': { 'platform': 'manual', 'name': 'test', 'code': CODE, 'pending_time': 1, 'disarm_after_trigger': False }}) entity_id = 'alarm_control_panel.test' assert STATE_ALARM_DISARMED == \ self.hass.states.get(entity_id).state common.alarm_arm_custom_bypass(self.hass, CODE, entity_id) self.hass.block_till_done() assert STATE_ALARM_PENDING == \ self.hass.states.get(entity_id).state state = self.hass.states.get(entity_id) assert state.attributes['post_pending_state'] == \ STATE_ALARM_ARMED_CUSTOM_BYPASS future = dt_util.utcnow() + timedelta(seconds=1) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() state = self.hass.states.get(entity_id) assert state.state == STATE_ALARM_ARMED_CUSTOM_BYPASS
def test_sunset_trigger_with_offset(self): """Test the sunset trigger with offset.""" self.hass.states.set(sun.ENTITY_ID, sun.STATE_ABOVE_HORIZON, { sun.STATE_ATTR_NEXT_SETTING: '2015-09-16T02:00:00Z', }) now = datetime(2015, 9, 15, 23, tzinfo=dt_util.UTC) trigger_time = datetime(2015, 9, 16, 2, 30, tzinfo=dt_util.UTC) with patch('homeassistant.util.dt.utcnow', return_value=now): setup_component(self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'sun', 'event': 'sunset', 'offset': '0:30:00' }, 'action': { 'service': 'test.automation', 'data_template': { 'some': '{{ trigger.%s }}' % '}} - {{ trigger.'.join(( 'platform', 'event', 'offset')) }, } } }) fire_time_changed(self.hass, trigger_time) self.hass.block_till_done() self.assertEqual(1, len(self.calls)) self.assertEqual('sun - sunset - 0:30:00', self.calls[0].data['some'])
def test_track_same_state_simple_no_trigger(self): """Test track_same_change with no trigger.""" callback_runs = [] period = timedelta(minutes=1) @ha.callback def callback_run_callback(): callback_runs.append(1) track_same_state( self.hass, period, callback_run_callback, lambda _, _2, to_s: to_s.state == 'on', entity_ids='light.Bowl') # Adding state to state machine self.hass.states.set("light.Bowl", "on") self.hass.block_till_done() self.assertEqual(0, len(callback_runs)) # Change state on state machine self.hass.states.set("light.Bowl", "off") self.hass.block_till_done() self.assertEqual(0, len(callback_runs)) # change time to track and see if they trigger future = dt_util.utcnow() + period fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(0, len(callback_runs))
def test_armed_night_with_specific_pending(self): """Test arm home method.""" self.assertTrue(setup_component( self.hass, alarm_control_panel.DOMAIN, {'alarm_control_panel': { 'platform': 'manual', 'name': 'test', 'pending_time': 10, 'armed_night': { 'pending_time': 2 } }})) entity_id = 'alarm_control_panel.test' alarm_control_panel.alarm_arm_night(self.hass) self.hass.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=2) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(STATE_ALARM_ARMED_NIGHT, self.hass.states.get(entity_id).state)
def test_if_fires_on_entity_change_with_for_multiple_force_update(self): """Test for firing on entity change with for and force update.""" assert setup_component(self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'state', 'entity_id': 'test.force_entity', 'to': 'world', 'for': { 'seconds': 5 }, }, 'action': { 'service': 'test.automation' } } }) utcnow = dt_util.utcnow() with patch('homeassistant.core.dt_util.utcnow') as mock_utcnow: mock_utcnow.return_value = utcnow self.hass.states.set('test.force_entity', 'world', None, True) self.hass.block_till_done() for _ in range(0, 4): mock_utcnow.return_value += timedelta(seconds=1) fire_time_changed(self.hass, mock_utcnow.return_value) self.hass.states.set('test.force_entity', 'world', None, True) self.hass.block_till_done() self.assertEqual(0, len(self.calls)) mock_utcnow.return_value += timedelta(seconds=4) fire_time_changed(self.hass, mock_utcnow.return_value) self.hass.block_till_done() self.assertEqual(1, len(self.calls))
def test_update_stale(self): """Test stalled update.""" scanner = get_component("device_tracker.test").SCANNER scanner.reset() scanner.come_home("DEV1") register_time = datetime(2015, 9, 15, 23, tzinfo=dt_util.UTC) scan_time = datetime(2015, 9, 15, 23, 1, tzinfo=dt_util.UTC) with patch("homeassistant.components.device_tracker.dt_util.utcnow", return_value=register_time): self.assertTrue( setup_component( self.hass, device_tracker.DOMAIN, {device_tracker.DOMAIN: {CONF_PLATFORM: "test", device_tracker.CONF_CONSIDER_HOME: 59}}, ) ) self.assertEqual(STATE_HOME, self.hass.states.get("device_tracker.dev1").state) scanner.leave_home("DEV1") with patch("homeassistant.components.device_tracker.dt_util.utcnow", return_value=scan_time): fire_time_changed(self.hass, scan_time) self.hass.block_till_done() self.assertEqual(STATE_NOT_HOME, self.hass.states.get("device_tracker.dev1").state)
def test_if_fires_on_entity_change_with_for_attribute_change(self): """Test for firing on entity change with for and attribute change.""" assert setup_component(self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'numeric_state', 'entity_id': 'test.entity', 'above': 8, 'below': 12, 'for': { 'seconds': 5 }, }, 'action': { 'service': 'test.automation' } } }) utcnow = dt_util.utcnow() with patch('homeassistant.core.dt_util.utcnow') as mock_utcnow: mock_utcnow.return_value = utcnow self.hass.states.set('test.entity', 9) self.hass.block_till_done() mock_utcnow.return_value += timedelta(seconds=4) fire_time_changed(self.hass, mock_utcnow.return_value) self.hass.states.set('test.entity', 9, attributes={"mock_attr": "attr_change"}) self.hass.block_till_done() self.assertEqual(0, len(self.calls)) mock_utcnow.return_value += timedelta(seconds=4) fire_time_changed(self.hass, mock_utcnow.return_value) self.hass.block_till_done() self.assertEqual(1, len(self.calls))
def test_sunrise_trigger(self): """Test the sunrise trigger.""" self.hass.states.set(sun.ENTITY_ID, sun.STATE_ABOVE_HORIZON, { sun.STATE_ATTR_NEXT_RISING: '2015-09-16T14:00:00Z', }) now = datetime(2015, 9, 13, 23, tzinfo=dt_util.UTC) trigger_time = datetime(2015, 9, 16, 14, tzinfo=dt_util.UTC) with patch('homeassistant.util.dt.utcnow', return_value=now): setup_component(self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'sun', 'event': 'sunrise', }, 'action': { 'service': 'test.automation', } } }) fire_time_changed(self.hass, trigger_time) self.hass.block_till_done() self.assertEqual(1, len(self.calls))
def test_disarm_while_pending_trigger(self): """Test disarming while pending state.""" self.assertTrue(setup_component( self.hass, alarm_control_panel.DOMAIN, {'alarm_control_panel': { 'platform': 'manual_mqtt', 'name': 'test', 'trigger_time': 5, 'disarm_after_trigger': False, 'command_topic': 'alarm/command', 'state_topic': 'alarm/state', }})) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_trigger(self.hass) self.hass.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_disarm(self.hass, entity_id=entity_id) self.hass.block_till_done() self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=5) with patch(('homeassistant.components.alarm_control_panel.manual_mqtt.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state)
def test_sunset_trigger(self): """Test the sunset trigger.""" self.hass.states.set(sun.ENTITY_ID, sun.STATE_ABOVE_HORIZON, { sun.STATE_ATTR_NEXT_SETTING: '2015-09-16T02:00:00Z', }) now = datetime(2015, 9, 15, 23, tzinfo=dt_util.UTC) trigger_time = datetime(2015, 9, 16, 2, tzinfo=dt_util.UTC) with patch('homeassistant.util.dt.utcnow', return_value=now): setup_component(self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'sun', 'event': 'sunset', }, 'action': { 'service': 'test.automation', } } }) automation.turn_off(self.hass) self.hass.block_till_done() fire_time_changed(self.hass, trigger_time) self.hass.block_till_done() self.assertEqual(0, len(self.calls)) with patch('homeassistant.util.dt.utcnow', return_value=now): automation.turn_on(self.hass) self.hass.block_till_done() fire_time_changed(self.hass, trigger_time) self.hass.block_till_done() self.assertEqual(1, len(self.calls))
def test_alt_delay(self): """Test alternative delay config format.""" event = 'test_event' calls = [] def record_event(event): """Add recorded event to set.""" calls.append(event) self.hass.bus.listen(event, record_event) assert _setup_component(self.hass, 'script', { 'script': { 'test': { 'sequence': [{ 'event': event, }, { 'delay': None, 'seconds': 5 }, { 'event': event, }] } } }) script.turn_on(self.hass, ENTITY_ID) self.hass.pool.block_till_done() self.assertTrue(script.is_on(self.hass, ENTITY_ID)) self.assertEqual(1, len(calls)) future = dt_util.utcnow() + timedelta(seconds=5) fire_time_changed(self.hass, future) self.hass.pool.block_till_done() self.assertFalse(script.is_on(self.hass, ENTITY_ID)) self.assertEqual(2, len(calls))
def test_disarm_while_pending_trigger(self): """Test disarming while pending state.""" self.assertTrue( alarm_control_panel.setup( self.hass, { 'alarm_control_panel': { 'platform': 'virtual', 'name': 'test', 'trigger_time': 5 } })) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_trigger(self.hass) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_disarm(self.hass, entity_id=entity_id) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=5) with patch(('blumate.components.alarm_control_panel.virtual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state)
def test_flux_when_switch_is_off(self): """Test the flux switch when it is off.""" platform = loader.get_component('light.test') platform.init() self.assertTrue( light.setup(self.hass, {light.DOMAIN: {CONF_PLATFORM: 'test'}})) dev1 = platform.DEVICES[0] # Verify initial state of light state = self.hass.states.get(dev1.entity_id) self.assertEqual(STATE_ON, state.state) self.assertIsNone(state.attributes.get('xy_color')) self.assertIsNone(state.attributes.get('brightness')) test_time = dt_util.now().replace(hour=10, minute=30, second=0) sunset_time = test_time.replace(hour=17, minute=0, second=0) sunrise_time = test_time.replace(hour=5, minute=0, second=0) + timedelta(days=1) with patch('homeassistant.util.dt.now', return_value=test_time): with patch('homeassistant.components.sun.next_rising', return_value=sunrise_time): with patch('homeassistant.components.sun.next_setting', return_value=sunset_time): assert setup_component(self.hass, switch.DOMAIN, { switch.DOMAIN: { 'platform': 'flux', 'name': 'flux', 'lights': [dev1.entity_id] } }) turn_on_calls = mock_service( self.hass, light.DOMAIN, SERVICE_TURN_ON) fire_time_changed(self.hass, test_time) self.hass.pool.block_till_done() self.assertEqual(0, len(turn_on_calls))
def test_arm_custom_bypass_with_pending(self): """Test arm custom bypass method.""" self.assertTrue( setup_component( self.hass, alarm_control_panel.DOMAIN, { 'alarm_control_panel': { 'platform': 'manual', 'name': 'test', 'code': CODE, 'pending_time': 1, 'disarm_after_trigger': False } })) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_arm_custom_bypass(self.hass, CODE, entity_id) self.hass.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) state = self.hass.states.get(entity_id) assert state.attributes['post_pending_state'] == \ STATE_ALARM_ARMED_CUSTOM_BYPASS future = dt_util.utcnow() + timedelta(seconds=1) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() state = self.hass.states.get(entity_id) assert state.state == STATE_ALARM_ARMED_CUSTOM_BYPASS
def test_trigger_with_pending(self): """ Test arm home method. """ self.assertTrue(alarm_control_panel.setup(self.hass, { 'alarm_control_panel': { 'platform': 'manual', 'name': 'test', 'pending_time': 2, 'trigger_time': 3 }})) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_trigger(self.hass) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=2) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_TRIGGERED, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=5) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.pool.block_till_done() self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state)
def test_arm_night_with_pending(self): """Test arm night method.""" self.assertTrue( setup_component( self.hass, alarm_control_panel.DOMAIN, { 'alarm_control_panel': { 'platform': 'manual', 'name': 'test', 'code': CODE, 'pending_time': 1, 'disarm_after_trigger': False } })) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_arm_night(self.hass, CODE, entity_id) self.hass.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) self.assertTrue( self.hass.states.is_state_attr(entity_id, 'post_pending_state', STATE_ALARM_ARMED_NIGHT)) future = dt_util.utcnow() + timedelta(seconds=1) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(STATE_ALARM_ARMED_NIGHT, self.hass.states.get(entity_id).state)
def test_delay(self): """Test the delay.""" event = 'test_event' events = [] @callback def record_event(event): """Add recorded event to set.""" events.append(event) self.hass.bus.listen(event, record_event) script_obj = script.Script( self.hass, cv.SCRIPT_SCHEMA([{ 'event': event }, { 'delay': { 'seconds': 5 } }, { 'event': event }])) script_obj.run() self.hass.block_till_done() assert script_obj.is_running assert script_obj.can_cancel assert script_obj.last_action == event assert len(events) == 1 future = dt_util.utcnow() + timedelta(seconds=5) fire_time_changed(self.hass, future) self.hass.block_till_done() assert not script_obj.is_running assert len(events) == 2
def test_set_cover_position(self): """Test set cover position function.""" with assert_setup_component(2, DOMAIN): assert setup.setup_component(self.hass, DOMAIN, CONFIG) cover.set_cover_position(self.hass, 50, COVER_GROUP) self.hass.block_till_done() for _ in range(4): future = dt_util.utcnow() + timedelta(seconds=1) fire_time_changed(self.hass, future) self.hass.block_till_done() state = self.hass.states.get(COVER_GROUP) self.assertEqual(state.state, STATE_OPEN) self.assertEqual(state.attributes.get(ATTR_CURRENT_POSITION), 50) self.assertEqual(self.hass.states.get(DEMO_COVER).state, STATE_CLOSED) self.assertEqual( self.hass.states.get(DEMO_COVER_POS).attributes.get( ATTR_CURRENT_POSITION), 50) self.assertEqual( self.hass.states.get(DEMO_COVER_TILT).attributes.get( ATTR_CURRENT_POSITION), 50)
def test_if_not_fires_using_wrong_after(self): """YAML translates time values to total seconds. This should break the before rule. """ assert not _setup_component(self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'time', 'after': 3605, # Total seconds. Hour = 3600 second }, 'action': { 'service': 'test.automation' } } }) fire_time_changed(self.hass, dt_util.utcnow().replace( hour=1, minute=0, second=5)) self.hass.pool.block_till_done() self.assertEqual(0, len(self.calls))
def test_stop_tilts(self): """Test stop tilts function.""" with assert_setup_component(2, DOMAIN): assert setup.setup_component(self.hass, DOMAIN, CONFIG) cover.open_cover_tilt(self.hass, COVER_GROUP) self.hass.block_till_done() future = dt_util.utcnow() + timedelta(seconds=1) fire_time_changed(self.hass, future) self.hass.block_till_done() cover.stop_cover_tilt(self.hass, COVER_GROUP) self.hass.block_till_done() future = dt_util.utcnow() + timedelta(seconds=1) fire_time_changed(self.hass, future) self.hass.block_till_done() state = self.hass.states.get(COVER_GROUP) self.assertEqual(state.state, STATE_OPEN) self.assertEqual(state.attributes.get(ATTR_CURRENT_TILT_POSITION), 60) self.assertEqual( self.hass.states.get(DEMO_COVER_TILT).attributes.get( ATTR_CURRENT_TILT_POSITION), 60)
def test_if_fires_on_entity_change_with_for(self): """Test for firing on entity change with for.""" assert _setup_component(self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'state', 'entity_id': 'test.entity', 'to': 'world', 'for': { 'seconds': 5 }, }, 'action': { 'service': 'test.automation' } } }) self.hass.states.set('test.entity', 'world') self.hass.block_till_done() fire_time_changed(self.hass, dt_util.utcnow() + timedelta(seconds=10)) self.hass.block_till_done() self.assertEqual(1, len(self.calls))
def test_if_fires_when_all_matches(self): """Test for firing if everything matches.""" self.assertTrue( automation.setup( self.hass, { automation.DOMAIN: { 'trigger': { 'platform': 'time', 'hours': 1, 'minutes': 2, 'seconds': 3, }, 'action': { 'service': 'test.automation' } } })) fire_time_changed(self.hass, dt_util.utcnow().replace(hour=1, minute=2, second=3)) self.hass.pool.block_till_done() self.assertEqual(1, len(self.calls))
def test_sunrise_trigger_with_offset(self): """Test the sunrise trigger with offset.""" now = datetime(2015, 9, 13, 23, tzinfo=dt_util.UTC) trigger_time = datetime(2015, 9, 16, 13, 30, tzinfo=dt_util.UTC) with patch('homeassistant.util.dt.utcnow', return_value=now): setup_component( self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'sun', 'event': 'sunrise', 'offset': '-0:30:00' }, 'action': { 'service': 'test.automation', } } }) fire_time_changed(self.hass, trigger_time) self.hass.block_till_done() self.assertEqual(1, len(self.calls))
def test_cancel_while_delay(self): """Test the cancelling while the delay is present.""" event = 'test_event' events = [] def record_event(event): """Add recorded event to set.""" events.append(event) self.hass.bus.listen(event, record_event) script_obj = script.Script(self.hass, [{ 'delay': { 'seconds': 5 } }, { 'event': event }]) script_obj.run() self.hass.pool.block_till_done() assert script_obj.is_running assert len(events) == 0 script_obj.stop() assert not script_obj.is_running # Make sure the script is really stopped. future = dt_util.utcnow() + timedelta(seconds=5) fire_time_changed(self.hass, future) self.hass.pool.block_till_done() assert not script_obj.is_running assert len(events) == 0
def test_wait_template_timeout_continue(self): """Test the wait template with continuing the script.""" event = 'test_event' events = [] @callback def record_event(event): """Add recorded event to set.""" events.append(event) self.hass.bus.listen(event, record_event) self.hass.states.set('switch.test', 'on') script_obj = script.Script(self.hass, cv.SCRIPT_SCHEMA([ {'event': event}, { 'wait_template': "{{states.switch.test.state == 'off'}}", 'timeout': 5, 'continue_on_timeout': True }, {'event': event}])) script_obj.run() self.hass.block_till_done() assert script_obj.is_running assert script_obj.can_cancel assert script_obj.last_action == event assert len(events) == 1 future = dt_util.utcnow() + timedelta(seconds=5) fire_time_changed(self.hass, future) self.hass.block_till_done() assert not script_obj.is_running assert len(events) == 2
def test_trigger_with_specific_pending(self): """Test arm home method.""" self.assertTrue(setup_component( self.hass, alarm_control_panel.DOMAIN, {'alarm_control_panel': { 'platform': 'manual_mqtt', 'name': 'test', 'pending_time': 10, 'triggered': { 'pending_time': 2 }, 'trigger_time': 3, 'disarm_after_trigger': False, 'command_topic': 'alarm/command', 'state_topic': 'alarm/state', }})) entity_id = 'alarm_control_panel.test' alarm_control_panel.alarm_arm_home(self.hass) self.hass.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=10) with patch(('homeassistant.components.alarm_control_panel.manual_mqtt.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(STATE_ALARM_ARMED_HOME, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_trigger(self.hass) self.hass.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=2) with patch(('homeassistant.components.alarm_control_panel.manual_mqtt.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(STATE_ALARM_TRIGGERED, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=5) with patch(('homeassistant.components.alarm_control_panel.manual_mqtt.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(STATE_ALARM_ARMED_HOME, self.hass.states.get(entity_id).state)
def test_disarm_during_trigger_with_invalid_code(self): """Test disarming while code is invalid.""" self.assertTrue(setup_component( self.hass, alarm_control_panel.DOMAIN, {'alarm_control_panel': { 'platform': 'manual', 'name': 'test', 'pending_time': 5, 'code': CODE + '2', 'disarm_after_trigger': False }})) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_trigger(self.hass) self.hass.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_disarm(self.hass, entity_id=entity_id) self.hass.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) future = dt_util.utcnow() + timedelta(seconds=5) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(STATE_ALARM_TRIGGERED, self.hass.states.get(entity_id).state)
def test_trigger_with_no_disarm_after_trigger(self): """Test disarm after trigger.""" assert setup_component( self.hass, alarm_control_panel.DOMAIN, {'alarm_control_panel': { 'platform': 'manual', 'name': 'test', 'trigger_time': 5, 'pending_time': 0, 'disarm_after_trigger': False }}) entity_id = 'alarm_control_panel.test' assert STATE_ALARM_DISARMED == \ self.hass.states.get(entity_id).state common.alarm_arm_away(self.hass, CODE, entity_id) self.hass.block_till_done() assert STATE_ALARM_ARMED_AWAY == \ self.hass.states.get(entity_id).state common.alarm_trigger(self.hass, entity_id=entity_id) self.hass.block_till_done() assert STATE_ALARM_TRIGGERED == \ self.hass.states.get(entity_id).state future = dt_util.utcnow() + timedelta(seconds=5) with patch(('homeassistant.components.alarm_control_panel.manual.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() assert STATE_ALARM_ARMED_AWAY == \ self.hass.states.get(entity_id).state
def test_if_fires_when_hour_matches(self): """Test for firing if hour is matching.""" assert setup_component(self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'time', 'hours': 0, }, 'action': { 'service': 'test.automation' } } }) fire_time_changed(self.hass, dt_util.utcnow().replace(hour=0)) self.hass.block_till_done() self.assertEqual(1, len(self.calls)) automation.turn_off(self.hass) self.hass.block_till_done() fire_time_changed(self.hass, dt_util.utcnow().replace(hour=0)) self.hass.block_till_done() self.assertEqual(1, len(self.calls))
def test_if_fires_using_after(self): """Test for firing after.""" assert _setup_component(self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'time', 'after': '5:00:00', }, 'action': { 'service': 'test.automation', 'data_template': { 'some': '{{ trigger.platform }} - ' '{{ trigger.now.hour }}' }, } } }) fire_time_changed(self.hass, dt_util.utcnow().replace( hour=5, minute=0, second=0)) self.hass.pool.block_till_done() self.assertEqual(1, len(self.calls)) self.assertEqual('time - 5', self.calls[0].data['some'])
def test_arm_away_with_pending(self): """Test arm home method.""" self.assertTrue(setup_component( self.hass, alarm_control_panel.DOMAIN, {'alarm_control_panel': { 'platform': 'manual_mqtt', 'name': 'test', 'code': CODE, 'pending_time': 1, 'disarm_after_trigger': False, 'command_topic': 'alarm/command', 'state_topic': 'alarm/state', }})) entity_id = 'alarm_control_panel.test' self.assertEqual(STATE_ALARM_DISARMED, self.hass.states.get(entity_id).state) alarm_control_panel.alarm_arm_away(self.hass, CODE) self.hass.block_till_done() self.assertEqual(STATE_ALARM_PENDING, self.hass.states.get(entity_id).state) state = self.hass.states.get(entity_id) assert state.attributes['post_pending_state'] == STATE_ALARM_ARMED_AWAY future = dt_util.utcnow() + timedelta(seconds=1) with patch(('homeassistant.components.alarm_control_panel.manual_mqtt.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(STATE_ALARM_ARMED_AWAY, self.hass.states.get(entity_id).state)
def test_if_fires_on_entity_change_with_for_attribute_change(self): """Test for firing on entity change with for and attribute change.""" assert setup_component( self.hass, automation.DOMAIN, { automation.DOMAIN: { 'trigger': { 'platform': 'numeric_state', 'entity_id': 'test.entity', 'above': 8, 'below': 12, 'for': { 'seconds': 5 }, }, 'action': { 'service': 'test.automation' } } }) utcnow = dt_util.utcnow() with patch('homeassistant.core.dt_util.utcnow') as mock_utcnow: mock_utcnow.return_value = utcnow self.hass.states.set('test.entity', 9) self.hass.block_till_done() mock_utcnow.return_value += timedelta(seconds=4) fire_time_changed(self.hass, mock_utcnow.return_value) self.hass.states.set('test.entity', 9, attributes={"mock_attr": "attr_change"}) self.hass.block_till_done() self.assertEqual(0, len(self.calls)) mock_utcnow.return_value += timedelta(seconds=4) fire_time_changed(self.hass, mock_utcnow.return_value) self.hass.block_till_done() self.assertEqual(1, len(self.calls))
def test_polling_updates_entities_with_exception(self): """Test the updated entities that not brake with a exception.""" component = EntityComponent(_LOGGER, DOMAIN, self.hass, timedelta(seconds=20)) update_ok = [] update_err = [] def update_mock(): """Mock normal update.""" update_ok.append(None) def update_mock_err(): """Mock error update.""" update_err.append(None) raise AssertionError("Fake error update") ent1 = EntityTest(should_poll=True) ent1.update = update_mock_err ent2 = EntityTest(should_poll=True) ent2.update = update_mock ent3 = EntityTest(should_poll=True) ent3.update = update_mock ent4 = EntityTest(should_poll=True) ent4.update = update_mock component.add_entities([ent1, ent2, ent3, ent4]) update_ok.clear() update_err.clear() fire_time_changed(self.hass, dt_util.utcnow() + timedelta(seconds=20)) self.hass.block_till_done() assert len(update_ok) == 3 assert len(update_err) == 1
def test_flux_with_multiple_lights(self): """Test the flux switch with multiple light entities.""" platform = loader.get_component('light.test') platform.init() self.assertTrue( setup_component(self.hass, light.DOMAIN, {light.DOMAIN: {CONF_PLATFORM: 'test'}})) dev1, dev2, dev3 = platform.DEVICES light.turn_on(self.hass, entity_id=dev2.entity_id) self.hass.block_till_done() light.turn_on(self.hass, entity_id=dev3.entity_id) self.hass.block_till_done() state = self.hass.states.get(dev1.entity_id) self.assertEqual(STATE_ON, state.state) self.assertIsNone(state.attributes.get('xy_color')) self.assertIsNone(state.attributes.get('brightness')) state = self.hass.states.get(dev2.entity_id) self.assertEqual(STATE_ON, state.state) self.assertIsNone(state.attributes.get('xy_color')) self.assertIsNone(state.attributes.get('brightness')) state = self.hass.states.get(dev3.entity_id) self.assertEqual(STATE_ON, state.state) self.assertIsNone(state.attributes.get('xy_color')) self.assertIsNone(state.attributes.get('brightness')) test_time = dt_util.now().replace(hour=12, minute=0, second=0) sunset_time = test_time.replace(hour=17, minute=0, second=0) sunrise_time = test_time.replace(hour=5, minute=0, second=0) def event_date(hass, event, now=None): if event == 'sunrise': print('sunrise {}'.format(sunrise_time)) return sunrise_time else: print('sunset {}'.format(sunset_time)) return sunset_time with patch('homeassistant.util.dt.now', return_value=test_time): with patch('homeassistant.helpers.sun.get_astral_event_date', side_effect=event_date): assert setup_component(self.hass, switch.DOMAIN, { switch.DOMAIN: { 'platform': 'flux', 'name': 'flux', 'lights': [dev1.entity_id, dev2.entity_id, dev3.entity_id] } }) turn_on_calls = mock_service( self.hass, light.DOMAIN, SERVICE_TURN_ON) switch.turn_on(self.hass, 'switch.flux') self.hass.block_till_done() fire_time_changed(self.hass, test_time) self.hass.block_till_done() call = turn_on_calls[-1] self.assertEqual(call.data[light.ATTR_BRIGHTNESS], 163) self.assertEqual(call.data[light.ATTR_XY_COLOR], [0.46, 0.376]) call = turn_on_calls[-2] self.assertEqual(call.data[light.ATTR_BRIGHTNESS], 163) self.assertEqual(call.data[light.ATTR_XY_COLOR], [0.46, 0.376]) call = turn_on_calls[-3] self.assertEqual(call.data[light.ATTR_BRIGHTNESS], 163) self.assertEqual(call.data[light.ATTR_XY_COLOR], [0.46, 0.376])
def test_setup(self, mock_feed): """Test the general setup of the platform.""" # Set up some mock feed entries for this test. mock_entry_1 = self._generate_mock_feed_entry('1234', 'Title 1', 15.5, (-31.0, 150.0)) mock_entry_2 = self._generate_mock_feed_entry('2345', 'Title 2', 20.5, (-31.1, 150.1)) mock_entry_3 = self._generate_mock_feed_entry('3456', 'Title 3', 25.5, (-31.2, 150.2)) mock_entry_4 = self._generate_mock_feed_entry('4567', 'Title 4', 12.5, (-31.3, 150.3)) mock_feed.return_value.update.return_value = 'OK', [ mock_entry_1, mock_entry_2, mock_entry_3 ] utcnow = dt_util.utcnow() # Patching 'utcnow' to gain more control over the timed update. with patch('homeassistant.util.dt.utcnow', return_value=utcnow): with assert_setup_component(1, geo_location.DOMAIN): self.assertTrue( setup_component(self.hass, geo_location.DOMAIN, CONFIG)) # Artificially trigger update. self.hass.bus.fire(EVENT_HOMEASSISTANT_START) # Collect events. self.hass.block_till_done() all_states = self.hass.states.all() assert len(all_states) == 3 state = self.hass.states.get("geo_location.title_1") self.assertIsNotNone(state) assert state.name == "Title 1" assert state.attributes == { ATTR_EXTERNAL_ID: "1234", ATTR_LATITUDE: -31.0, ATTR_LONGITUDE: 150.0, ATTR_FRIENDLY_NAME: "Title 1", ATTR_UNIT_OF_MEASUREMENT: "km", ATTR_SOURCE: 'geo_json_events' } self.assertAlmostEqual(float(state.state), 15.5) state = self.hass.states.get("geo_location.title_2") self.assertIsNotNone(state) assert state.name == "Title 2" assert state.attributes == { ATTR_EXTERNAL_ID: "2345", ATTR_LATITUDE: -31.1, ATTR_LONGITUDE: 150.1, ATTR_FRIENDLY_NAME: "Title 2", ATTR_UNIT_OF_MEASUREMENT: "km", ATTR_SOURCE: 'geo_json_events' } self.assertAlmostEqual(float(state.state), 20.5) state = self.hass.states.get("geo_location.title_3") self.assertIsNotNone(state) assert state.name == "Title 3" assert state.attributes == { ATTR_EXTERNAL_ID: "3456", ATTR_LATITUDE: -31.2, ATTR_LONGITUDE: 150.2, ATTR_FRIENDLY_NAME: "Title 3", ATTR_UNIT_OF_MEASUREMENT: "km", ATTR_SOURCE: 'geo_json_events' } self.assertAlmostEqual(float(state.state), 25.5) # Simulate an update - one existing, one new entry, # one outdated entry mock_feed.return_value.update.return_value = 'OK', [ mock_entry_1, mock_entry_4, mock_entry_3 ] fire_time_changed(self.hass, utcnow + SCAN_INTERVAL) self.hass.block_till_done() all_states = self.hass.states.all() assert len(all_states) == 3 # Simulate an update - empty data, but successful update, # so no changes to entities. mock_feed.return_value.update.return_value = 'OK_NO_DATA', None # mock_restdata.return_value.data = None fire_time_changed(self.hass, utcnow + 2 * SCAN_INTERVAL) self.hass.block_till_done() all_states = self.hass.states.all() assert len(all_states) == 3 # Simulate an update - empty data, removes all entities mock_feed.return_value.update.return_value = 'ERROR', None fire_time_changed(self.hass, utcnow + 2 * SCAN_INTERVAL) self.hass.block_till_done() all_states = self.hass.states.all() assert len(all_states) == 0
def test_setup_race_condition(self, mock_feed): """Test a particular race condition experienced.""" # 1. Feed returns 1 entry -> Feed manager creates 1 entity. # 2. Feed returns error -> Feed manager removes 1 entity. # However, this stayed on and kept listening for dispatcher signals. # 3. Feed returns 1 entry -> Feed manager creates 1 entity. # 4. Feed returns 1 entry -> Feed manager updates 1 entity. # Internally, the previous entity is updating itself, too. # 5. Feed returns error -> Feed manager removes 1 entity. # There are now 2 entities trying to remove themselves from HA, but # the second attempt fails of course. # Set up some mock feed entries for this test. mock_entry_1 = self._generate_mock_feed_entry('1234', 'Title 1', 15.5, (-31.0, 150.0)) mock_feed.return_value.update.return_value = 'OK', [mock_entry_1] utcnow = dt_util.utcnow() # Patching 'utcnow' to gain more control over the timed update. with patch('homeassistant.util.dt.utcnow', return_value=utcnow): with assert_setup_component(1, geo_location.DOMAIN): self.assertTrue( setup_component(self.hass, geo_location.DOMAIN, CONFIG)) # This gives us the ability to assert the '_delete_callback' # has been called while still executing it. original_delete_callback = homeassistant.components\ .geo_location.geo_json_events.GeoJsonLocationEvent\ ._delete_callback def mock_delete_callback(entity): original_delete_callback(entity) with patch( 'homeassistant.components.geo_location' '.geo_json_events.GeoJsonLocationEvent' '._delete_callback', side_effect=mock_delete_callback, autospec=True) as mocked_delete_callback: # Artificially trigger update. self.hass.bus.fire(EVENT_HOMEASSISTANT_START) # Collect events. self.hass.block_till_done() all_states = self.hass.states.all() assert len(all_states) == 1 # Simulate an update - empty data, removes all entities mock_feed.return_value.update.return_value = 'ERROR', None fire_time_changed(self.hass, utcnow + SCAN_INTERVAL) self.hass.block_till_done() assert mocked_delete_callback.call_count == 1 all_states = self.hass.states.all() assert len(all_states) == 0 # Simulate an update - 1 entry mock_feed.return_value.update.return_value = 'OK', [ mock_entry_1 ] fire_time_changed(self.hass, utcnow + 2 * SCAN_INTERVAL) self.hass.block_till_done() all_states = self.hass.states.all() assert len(all_states) == 1 # Simulate an update - 1 entry mock_feed.return_value.update.return_value = 'OK', [ mock_entry_1 ] fire_time_changed(self.hass, utcnow + 3 * SCAN_INTERVAL) self.hass.block_till_done() all_states = self.hass.states.all() assert len(all_states) == 1 # Reset mocked method for the next test. mocked_delete_callback.reset_mock() # Simulate an update - empty data, removes all entities mock_feed.return_value.update.return_value = 'ERROR', None fire_time_changed(self.hass, utcnow + 4 * SCAN_INTERVAL) self.hass.block_till_done() assert mocked_delete_callback.call_count == 1 all_states = self.hass.states.all() assert len(all_states) == 0
def test_state_changes_are_published_to_mqtt(self): """Test publishing of MQTT messages when state changes.""" assert setup_component(self.hass, alarm_control_panel.DOMAIN, { alarm_control_panel.DOMAIN: { 'platform': 'manual_mqtt', 'name': 'test', 'pending_time': 1, 'trigger_time': 1, 'state_topic': 'alarm/state', 'command_topic': 'alarm/command', } }) # Component should send disarmed alarm state on startup self.hass.block_till_done() self.assertEqual(('alarm/state', STATE_ALARM_DISARMED, 0, True), self.mock_publish.mock_calls[-2][1]) # Arm in home mode alarm_control_panel.alarm_arm_home(self.hass) self.hass.block_till_done() self.assertEqual(('alarm/state', STATE_ALARM_PENDING, 0, True), self.mock_publish.mock_calls[-2][1]) # Fast-forward a little bit future = dt_util.utcnow() + timedelta(seconds=1) with patch(('homeassistant.components.alarm_control_panel.manual_mqtt.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(('alarm/state', STATE_ALARM_ARMED_HOME, 0, True), self.mock_publish.mock_calls[-2][1]) # Arm in away mode alarm_control_panel.alarm_arm_away(self.hass) self.hass.block_till_done() self.assertEqual(('alarm/state', STATE_ALARM_PENDING, 0, True), self.mock_publish.mock_calls[-2][1]) # Fast-forward a little bit future = dt_util.utcnow() + timedelta(seconds=1) with patch(('homeassistant.components.alarm_control_panel.manual_mqtt.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(('alarm/state', STATE_ALARM_ARMED_AWAY, 0, True), self.mock_publish.mock_calls[-2][1]) # Arm in night mode alarm_control_panel.alarm_arm_night(self.hass) self.hass.block_till_done() self.assertEqual(('alarm/state', STATE_ALARM_PENDING, 0, True), self.mock_publish.mock_calls[-2][1]) # Fast-forward a little bit future = dt_util.utcnow() + timedelta(seconds=1) with patch(('homeassistant.components.alarm_control_panel.manual_mqtt.' 'dt_util.utcnow'), return_value=future): fire_time_changed(self.hass, future) self.hass.block_till_done() self.assertEqual(('alarm/state', STATE_ALARM_ARMED_NIGHT, 0, True), self.mock_publish.mock_calls[-2][1]) # Disarm alarm_control_panel.alarm_disarm(self.hass) self.hass.block_till_done() self.assertEqual(('alarm/state', STATE_ALARM_DISARMED, 0, True), self.mock_publish.mock_calls[-2][1])
def test_see_passive_zone_state(self): """Test that the device tracker sets gps for passive trackers.""" register_time = datetime(2015, 9, 15, 23, tzinfo=dt_util.UTC) scan_time = datetime(2015, 9, 15, 23, 1, tzinfo=dt_util.UTC) with assert_setup_component(1, zone.DOMAIN): zone_info = { 'name': 'Home', 'latitude': 1, 'longitude': 2, 'radius': 250, 'passive': False } setup_component(self.hass, zone.DOMAIN, { 'zone': zone_info }) scanner = get_component('device_tracker.test').SCANNER scanner.reset() scanner.come_home('dev1') with patch('homeassistant.components.device_tracker.dt_util.utcnow', return_value=register_time): with assert_setup_component(1, device_tracker.DOMAIN): assert setup_component(self.hass, device_tracker.DOMAIN, { device_tracker.DOMAIN: { CONF_PLATFORM: 'test', device_tracker.CONF_CONSIDER_HOME: 59, }}) self.hass.block_till_done() state = self.hass.states.get('device_tracker.dev1') attrs = state.attributes self.assertEqual(STATE_HOME, state.state) self.assertEqual(state.object_id, 'dev1') self.assertEqual(state.name, 'dev1') self.assertEqual(attrs.get('friendly_name'), 'dev1') self.assertEqual(attrs.get('latitude'), 1) self.assertEqual(attrs.get('longitude'), 2) self.assertEqual(attrs.get('gps_accuracy'), 0) self.assertEqual(attrs.get('source_type'), device_tracker.SOURCE_TYPE_ROUTER) scanner.leave_home('dev1') with patch('homeassistant.components.device_tracker.dt_util.utcnow', return_value=scan_time): fire_time_changed(self.hass, scan_time) self.hass.block_till_done() state = self.hass.states.get('device_tracker.dev1') attrs = state.attributes self.assertEqual(STATE_NOT_HOME, state.state) self.assertEqual(state.object_id, 'dev1') self.assertEqual(state.name, 'dev1') self.assertEqual(attrs.get('friendly_name'), 'dev1') self.assertEqual(attrs.get('latitude'), None) self.assertEqual(attrs.get('longitude'), None) self.assertEqual(attrs.get('gps_accuracy'), None) self.assertEqual(attrs.get('source_type'), device_tracker.SOURCE_TYPE_ROUTER)