class DiscoveryService(Listener): """Discovery event handler for gree devices.""" def __init__(self, hass) -> None: """Initialize discovery service.""" super().__init__() self.hass = hass self.discovery = Discovery(DISCOVERY_TIMEOUT) self.discovery.add_listener(self) hass.data[DOMAIN].setdefault(COORDINATORS, []) async def device_found(self, device_info: DeviceInfo) -> None: """Handle new device found on the network.""" device = Device(device_info) try: await device.bind() except DeviceNotBoundError: _LOGGER.error("Unable to bind to gree device: %s", device_info) except DeviceTimeoutError: _LOGGER.error("Timeout trying to bind to gree device: %s", device_info) _LOGGER.info( "Adding Gree device %s at %s:%i", device.device_info.name, device.device_info.ip, device.device_info.port, ) coordo = DeviceDataUpdateCoordinator(self.hass, device) self.hass.data[DOMAIN][COORDINATORS].append(coordo) await coordo.async_refresh() async_dispatcher_send(self.hass, DISPATCH_DEVICE_DISCOVERED, coordo)
async def run_discovery(bind=False): """Run the device discovery process.""" _LOGGER.debug("Scanning network for Gree devices") discovery = Discovery() listener = DiscoveryListener(bind) discovery.add_listener(listener) await discovery.scan(wait_for=10) _LOGGER.info("Done discovering devices")
async def test_add_new_listener(): """Register a listener, test that is registered.""" listener = MagicMock(spec_set=Listener) discovery = Discovery() result = discovery.add_listener(listener) assert result is not None result = discovery.add_listener(listener) assert result is None
async def test_remove_listener(): """Register, remove listener, test results.""" listener = MagicMock(spec_set=Listener) discovery = Discovery() result = discovery.add_listener(listener) assert result is not None result = discovery.remove_listener(listener) assert result is True result = discovery.remove_listener(listener) assert result is False
async def test_add_new_listener_with_devices(): """Register a listener, test that is registered.""" with patch.object(Discovery, "devices", new_callable=PropertyMock) as mock: mock.return_value = [get_mock_device_info()] listener = MagicMock(spec_set=Listener) discovery = Discovery() result = discovery.add_listener(listener) await asyncio.gather(*discovery.tasks) assert result is not None assert len(result) == 1 assert listener.device_found.call_count == 1