2018-12-01 02:28:27 -07:00
|
|
|
"""The tests for the DirecTV Media player platform."""
|
2019-12-09 17:42:00 +01:00
|
|
|
from datetime import datetime, timedelta
|
2020-03-11 14:28:38 -05:00
|
|
|
from typing import Optional
|
2018-12-01 02:28:27 -07:00
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
from asynctest import patch
|
|
|
|
from pytest import fixture
|
|
|
|
from requests import RequestException
|
2018-12-01 02:28:27 -07:00
|
|
|
|
2019-12-09 17:42:00 +01:00
|
|
|
from homeassistant.components.directv.media_player import (
|
|
|
|
ATTR_MEDIA_CURRENTLY_RECORDING,
|
|
|
|
ATTR_MEDIA_RATING,
|
|
|
|
ATTR_MEDIA_RECORDED,
|
|
|
|
ATTR_MEDIA_START_TIME,
|
|
|
|
)
|
2019-02-08 23:18:18 +01:00
|
|
|
from homeassistant.components.media_player.const import (
|
2019-12-09 17:42:00 +01:00
|
|
|
ATTR_INPUT_SOURCE,
|
|
|
|
ATTR_MEDIA_CHANNEL,
|
2019-07-31 12:25:30 -07:00
|
|
|
ATTR_MEDIA_CONTENT_ID,
|
|
|
|
ATTR_MEDIA_CONTENT_TYPE,
|
|
|
|
ATTR_MEDIA_DURATION,
|
2019-12-09 17:42:00 +01:00
|
|
|
ATTR_MEDIA_ENQUEUE,
|
2019-07-31 12:25:30 -07:00
|
|
|
ATTR_MEDIA_POSITION,
|
|
|
|
ATTR_MEDIA_POSITION_UPDATED_AT,
|
2019-12-09 17:42:00 +01:00
|
|
|
ATTR_MEDIA_SERIES_TITLE,
|
|
|
|
ATTR_MEDIA_TITLE,
|
2020-03-11 14:28:38 -05:00
|
|
|
DOMAIN as MP_DOMAIN,
|
2019-12-09 17:42:00 +01:00
|
|
|
MEDIA_TYPE_TVSHOW,
|
2019-07-31 12:25:30 -07:00
|
|
|
SERVICE_PLAY_MEDIA,
|
2019-12-09 17:42:00 +01:00
|
|
|
SUPPORT_NEXT_TRACK,
|
2019-07-31 12:25:30 -07:00
|
|
|
SUPPORT_PAUSE,
|
2019-12-09 17:42:00 +01:00
|
|
|
SUPPORT_PLAY,
|
2019-07-31 12:25:30 -07:00
|
|
|
SUPPORT_PLAY_MEDIA,
|
|
|
|
SUPPORT_PREVIOUS_TRACK,
|
2019-12-09 17:42:00 +01:00
|
|
|
SUPPORT_STOP,
|
|
|
|
SUPPORT_TURN_OFF,
|
|
|
|
SUPPORT_TURN_ON,
|
2019-07-31 12:25:30 -07:00
|
|
|
)
|
2018-12-01 02:28:27 -07:00
|
|
|
from homeassistant.const import (
|
2019-07-31 12:25:30 -07:00
|
|
|
ATTR_ENTITY_ID,
|
|
|
|
SERVICE_MEDIA_NEXT_TRACK,
|
|
|
|
SERVICE_MEDIA_PAUSE,
|
|
|
|
SERVICE_MEDIA_PLAY,
|
|
|
|
SERVICE_MEDIA_PREVIOUS_TRACK,
|
|
|
|
SERVICE_MEDIA_STOP,
|
|
|
|
SERVICE_TURN_OFF,
|
|
|
|
SERVICE_TURN_ON,
|
|
|
|
STATE_OFF,
|
|
|
|
STATE_PAUSED,
|
|
|
|
STATE_PLAYING,
|
|
|
|
STATE_UNAVAILABLE,
|
|
|
|
)
|
2020-03-11 14:28:38 -05:00
|
|
|
from homeassistant.helpers.typing import HomeAssistantType
|
|
|
|
from homeassistant.util import dt as dt_util
|
2018-12-01 02:28:27 -07:00
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
from tests.common import MockConfigEntry, async_fire_time_changed
|
|
|
|
from tests.components.directv import (
|
|
|
|
DOMAIN,
|
|
|
|
MOCK_GET_LOCATIONS_MULTIPLE,
|
|
|
|
RECORDING,
|
|
|
|
MockDirectvClass,
|
|
|
|
setup_integration,
|
|
|
|
)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
2020-02-23 12:26:34 -06:00
|
|
|
ATTR_UNIQUE_ID = "unique_id"
|
2020-03-11 14:28:38 -05:00
|
|
|
CLIENT_ENTITY_ID = f"{MP_DOMAIN}.bedroom_client"
|
|
|
|
MAIN_ENTITY_ID = f"{MP_DOMAIN}.main_dvr"
|
2018-12-01 02:28:27 -07:00
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
# pylint: disable=redefined-outer-name
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
@fixture
|
|
|
|
def mock_now() -> datetime:
|
|
|
|
"""Fixture for dtutil.now."""
|
|
|
|
return dt_util.utcnow()
|
2019-07-31 12:25:30 -07:00
|
|
|
|
2018-12-01 02:28:27 -07:00
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def setup_directv(hass: HomeAssistantType) -> MockConfigEntry:
|
|
|
|
"""Set up mock DirecTV integration."""
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.directv.DIRECTV", new=MockDirectvClass,
|
|
|
|
):
|
|
|
|
return await setup_integration(hass)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-13 23:55:21 -05:00
|
|
|
async def setup_directv_with_locations(hass: HomeAssistantType) -> MockConfigEntry:
|
2020-03-11 14:28:38 -05:00
|
|
|
"""Set up mock DirecTV integration."""
|
2019-12-04 22:47:40 -08:00
|
|
|
with patch(
|
2020-03-13 23:55:21 -05:00
|
|
|
"tests.components.directv.test_media_player.MockDirectvClass.get_locations",
|
2020-03-11 14:28:38 -05:00
|
|
|
return_value=MOCK_GET_LOCATIONS_MULTIPLE,
|
|
|
|
):
|
2020-03-13 23:55:21 -05:00
|
|
|
with patch(
|
|
|
|
"homeassistant.components.directv.DIRECTV", new=MockDirectvClass,
|
|
|
|
), patch(
|
|
|
|
"homeassistant.components.directv.media_player.DIRECTV",
|
|
|
|
new=MockDirectvClass,
|
|
|
|
):
|
|
|
|
return await setup_integration(hass)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def async_turn_on(
|
|
|
|
hass: HomeAssistantType, entity_id: Optional[str] = None
|
|
|
|
) -> None:
|
2018-12-01 02:28:27 -07:00
|
|
|
"""Turn on specified media player or all."""
|
|
|
|
data = {ATTR_ENTITY_ID: entity_id} if entity_id else {}
|
2020-03-11 14:28:38 -05:00
|
|
|
await hass.services.async_call(MP_DOMAIN, SERVICE_TURN_ON, data)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def async_turn_off(
|
|
|
|
hass: HomeAssistantType, entity_id: Optional[str] = None
|
|
|
|
) -> None:
|
2018-12-01 02:28:27 -07:00
|
|
|
"""Turn off specified media player or all."""
|
|
|
|
data = {ATTR_ENTITY_ID: entity_id} if entity_id else {}
|
2020-03-11 14:28:38 -05:00
|
|
|
await hass.services.async_call(MP_DOMAIN, SERVICE_TURN_OFF, data)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def async_media_pause(
|
|
|
|
hass: HomeAssistantType, entity_id: Optional[str] = None
|
|
|
|
) -> None:
|
2018-12-01 02:28:27 -07:00
|
|
|
"""Send the media player the command for pause."""
|
|
|
|
data = {ATTR_ENTITY_ID: entity_id} if entity_id else {}
|
2020-03-11 14:28:38 -05:00
|
|
|
await hass.services.async_call(MP_DOMAIN, SERVICE_MEDIA_PAUSE, data)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def async_media_play(
|
|
|
|
hass: HomeAssistantType, entity_id: Optional[str] = None
|
|
|
|
) -> None:
|
2018-12-01 02:28:27 -07:00
|
|
|
"""Send the media player the command for play/pause."""
|
|
|
|
data = {ATTR_ENTITY_ID: entity_id} if entity_id else {}
|
2020-03-11 14:28:38 -05:00
|
|
|
await hass.services.async_call(MP_DOMAIN, SERVICE_MEDIA_PLAY, data)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def async_media_stop(
|
|
|
|
hass: HomeAssistantType, entity_id: Optional[str] = None
|
|
|
|
) -> None:
|
2018-12-01 02:28:27 -07:00
|
|
|
"""Send the media player the command for stop."""
|
|
|
|
data = {ATTR_ENTITY_ID: entity_id} if entity_id else {}
|
2020-03-11 14:28:38 -05:00
|
|
|
await hass.services.async_call(MP_DOMAIN, SERVICE_MEDIA_STOP, data)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def async_media_next_track(
|
|
|
|
hass: HomeAssistantType, entity_id: Optional[str] = None
|
|
|
|
) -> None:
|
2018-12-01 02:28:27 -07:00
|
|
|
"""Send the media player the command for next track."""
|
|
|
|
data = {ATTR_ENTITY_ID: entity_id} if entity_id else {}
|
2020-03-11 14:28:38 -05:00
|
|
|
await hass.services.async_call(MP_DOMAIN, SERVICE_MEDIA_NEXT_TRACK, data)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def async_media_previous_track(
|
|
|
|
hass: HomeAssistantType, entity_id: Optional[str] = None
|
|
|
|
) -> None:
|
2018-12-01 02:28:27 -07:00
|
|
|
"""Send the media player the command for prev track."""
|
|
|
|
data = {ATTR_ENTITY_ID: entity_id} if entity_id else {}
|
2020-03-11 14:28:38 -05:00
|
|
|
await hass.services.async_call(MP_DOMAIN, SERVICE_MEDIA_PREVIOUS_TRACK, data)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def async_play_media(
|
|
|
|
hass: HomeAssistantType,
|
|
|
|
media_type: str,
|
|
|
|
media_id: str,
|
|
|
|
entity_id: Optional[str] = None,
|
|
|
|
enqueue: Optional[str] = None,
|
|
|
|
) -> None:
|
2018-12-01 02:28:27 -07:00
|
|
|
"""Send the media player the command for playing media."""
|
2019-07-31 12:25:30 -07:00
|
|
|
data = {ATTR_MEDIA_CONTENT_TYPE: media_type, ATTR_MEDIA_CONTENT_ID: media_id}
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
if entity_id:
|
|
|
|
data[ATTR_ENTITY_ID] = entity_id
|
|
|
|
|
|
|
|
if enqueue:
|
|
|
|
data[ATTR_MEDIA_ENQUEUE] = enqueue
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
await hass.services.async_call(MP_DOMAIN, SERVICE_PLAY_MEDIA, data)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def test_setup(hass: HomeAssistantType) -> None:
|
|
|
|
"""Test setup with basic config."""
|
|
|
|
await setup_directv(hass)
|
|
|
|
assert hass.states.get(MAIN_ENTITY_ID)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-13 23:55:21 -05:00
|
|
|
async def test_setup_with_multiple_locations(hass: HomeAssistantType) -> None:
|
2020-03-11 14:28:38 -05:00
|
|
|
"""Test setup with basic config with client location."""
|
2020-03-13 23:55:21 -05:00
|
|
|
await setup_directv_with_locations(hass)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
assert hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert hass.states.get(CLIENT_ENTITY_ID)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-13 23:55:21 -05:00
|
|
|
async def test_unique_id(hass: HomeAssistantType) -> None:
|
2020-02-23 12:26:34 -06:00
|
|
|
"""Test unique id."""
|
2020-03-13 23:55:21 -05:00
|
|
|
await setup_directv_with_locations(hass)
|
2020-03-11 14:28:38 -05:00
|
|
|
|
2020-02-23 12:26:34 -06:00
|
|
|
entity_registry = await hass.helpers.entity_registry.async_get_registry()
|
|
|
|
|
|
|
|
main = entity_registry.async_get(MAIN_ENTITY_ID)
|
|
|
|
assert main.unique_id == "028877455858"
|
|
|
|
|
|
|
|
client = entity_registry.async_get(CLIENT_ENTITY_ID)
|
|
|
|
assert client.unique_id == "2CA17D1CD30X"
|
|
|
|
|
|
|
|
|
2020-03-13 23:55:21 -05:00
|
|
|
async def test_supported_features(hass: HomeAssistantType) -> None:
|
2018-12-01 02:28:27 -07:00
|
|
|
"""Test supported features."""
|
2020-03-13 23:55:21 -05:00
|
|
|
await setup_directv_with_locations(hass)
|
2020-03-11 14:28:38 -05:00
|
|
|
|
2018-12-01 02:28:27 -07:00
|
|
|
# Features supported for main DVR
|
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
2019-07-31 12:25:30 -07:00
|
|
|
assert (
|
|
|
|
SUPPORT_PAUSE
|
|
|
|
| SUPPORT_TURN_ON
|
|
|
|
| SUPPORT_TURN_OFF
|
|
|
|
| SUPPORT_PLAY_MEDIA
|
|
|
|
| SUPPORT_STOP
|
|
|
|
| SUPPORT_NEXT_TRACK
|
|
|
|
| SUPPORT_PREVIOUS_TRACK
|
|
|
|
| SUPPORT_PLAY
|
|
|
|
== state.attributes.get("supported_features")
|
|
|
|
)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
# Feature supported for clients.
|
|
|
|
state = hass.states.get(CLIENT_ENTITY_ID)
|
2019-07-31 12:25:30 -07:00
|
|
|
assert (
|
|
|
|
SUPPORT_PAUSE
|
|
|
|
| SUPPORT_PLAY_MEDIA
|
|
|
|
| SUPPORT_STOP
|
|
|
|
| SUPPORT_NEXT_TRACK
|
|
|
|
| SUPPORT_PREVIOUS_TRACK
|
|
|
|
| SUPPORT_PLAY
|
|
|
|
== state.attributes.get("supported_features")
|
|
|
|
)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def test_check_attributes(
|
2020-03-13 23:55:21 -05:00
|
|
|
hass: HomeAssistantType, mock_now: dt_util.dt.datetime
|
2020-03-11 14:28:38 -05:00
|
|
|
) -> None:
|
2018-12-01 02:28:27 -07:00
|
|
|
"""Test attributes."""
|
2020-03-13 23:55:21 -05:00
|
|
|
await setup_directv_with_locations(hass)
|
2020-03-11 14:28:38 -05:00
|
|
|
|
2018-12-01 02:28:27 -07:00
|
|
|
next_update = mock_now + timedelta(minutes=5)
|
2019-07-31 12:25:30 -07:00
|
|
|
with patch("homeassistant.util.dt.utcnow", return_value=next_update):
|
2018-12-01 02:28:27 -07:00
|
|
|
async_fire_time_changed(hass, next_update)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
|
|
|
|
# Start playing TV
|
2019-07-31 12:25:30 -07:00
|
|
|
with patch("homeassistant.util.dt.utcnow", return_value=next_update):
|
2018-12-01 02:28:27 -07:00
|
|
|
await async_media_play(hass, CLIENT_ENTITY_ID)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
|
|
|
|
state = hass.states.get(CLIENT_ENTITY_ID)
|
|
|
|
assert state.state == STATE_PLAYING
|
|
|
|
|
2019-07-31 12:25:30 -07:00
|
|
|
assert state.attributes.get(ATTR_MEDIA_CONTENT_ID) == RECORDING["programId"]
|
|
|
|
assert state.attributes.get(ATTR_MEDIA_CONTENT_TYPE) == MEDIA_TYPE_TVSHOW
|
|
|
|
assert state.attributes.get(ATTR_MEDIA_DURATION) == RECORDING["duration"]
|
2019-02-08 23:18:18 +01:00
|
|
|
assert state.attributes.get(ATTR_MEDIA_POSITION) == 2
|
2019-07-31 12:25:30 -07:00
|
|
|
assert state.attributes.get(ATTR_MEDIA_POSITION_UPDATED_AT) == next_update
|
|
|
|
assert state.attributes.get(ATTR_MEDIA_TITLE) == RECORDING["title"]
|
|
|
|
assert state.attributes.get(ATTR_MEDIA_SERIES_TITLE) == RECORDING["episodeTitle"]
|
|
|
|
assert state.attributes.get(ATTR_MEDIA_CHANNEL) == "{} ({})".format(
|
|
|
|
RECORDING["callsign"], RECORDING["major"]
|
|
|
|
)
|
|
|
|
assert state.attributes.get(ATTR_INPUT_SOURCE) == RECORDING["major"]
|
|
|
|
assert (
|
|
|
|
state.attributes.get(ATTR_MEDIA_CURRENTLY_RECORDING) == RECORDING["isRecording"]
|
|
|
|
)
|
|
|
|
assert state.attributes.get(ATTR_MEDIA_RATING) == RECORDING["rating"]
|
2018-12-01 02:28:27 -07:00
|
|
|
assert state.attributes.get(ATTR_MEDIA_RECORDED)
|
2019-07-31 12:25:30 -07:00
|
|
|
assert state.attributes.get(ATTR_MEDIA_START_TIME) == datetime(
|
|
|
|
2018, 11, 10, 19, 0, tzinfo=dt_util.UTC
|
|
|
|
)
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
# Test to make sure that ATTR_MEDIA_POSITION_UPDATED_AT is not
|
|
|
|
# updated if TV is paused.
|
2019-07-31 12:25:30 -07:00
|
|
|
with patch(
|
|
|
|
"homeassistant.util.dt.utcnow", return_value=next_update + timedelta(minutes=5)
|
|
|
|
):
|
2018-12-01 02:28:27 -07:00
|
|
|
await async_media_pause(hass, CLIENT_ENTITY_ID)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
|
|
|
|
state = hass.states.get(CLIENT_ENTITY_ID)
|
|
|
|
assert state.state == STATE_PAUSED
|
2019-07-31 12:25:30 -07:00
|
|
|
assert state.attributes.get(ATTR_MEDIA_POSITION_UPDATED_AT) == next_update
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def test_main_services(
|
2020-03-13 23:55:21 -05:00
|
|
|
hass: HomeAssistantType, mock_now: dt_util.dt.datetime
|
2020-03-11 14:28:38 -05:00
|
|
|
) -> None:
|
2018-12-01 02:28:27 -07:00
|
|
|
"""Test the different services."""
|
2020-03-13 23:55:21 -05:00
|
|
|
await setup_directv(hass)
|
2020-03-11 14:28:38 -05:00
|
|
|
|
2018-12-01 02:28:27 -07:00
|
|
|
next_update = mock_now + timedelta(minutes=5)
|
2019-07-31 12:25:30 -07:00
|
|
|
with patch("homeassistant.util.dt.utcnow", return_value=next_update):
|
2018-12-01 02:28:27 -07:00
|
|
|
async_fire_time_changed(hass, next_update)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
# DVR starts in off state.
|
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert state.state == STATE_OFF
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
# Turn main DVR on. When turning on DVR is playing.
|
|
|
|
await async_turn_on(hass, MAIN_ENTITY_ID)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert state.state == STATE_PLAYING
|
2018-12-01 02:28:27 -07:00
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
# Pause live TV.
|
|
|
|
await async_media_pause(hass, MAIN_ENTITY_ID)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert state.state == STATE_PAUSED
|
2018-12-01 02:28:27 -07:00
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
# Start play again for live TV.
|
|
|
|
await async_media_play(hass, MAIN_ENTITY_ID)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert state.state == STATE_PLAYING
|
2018-12-01 02:28:27 -07:00
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
# Change channel, currently it should be 202
|
|
|
|
assert state.attributes.get("source") == 202
|
|
|
|
await async_play_media(hass, "channel", 7, MAIN_ENTITY_ID)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert state.attributes.get("source") == 7
|
2018-12-01 02:28:27 -07:00
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
# Stop live TV.
|
|
|
|
await async_media_stop(hass, MAIN_ENTITY_ID)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert state.state == STATE_PAUSED
|
2018-12-01 02:28:27 -07:00
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
# Turn main DVR off.
|
|
|
|
await async_turn_off(hass, MAIN_ENTITY_ID)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert state.state == STATE_OFF
|
2018-12-01 02:28:27 -07:00
|
|
|
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
async def test_available(
|
2020-03-13 23:55:21 -05:00
|
|
|
hass: HomeAssistantType, mock_now: dt_util.dt.datetime
|
2020-03-11 14:28:38 -05:00
|
|
|
) -> None:
|
2018-12-01 02:28:27 -07:00
|
|
|
"""Test available status."""
|
2020-03-13 23:55:21 -05:00
|
|
|
entry = await setup_directv(hass)
|
2020-03-11 14:28:38 -05:00
|
|
|
|
2018-12-01 02:28:27 -07:00
|
|
|
next_update = mock_now + timedelta(minutes=5)
|
2019-07-31 12:25:30 -07:00
|
|
|
with patch("homeassistant.util.dt.utcnow", return_value=next_update):
|
2018-12-01 02:28:27 -07:00
|
|
|
async_fire_time_changed(hass, next_update)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
|
|
|
|
# Confirm service is currently set to available.
|
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert state.state != STATE_UNAVAILABLE
|
|
|
|
|
2020-03-11 14:28:38 -05:00
|
|
|
assert hass.data[DOMAIN]
|
|
|
|
assert hass.data[DOMAIN][entry.entry_id]
|
|
|
|
assert hass.data[DOMAIN][entry.entry_id]["client"]
|
|
|
|
|
|
|
|
main_dtv = hass.data[DOMAIN][entry.entry_id]["client"]
|
|
|
|
|
2018-12-06 23:26:49 -07:00
|
|
|
# Make update fail 1st time
|
2018-12-01 02:28:27 -07:00
|
|
|
next_update = next_update + timedelta(minutes=5)
|
2020-03-11 14:28:38 -05:00
|
|
|
with patch.object(main_dtv, "get_standby", side_effect=RequestException), patch(
|
|
|
|
"homeassistant.util.dt.utcnow", return_value=next_update
|
|
|
|
):
|
2018-12-01 02:28:27 -07:00
|
|
|
async_fire_time_changed(hass, next_update)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
|
2018-12-06 23:26:49 -07:00
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert state.state != STATE_UNAVAILABLE
|
|
|
|
|
|
|
|
# Make update fail 2nd time within 1 minute
|
|
|
|
next_update = next_update + timedelta(seconds=30)
|
2020-03-11 14:28:38 -05:00
|
|
|
with patch.object(main_dtv, "get_standby", side_effect=RequestException), patch(
|
|
|
|
"homeassistant.util.dt.utcnow", return_value=next_update
|
|
|
|
):
|
2018-12-06 23:26:49 -07:00
|
|
|
async_fire_time_changed(hass, next_update)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
|
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert state.state != STATE_UNAVAILABLE
|
|
|
|
|
|
|
|
# Make update fail 3rd time more then a minute after 1st failure
|
|
|
|
next_update = next_update + timedelta(minutes=1)
|
2020-03-11 14:28:38 -05:00
|
|
|
with patch.object(main_dtv, "get_standby", side_effect=RequestException), patch(
|
|
|
|
"homeassistant.util.dt.utcnow", return_value=next_update
|
|
|
|
):
|
2018-12-06 23:26:49 -07:00
|
|
|
async_fire_time_changed(hass, next_update)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
|
2018-12-01 02:28:27 -07:00
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert state.state == STATE_UNAVAILABLE
|
|
|
|
|
|
|
|
# Recheck state, update should work again.
|
|
|
|
next_update = next_update + timedelta(minutes=5)
|
2019-07-31 12:25:30 -07:00
|
|
|
with patch("homeassistant.util.dt.utcnow", return_value=next_update):
|
2018-12-01 02:28:27 -07:00
|
|
|
async_fire_time_changed(hass, next_update)
|
|
|
|
await hass.async_block_till_done()
|
2020-03-11 14:28:38 -05:00
|
|
|
|
2018-12-01 02:28:27 -07:00
|
|
|
state = hass.states.get(MAIN_ENTITY_ID)
|
|
|
|
assert state.state != STATE_UNAVAILABLE
|