core/tests/components/onkyo/test_media_player.py

231 lines
6.5 KiB
Python

"""Test Onkyo media player platform."""
from collections.abc import AsyncGenerator
from unittest.mock import AsyncMock, patch
from aioonkyo import Instruction, Zone, command
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.media_player import (
ATTR_INPUT_SOURCE,
ATTR_MEDIA_CONTENT_ID,
ATTR_MEDIA_CONTENT_TYPE,
ATTR_MEDIA_VOLUME_LEVEL,
ATTR_MEDIA_VOLUME_MUTED,
ATTR_SOUND_MODE,
DOMAIN as MEDIA_PLAYER_DOMAIN,
SERVICE_PLAY_MEDIA,
SERVICE_SELECT_SOUND_MODE,
SERVICE_SELECT_SOURCE,
)
from homeassistant.components.onkyo.services import (
ATTR_HDMI_OUTPUT,
SERVICE_SELECT_HDMI_OUTPUT,
)
from homeassistant.const import (
ATTR_ENTITY_ID,
SERVICE_TURN_OFF,
SERVICE_TURN_ON,
SERVICE_VOLUME_DOWN,
SERVICE_VOLUME_MUTE,
SERVICE_VOLUME_SET,
SERVICE_VOLUME_UP,
Platform,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers import entity_registry as er
from . import setup_integration
from tests.common import MockConfigEntry, snapshot_platform
ENTITY_ID = "media_player.tx_nr7100"
ENTITY_ID_ZONE_2 = "media_player.tx_nr7100_zone_2"
ENTITY_ID_ZONE_3 = "media_player.tx_nr7100_zone_3"
@pytest.fixture(autouse=True)
async def auto_setup_integration(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_receiver: AsyncMock,
writes: list[Instruction],
) -> AsyncGenerator[None]:
"""Auto setup integration."""
with (
patch(
"homeassistant.components.onkyo.media_player.AUDIO_VIDEO_INFORMATION_UPDATE_WAIT_TIME",
0,
),
patch("homeassistant.components.onkyo.PLATFORMS", [Platform.MEDIA_PLAYER]),
):
await setup_integration(hass, mock_config_entry)
writes.clear()
yield
async def test_entities(
hass: HomeAssistant,
snapshot: SnapshotAssertion,
mock_config_entry: MockConfigEntry,
entity_registry: er.EntityRegistry,
) -> None:
"""Test entities."""
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
@pytest.mark.parametrize(
("action", "action_data", "message"),
[
(SERVICE_TURN_ON, {}, command.Power(Zone.MAIN, command.Power.Param.ON)),
(SERVICE_TURN_OFF, {}, command.Power(Zone.MAIN, command.Power.Param.STANDBY)),
(
SERVICE_VOLUME_SET,
{ATTR_MEDIA_VOLUME_LEVEL: 0.5},
command.Volume(Zone.MAIN, 40),
),
(SERVICE_VOLUME_UP, {}, command.Volume(Zone.MAIN, command.Volume.Param.UP)),
(SERVICE_VOLUME_DOWN, {}, command.Volume(Zone.MAIN, command.Volume.Param.DOWN)),
(
SERVICE_VOLUME_MUTE,
{ATTR_MEDIA_VOLUME_MUTED: True},
command.Muting(Zone.MAIN, command.Muting.Param.ON),
),
(
SERVICE_VOLUME_MUTE,
{ATTR_MEDIA_VOLUME_MUTED: False},
command.Muting(Zone.MAIN, command.Muting.Param.OFF),
),
],
)
async def test_actions(
hass: HomeAssistant,
writes: list[Instruction],
action: str,
action_data: dict,
message: Instruction,
) -> None:
"""Test actions."""
await hass.services.async_call(
MEDIA_PLAYER_DOMAIN,
action,
{ATTR_ENTITY_ID: ENTITY_ID, **action_data},
blocking=True,
)
assert writes[0] == message
async def test_select_source(hass: HomeAssistant, writes: list[Instruction]) -> None:
"""Test select source."""
await hass.services.async_call(
MEDIA_PLAYER_DOMAIN,
SERVICE_SELECT_SOURCE,
{ATTR_ENTITY_ID: ENTITY_ID, ATTR_INPUT_SOURCE: "TV"},
blocking=True,
)
assert writes[0] == command.InputSource(Zone.MAIN, command.InputSource.Param("12"))
writes.clear()
with pytest.raises(ServiceValidationError):
await hass.services.async_call(
MEDIA_PLAYER_DOMAIN,
SERVICE_SELECT_SOURCE,
{ATTR_ENTITY_ID: ENTITY_ID, ATTR_INPUT_SOURCE: "InvalidSource"},
blocking=True,
)
assert not writes
async def test_select_sound_mode(
hass: HomeAssistant, writes: list[Instruction]
) -> None:
"""Test select sound mode."""
await hass.services.async_call(
MEDIA_PLAYER_DOMAIN,
SERVICE_SELECT_SOUND_MODE,
{ATTR_ENTITY_ID: ENTITY_ID, ATTR_SOUND_MODE: "THX"},
blocking=True,
)
assert writes[0] == command.ListeningMode(
Zone.MAIN, command.ListeningMode.Param("04")
)
writes.clear()
with pytest.raises(ServiceValidationError):
await hass.services.async_call(
MEDIA_PLAYER_DOMAIN,
SERVICE_SELECT_SOUND_MODE,
{ATTR_ENTITY_ID: ENTITY_ID, ATTR_SOUND_MODE: "InvalidMode"},
blocking=True,
)
assert not writes
async def test_play_media(hass: HomeAssistant, writes: list[Instruction]) -> None:
"""Test play media (radio preset)."""
await hass.services.async_call(
MEDIA_PLAYER_DOMAIN,
SERVICE_PLAY_MEDIA,
{
ATTR_ENTITY_ID: ENTITY_ID,
ATTR_MEDIA_CONTENT_TYPE: "radio",
ATTR_MEDIA_CONTENT_ID: "5",
},
blocking=True,
)
assert writes[0] == command.TunerPreset(Zone.MAIN, 5)
writes.clear()
await hass.services.async_call(
MEDIA_PLAYER_DOMAIN,
SERVICE_PLAY_MEDIA,
{
ATTR_ENTITY_ID: ENTITY_ID,
ATTR_MEDIA_CONTENT_TYPE: "music",
ATTR_MEDIA_CONTENT_ID: "5",
},
blocking=True,
)
assert not writes
writes.clear()
await hass.services.async_call(
MEDIA_PLAYER_DOMAIN,
SERVICE_PLAY_MEDIA,
{
ATTR_ENTITY_ID: ENTITY_ID_ZONE_2,
ATTR_MEDIA_CONTENT_TYPE: "radio",
ATTR_MEDIA_CONTENT_ID: "5",
},
blocking=True,
)
assert not writes
writes.clear()
await hass.services.async_call(
MEDIA_PLAYER_DOMAIN,
SERVICE_PLAY_MEDIA,
{
ATTR_ENTITY_ID: ENTITY_ID_ZONE_3,
ATTR_MEDIA_CONTENT_TYPE: "radio",
ATTR_MEDIA_CONTENT_ID: "5",
},
blocking=True,
)
assert not writes
async def test_select_hdmi_output(
hass: HomeAssistant, writes: list[Instruction]
) -> None:
"""Test select hdmi output."""
await hass.services.async_call(
MEDIA_PLAYER_DOMAIN,
SERVICE_SELECT_HDMI_OUTPUT,
{ATTR_ENTITY_ID: ENTITY_ID, ATTR_HDMI_OUTPUT: "sub"},
blocking=True,
)
assert writes[0] == command.HDMIOutput(command.HDMIOutput.Param.BOTH)