Improve demo media player platform tests (#41096)
This commit is contained in:
parent
8ae3f575dd
commit
d7f4cfbb65
1 changed files with 232 additions and 67 deletions
|
@ -3,12 +3,18 @@ import pytest
|
|||
import voluptuous as vol
|
||||
|
||||
import homeassistant.components.media_player as mp
|
||||
from homeassistant.const import ATTR_SUPPORTED_FEATURES
|
||||
from homeassistant.const import (
|
||||
ATTR_ENTITY_ID,
|
||||
ATTR_ENTITY_PICTURE,
|
||||
ATTR_SUPPORTED_FEATURES,
|
||||
STATE_OFF,
|
||||
STATE_PAUSED,
|
||||
STATE_PLAYING,
|
||||
)
|
||||
from homeassistant.helpers.aiohttp_client import DATA_CLIENTSESSION
|
||||
from homeassistant.setup import async_setup_component
|
||||
|
||||
from tests.async_mock import patch
|
||||
from tests.components.media_player import common
|
||||
|
||||
TEST_ENTITY_ID = "media_player.walkman"
|
||||
|
||||
|
@ -32,16 +38,26 @@ async def test_source_select(hass):
|
|||
)
|
||||
await hass.async_block_till_done()
|
||||
state = hass.states.get(entity_id)
|
||||
assert state.attributes.get("source") == "dvd"
|
||||
assert state.attributes.get(mp.ATTR_INPUT_SOURCE) == "dvd"
|
||||
|
||||
with pytest.raises(vol.Invalid):
|
||||
await common.async_select_source(hass, None, entity_id)
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_SELECT_SOURCE,
|
||||
{ATTR_ENTITY_ID: entity_id, mp.ATTR_INPUT_SOURCE: None},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(entity_id)
|
||||
assert state.attributes.get("source") == "dvd"
|
||||
assert state.attributes.get(mp.ATTR_INPUT_SOURCE) == "dvd"
|
||||
|
||||
await common.async_select_source(hass, "xbox", entity_id)
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_SELECT_SOURCE,
|
||||
{ATTR_ENTITY_ID: entity_id, mp.ATTR_INPUT_SOURCE: "xbox"},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(entity_id)
|
||||
assert state.attributes.get("source") == "xbox"
|
||||
assert state.attributes.get(mp.ATTR_INPUT_SOURCE) == "xbox"
|
||||
|
||||
|
||||
async def test_clear_playlist(hass):
|
||||
|
@ -50,10 +66,18 @@ async def test_clear_playlist(hass):
|
|||
hass, mp.DOMAIN, {"media_player": {"platform": "demo"}}
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
assert hass.states.is_state(TEST_ENTITY_ID, "playing")
|
||||
|
||||
await common.async_clear_playlist(hass, TEST_ENTITY_ID)
|
||||
assert hass.states.is_state(TEST_ENTITY_ID, "off")
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.state == STATE_PLAYING
|
||||
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_CLEAR_PLAYLIST,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.state == STATE_OFF
|
||||
|
||||
|
||||
async def test_volume_services(hass):
|
||||
|
@ -62,36 +86,70 @@ async def test_volume_services(hass):
|
|||
hass, mp.DOMAIN, {"media_player": {"platform": "demo"}}
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get("volume_level") == 1.0
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_VOLUME_LEVEL) == 1.0
|
||||
|
||||
with pytest.raises(vol.Invalid):
|
||||
await common.async_set_volume_level(hass, None, TEST_ENTITY_ID)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get("volume_level") == 1.0
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_VOLUME_SET,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID, mp.ATTR_MEDIA_VOLUME_LEVEL: None},
|
||||
blocking=True,
|
||||
)
|
||||
|
||||
await common.async_set_volume_level(hass, 0.5, TEST_ENTITY_ID)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get("volume_level") == 0.5
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_VOLUME_LEVEL) == 1.0
|
||||
|
||||
await common.async_volume_down(hass, TEST_ENTITY_ID)
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_VOLUME_SET,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID, mp.ATTR_MEDIA_VOLUME_LEVEL: 0.5},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get("volume_level") == 0.4
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_VOLUME_LEVEL) == 0.5
|
||||
|
||||
await common.async_volume_up(hass, TEST_ENTITY_ID)
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_VOLUME_DOWN,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get("volume_level") == 0.5
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_VOLUME_LEVEL) == 0.4
|
||||
|
||||
assert False is state.attributes.get("is_volume_muted")
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_VOLUME_UP,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_VOLUME_LEVEL) == 0.5
|
||||
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_VOLUME_MUTED) is False
|
||||
|
||||
with pytest.raises(vol.Invalid):
|
||||
await common.async_mute_volume(hass, None, TEST_ENTITY_ID)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get("is_volume_muted") is False
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_VOLUME_MUTE,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID, mp.ATTR_MEDIA_VOLUME_MUTED: None},
|
||||
blocking=True,
|
||||
)
|
||||
|
||||
await common.async_mute_volume(hass, True, TEST_ENTITY_ID)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get("is_volume_muted") is True
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_VOLUME_MUTED) is False
|
||||
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_VOLUME_MUTE,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID, mp.ATTR_MEDIA_VOLUME_MUTED: True},
|
||||
blocking=True,
|
||||
)
|
||||
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_VOLUME_MUTED) is True
|
||||
|
||||
|
||||
async def test_turning_off_and_on(hass):
|
||||
|
@ -100,17 +158,38 @@ async def test_turning_off_and_on(hass):
|
|||
hass, mp.DOMAIN, {"media_player": {"platform": "demo"}}
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
assert hass.states.is_state(TEST_ENTITY_ID, "playing")
|
||||
|
||||
await common.async_turn_off(hass, TEST_ENTITY_ID)
|
||||
assert hass.states.is_state(TEST_ENTITY_ID, "off")
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.state == STATE_PLAYING
|
||||
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_TURN_OFF,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.state == STATE_OFF
|
||||
assert not mp.is_on(hass, TEST_ENTITY_ID)
|
||||
|
||||
await common.async_turn_on(hass, TEST_ENTITY_ID)
|
||||
assert hass.states.is_state(TEST_ENTITY_ID, "playing")
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_TURN_ON,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.state == STATE_PLAYING
|
||||
assert mp.is_on(hass, TEST_ENTITY_ID)
|
||||
|
||||
await common.async_toggle(hass, TEST_ENTITY_ID)
|
||||
assert hass.states.is_state(TEST_ENTITY_ID, "off")
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_TOGGLE,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.state == STATE_OFF
|
||||
assert not mp.is_on(hass, TEST_ENTITY_ID)
|
||||
|
||||
|
||||
|
@ -120,19 +199,45 @@ async def test_playing_pausing(hass):
|
|||
hass, mp.DOMAIN, {"media_player": {"platform": "demo"}}
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
assert hass.states.is_state(TEST_ENTITY_ID, "playing")
|
||||
|
||||
await common.async_media_pause(hass, TEST_ENTITY_ID)
|
||||
assert hass.states.is_state(TEST_ENTITY_ID, "paused")
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.state == STATE_PLAYING
|
||||
|
||||
await common.async_media_play_pause(hass, TEST_ENTITY_ID)
|
||||
assert hass.states.is_state(TEST_ENTITY_ID, "playing")
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_MEDIA_PAUSE,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.state == STATE_PAUSED
|
||||
|
||||
await common.async_media_play_pause(hass, TEST_ENTITY_ID)
|
||||
assert hass.states.is_state(TEST_ENTITY_ID, "paused")
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_MEDIA_PLAY_PAUSE,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.state == STATE_PLAYING
|
||||
|
||||
await common.async_media_play(hass, TEST_ENTITY_ID)
|
||||
assert hass.states.is_state(TEST_ENTITY_ID, "playing")
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_MEDIA_PLAY_PAUSE,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.state == STATE_PAUSED
|
||||
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_MEDIA_PLAY,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.state == STATE_PLAYING
|
||||
|
||||
|
||||
async def test_prev_next_track(hass):
|
||||
|
@ -141,36 +246,63 @@ async def test_prev_next_track(hass):
|
|||
hass, mp.DOMAIN, {"media_player": {"platform": "demo"}}
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get("media_track") == 1
|
||||
|
||||
await common.async_media_next_track(hass, TEST_ENTITY_ID)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get("media_track") == 2
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_TRACK) == 1
|
||||
|
||||
await common.async_media_next_track(hass, TEST_ENTITY_ID)
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_MEDIA_NEXT_TRACK,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get("media_track") == 3
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_TRACK) == 2
|
||||
|
||||
await common.async_media_previous_track(hass, TEST_ENTITY_ID)
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_MEDIA_NEXT_TRACK,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get("media_track") == 2
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_TRACK) == 3
|
||||
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_MEDIA_PREVIOUS_TRACK,
|
||||
{ATTR_ENTITY_ID: TEST_ENTITY_ID},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_TRACK) == 2
|
||||
|
||||
assert await async_setup_component(
|
||||
hass, mp.DOMAIN, {"media_player": {"platform": "demo"}}
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
ent_id = "media_player.lounge_room"
|
||||
state = hass.states.get(ent_id)
|
||||
assert state.attributes.get("media_episode") == 1
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_EPISODE) == 1
|
||||
|
||||
await common.async_media_next_track(hass, ent_id)
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_MEDIA_NEXT_TRACK,
|
||||
{ATTR_ENTITY_ID: ent_id},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(ent_id)
|
||||
assert state.attributes.get("media_episode") == 2
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_EPISODE) == 2
|
||||
|
||||
await common.async_media_previous_track(hass, ent_id)
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_MEDIA_PREVIOUS_TRACK,
|
||||
{ATTR_ENTITY_ID: ent_id},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(ent_id)
|
||||
assert state.attributes.get("media_episode") == 1
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_EPISODE) == 1
|
||||
|
||||
|
||||
async def test_play_media(hass):
|
||||
|
@ -179,21 +311,36 @@ async def test_play_media(hass):
|
|||
hass, mp.DOMAIN, {"media_player": {"platform": "demo"}}
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
ent_id = "media_player.living_room"
|
||||
state = hass.states.get(ent_id)
|
||||
assert mp.SUPPORT_PLAY_MEDIA & state.attributes.get("supported_features") > 0
|
||||
assert state.attributes.get("media_content_id") is not None
|
||||
assert mp.SUPPORT_PLAY_MEDIA & state.attributes.get(ATTR_SUPPORTED_FEATURES) > 0
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_CONTENT_ID) is not None
|
||||
|
||||
with pytest.raises(vol.Invalid):
|
||||
await common.async_play_media(hass, None, "some_id", ent_id)
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_PLAY_MEDIA,
|
||||
{ATTR_ENTITY_ID: ent_id, mp.ATTR_MEDIA_CONTENT_ID: "some_id"},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(ent_id)
|
||||
assert mp.SUPPORT_PLAY_MEDIA & state.attributes.get("supported_features") > 0
|
||||
assert state.attributes.get("media_content_id") != "some_id"
|
||||
assert mp.SUPPORT_PLAY_MEDIA & state.attributes.get(ATTR_SUPPORTED_FEATURES) > 0
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_CONTENT_ID) != "some_id"
|
||||
|
||||
await common.async_play_media(hass, "youtube", "some_id", ent_id)
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_PLAY_MEDIA,
|
||||
{
|
||||
ATTR_ENTITY_ID: ent_id,
|
||||
mp.ATTR_MEDIA_CONTENT_TYPE: "youtube",
|
||||
mp.ATTR_MEDIA_CONTENT_ID: "some_id",
|
||||
},
|
||||
blocking=True,
|
||||
)
|
||||
state = hass.states.get(ent_id)
|
||||
assert mp.SUPPORT_PLAY_MEDIA & state.attributes.get("supported_features") > 0
|
||||
assert state.attributes.get("media_content_id") == "some_id"
|
||||
assert mp.SUPPORT_PLAY_MEDIA & state.attributes.get(ATTR_SUPPORTED_FEATURES) > 0
|
||||
assert state.attributes.get(mp.ATTR_MEDIA_CONTENT_ID) == "some_id"
|
||||
|
||||
|
||||
async def test_seek(hass, mock_media_seek):
|
||||
|
@ -202,15 +349,33 @@ async def test_seek(hass, mock_media_seek):
|
|||
hass, mp.DOMAIN, {"media_player": {"platform": "demo"}}
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
ent_id = "media_player.living_room"
|
||||
state = hass.states.get(ent_id)
|
||||
assert state.attributes[ATTR_SUPPORTED_FEATURES] & mp.SUPPORT_SEEK
|
||||
assert not mock_media_seek.called
|
||||
|
||||
with pytest.raises(vol.Invalid):
|
||||
await common.async_media_seek(hass, None, ent_id)
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_MEDIA_SEEK,
|
||||
{
|
||||
ATTR_ENTITY_ID: ent_id,
|
||||
mp.ATTR_MEDIA_SEEK_POSITION: None,
|
||||
},
|
||||
blocking=True,
|
||||
)
|
||||
assert not mock_media_seek.called
|
||||
|
||||
await common.async_media_seek(hass, 100, ent_id)
|
||||
await hass.services.async_call(
|
||||
mp.DOMAIN,
|
||||
mp.SERVICE_MEDIA_SEEK,
|
||||
{
|
||||
ATTR_ENTITY_ID: ent_id,
|
||||
mp.ATTR_MEDIA_SEEK_POSITION: 100,
|
||||
},
|
||||
blocking=True,
|
||||
)
|
||||
assert mock_media_seek.called
|
||||
|
||||
|
||||
|
@ -250,9 +415,9 @@ async def test_media_image_proxy(hass, hass_client):
|
|||
|
||||
hass.data[DATA_CLIENTSESSION] = MockWebsession()
|
||||
|
||||
assert hass.states.is_state(TEST_ENTITY_ID, "playing")
|
||||
state = hass.states.get(TEST_ENTITY_ID)
|
||||
assert state.state == STATE_PLAYING
|
||||
client = await hass_client()
|
||||
req = await client.get(state.attributes.get("entity_picture"))
|
||||
req = await client.get(state.attributes.get(ATTR_ENTITY_PICTURE))
|
||||
assert req.status == 200
|
||||
assert await req.text() == fake_picture_data
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue