async def test_event_handler_dispatches_updated_devices( opp, config_entry, device_factory, event_request_factory, event_factory): """Test the event handler dispatches updated devices.""" devices = [ device_factory("Bedroom 1 Switch", ["switch"]), device_factory("Bathroom 1", ["switch"]), device_factory("Sensor", ["motionSensor"]), device_factory("Lock", ["lock"]), ] device_ids = [ devices[0].device_id, devices[1].device_id, devices[2].device_id, devices[3].device_id, ] event = event_factory( devices[3].device_id, capability="lock", attribute="lock", value="locked", data={"codeId": "1"}, ) request = event_request_factory(device_ids=device_ids, events=[event]) config_entry.data = { **config_entry.data, CONF_INSTALLED_APP_ID: request.installed_app_id, } called = False def signal(ids): nonlocal called called = True assert device_ids == ids async_dispatcher_connect(opp, SIGNAL_SMARTTHINGS_UPDATE, signal) broker = smartthings.DeviceBroker(opp, config_entry, Mock(), Mock(), devices, []) broker.connect() # pylint:disable=protected-access await broker._event_handler(request, None, None) await opp.async_block_till_done() assert called for device in devices: assert device.status.values["Updated"] == "Value" assert devices[3].status.attributes["lock"].value == "locked" assert devices[3].status.attributes["lock"].data == {"codeId": "1"}
async def test_unload_entry(opp, config_entry): """Test entries are unloaded correctly.""" connect_disconnect = Mock() smart_app = Mock() smart_app.connect_event.return_value = connect_disconnect broker = smartthings.DeviceBroker(opp, config_entry, Mock(), smart_app, [], []) broker.connect() opp.data[DOMAIN][DATA_BROKERS][config_entry.entry_id] = broker with patch.object(opp.config_entries, "async_forward_entry_unload", return_value=True) as forward_mock: assert await smartthings.async_unload_entry(opp, config_entry) assert connect_disconnect.call_count == 1 assert config_entry.entry_id not in opp.data[DOMAIN][DATA_BROKERS] # Assert platforms unloaded await opp.async_block_till_done() assert forward_mock.call_count == len(PLATFORMS)
async def test_event_handler_ignores_other_installed_app( opp, config_entry, device_factory, event_request_factory): """Test the event handler dispatches updated devices.""" device = device_factory("Bedroom 1 Switch", ["switch"]) request = event_request_factory([device.device_id]) called = False def signal(ids): nonlocal called called = True async_dispatcher_connect(opp, SIGNAL_SMARTTHINGS_UPDATE, signal) broker = smartthings.DeviceBroker(opp, config_entry, Mock(), Mock(), [device], []) broker.connect() # pylint:disable=protected-access await broker._event_handler(request, None, None) await opp.async_block_till_done() assert not called
async def test_broker_regenerates_token(opp, config_entry): """Test the device broker regenerates the refresh token.""" token = Mock(OAuthToken) token.refresh_token = str(uuid4()) stored_action = None def async_track_time_interval(opp, action, interval): nonlocal stored_action stored_action = action with patch( "openpeerpower.components.smartthings.async_track_time_interval", new=async_track_time_interval, ): broker = smartthings.DeviceBroker(opp, config_entry, token, Mock(), [], []) broker.connect() assert stored_action await stored_action(None) # pylint:disable=not-callable assert token.refresh.call_count == 1 assert config_entry.data[CONF_REFRESH_TOKEN] == token.refresh_token
async def test_event_handler_fires_button_events(opp, config_entry, device_factory, event_factory, event_request_factory): """Test the event handler fires button events.""" device = device_factory("Button 1", ["button"]) event = event_factory(device.device_id, capability="button", attribute="button", value="pushed") request = event_request_factory(events=[event]) config_entry.data = { **config_entry.data, CONF_INSTALLED_APP_ID: request.installed_app_id, } called = False def handler(evt): nonlocal called called = True assert evt.data == { "component_id": "main", "device_id": device.device_id, "location_id": event.location_id, "value": "pushed", "name": device.label, "data": None, } opp.bus.async_listen(EVENT_BUTTON, handler) broker = smartthings.DeviceBroker(opp, config_entry, Mock(), Mock(), [device], []) broker.connect() # pylint:disable=protected-access await broker._event_handler(request, None, None) await opp.async_block_till_done() assert called