async def test_launch(aresponses: ResponsesMockServer) -> None: """Test launch is handled correctly.""" aresponses.add( MATCH_HOST, "/launch/101", "POST", aresponses.Response(status=200), ) aresponses.add( MATCH_HOST, "/launch/102?contentID=deeplink", "POST", aresponses.Response(status=200), match_querystring=True, ) async with ClientSession() as session: roku = Roku(HOST, session=session) await roku.launch("101") await roku.launch("102", {"contentID": "deeplink"})
async def test_update_power_off(aresponses: ResponsesMockServer) -> None: """Test update method is handled correctly when power is off.""" aresponses.add( MATCH_HOST, "/query/device-info", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("device-info-power-off.xml"), ), ) aresponses.add( MATCH_HOST, "/query/apps", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("apps.xml"), ), ) async with ClientSession() as session: client = Roku(HOST, session=session) response = await client.update() assert response assert isinstance(response.info, models.Info) assert isinstance(response.state, models.State) assert isinstance(response.apps, list) assert isinstance(response.channels, list) assert response.app is None assert response.channel is None assert response.media is None assert response.state.available assert response.state.standby assert len(response.channels) == 0
def __init__( self, hass: HomeAssistant, *, host: str, ) -> None: """Initialize global Roku data updater.""" self.roku = Roku(host=host, session=async_get_clientsession(hass)) self.full_update_interval = timedelta(minutes=15) self.last_full_update = None super().__init__( hass, _LOGGER, name=DOMAIN, update_interval=SCAN_INTERVAL, # We don't want an immediate refresh since the device # takes a moment to reflect the state change request_refresh_debouncer=Debouncer(hass, _LOGGER, cooldown=REQUEST_REFRESH_DELAY, immediate=False), )
async def test_update_tv(aresponses): """Test update method is handled correctly for TVs.""" for _ in range(0, 2): aresponses.add( MATCH_HOST, "/query/device-info", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("device-info-tv.xml"), ), ) aresponses.add( MATCH_HOST, "/query/apps", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("apps-tv.xml"), ), ) aresponses.add( MATCH_HOST, "/query/active-app", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("active-app-tv.xml"), ), ) aresponses.add( MATCH_HOST, "/query/media-player", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("media-player-close.xml"), ), ) aresponses.add( MATCH_HOST, "/query/tv-active-channel", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("tv-active-channel.xml"), ), ) aresponses.add( MATCH_HOST, "/query/tv-channels", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("tv-channels.xml"), ), ) aresponses.add( MATCH_HOST, "/query/tv-channels", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("tv-channels-single.xml"), ), ) async with ClientSession() as session: client = Roku(HOST, session=session) response = await client.update() assert response assert isinstance(response.info, models.Info) assert isinstance(response.state, models.State) assert isinstance(response.apps, List) assert isinstance(response.channels, List) assert isinstance(response.app, models.Application) assert isinstance(response.channel, models.Channel) assert response.state.available assert not response.state.standby assert len(response.channels) == 2 response = await client.update(True) assert response assert isinstance(response.info, models.Info) assert isinstance(response.state, models.State) assert isinstance(response.apps, List) assert isinstance(response.channels, List) assert isinstance(response.app, models.Application) assert isinstance(response.channel, models.Channel) assert response.state.available assert not response.state.standby assert len(response.channels) == 1
async def test_app_icon_url(): """Test app_icon_url is handled correctly.""" async with ClientSession() as session: roku = Roku(HOST, session=session) assert roku.app_icon_url("101") == f"{ICON_BASE}/101"
async def test_update(aresponses): """Test update method is handled correctly.""" for _ in range(0, 2): aresponses.add( MATCH_HOST, "/query/device-info", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("device-info.xml"), ), ) aresponses.add( MATCH_HOST, "/query/apps", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("apps.xml"), ), ) aresponses.add( MATCH_HOST, "/query/active-app", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("active-app-roku.xml"), ), ) async with ClientSession() as session: client = Roku(HOST, session=session) response = await client.update() assert response assert isinstance(response.info, models.Info) assert isinstance(response.state, models.State) assert isinstance(response.apps, List) assert isinstance(response.channels, List) assert isinstance(response.app, models.Application) assert response.channel is None assert response.state.available assert not response.state.standby assert len(response.channels) == 0 response = await client.update() assert response assert isinstance(response.info, models.Info) assert isinstance(response.state, models.State) assert isinstance(response.apps, List) assert isinstance(response.channels, List) assert isinstance(response.app, models.Application) assert response.channel is None assert response.state.available assert not response.state.standby assert len(response.channels) == 0
async def test_remote_invalid_key(): """Test remote with invalid key is handled correctly.""" async with ClientSession() as session: roku = Roku(HOST, session=session) with pytest.raises(RokuError): await roku.remote("super")
async def test_update_standby(aresponses: ResponsesMockServer) -> None: """Test update method is handled correctly when device transitions to standby.""" aresponses.add( MATCH_HOST, "/query/device-info", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("device-info.xml"), ), ) aresponses.add( MATCH_HOST, "/query/apps", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("apps.xml"), ), repeat=2, ) aresponses.add( MATCH_HOST, "/query/active-app", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("active-app-pluto.xml"), ), ) aresponses.add( MATCH_HOST, "/query/media-player", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("media-player-pluto-play.xml"), ), ) aresponses.add( MATCH_HOST, "/query/device-info", "GET", aresponses.Response( status=200, headers={"Content-Type": "application/xml"}, text=load_fixture("device-info-standby.xml"), ), ) async with ClientSession() as session: client = Roku(HOST, session=session) response = await client.update() assert response assert isinstance(response.info, models.Info) assert isinstance(response.media, models.MediaState) assert isinstance(response.state, models.State) assert isinstance(response.apps, list) assert isinstance(response.channels, list) assert isinstance(response.app, models.Application) assert response.channel is None assert response.state.available assert not response.state.standby assert len(response.channels) == 0 assert not response.media.live assert not response.media.paused assert response.media.duration == 6496 assert response.media.position == 38 response = await client.update() assert response assert isinstance(response.info, models.Info) assert isinstance(response.state, models.State) assert isinstance(response.apps, list) assert isinstance(response.channels, list) assert response.app is None assert response.channel is None assert response.media is None assert response.state.available assert response.state.standby assert len(response.channels) == 0
async def test_loop() -> None: """Test loop usage is handled correctly.""" async with Roku(HOST) as roku: assert isinstance(roku, Roku)
async def test_client_error(): """Test HTTP client error.""" async with ClientSession() as session: client = Roku("#", session=session) with pytest.raises(RokuConnectionError): assert await client._request("client/error")