Exemplo n.º 1
0
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"})
Exemplo n.º 2
0
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
Exemplo n.º 3
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),
        )
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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"
Exemplo n.º 6
0
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
Exemplo n.º 7
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")
Exemplo n.º 8
0
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
Exemplo n.º 9
0
async def test_loop() -> None:
    """Test loop usage is handled correctly."""
    async with Roku(HOST) as roku:
        assert isinstance(roku, Roku)
Exemplo n.º 10
0
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")