1
0
mirror of https://github.com/home-assistant/core.git synced 2026-08-06 21:35:13 +01:00
Files
core/tests/components/vizio/conftest.py
T
2026-07-31 11:00:46 +02:00

368 lines
11 KiB
Python

"""Configure py.test."""
from collections.abc import Generator
from unittest.mock import AsyncMock, patch
import pytest
from vizaio import AppConfig, InputInfo, SettingInfo, SettingType, VizioConnectionError
from vizaio.profiles import SOUNDBAR_PROFILE
from homeassistant.components.vizio.const import DOMAIN
from homeassistant.core import HomeAssistant
from .const import (
ACCESS_TOKEN,
APP_RECORDS,
CURRENT_APP_CONFIG_OBJ,
CURRENT_EQ,
CURRENT_INPUT,
EQ_LIST,
INPUT_LIST,
INPUT_LIST_WITH_APPS,
MOCK_SPEAKER_CONFIG,
MOCK_USER_VALID_TV_CONFIG,
MODEL,
PAIR_CHALLENGE,
UNIQUE_ID,
VERSION,
audio_setting,
)
from tests.common import MockConfigEntry
def get_mock_inputs(input_list: list[str]) -> list[InputInfo]:
"""Return list of InputInfo for the given input names."""
return [
InputInfo(name=name, meta_name=name, is_current=False) for name in input_list
]
@pytest.fixture
def mock_tv_config_entry() -> MockConfigEntry:
"""Return a mock TV config entry."""
return MockConfigEntry(
domain=DOMAIN,
data=MOCK_USER_VALID_TV_CONFIG,
unique_id=UNIQUE_ID,
)
@pytest.fixture
def mock_speaker_config_entry() -> MockConfigEntry:
"""Return a mock speaker config entry."""
return MockConfigEntry(
domain=DOMAIN,
data=MOCK_SPEAKER_CONFIG,
unique_id=UNIQUE_ID,
)
async def setup_integration(hass: HomeAssistant, config_entry: MockConfigEntry) -> None:
"""Add config entry to hass and set up the integration."""
config_entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
@pytest.fixture(name="vizio_get_unique_id", autouse=True)
def vizio_get_unique_id_fixture() -> Generator[None]:
"""Mock get vizio unique ID."""
with patch(
"homeassistant.components.vizio.config_flow.Vizio.get_serial_number",
AsyncMock(return_value=UNIQUE_ID),
):
yield
@pytest.fixture(name="vizio_data_coordinator_update", autouse=True)
def vizio_data_coordinator_update_fixture() -> Generator[None]:
"""Mock get data coordinator update."""
with (
patch(
"homeassistant.components.vizio.coordinator.fetch_remote_app_catalog",
return_value=APP_RECORDS,
),
patch(
"homeassistant.components.vizio.coordinator.fetch_app_availability",
return_value=(),
),
):
yield
@pytest.fixture(autouse=True)
def no_delay_secs() -> Generator[None]:
"""Patch default delay between remote command repeats to 0."""
with patch(
"homeassistant.components.vizio.remote.DEFAULT_DELAY_SECS",
0,
):
yield
@pytest.fixture(name="vizio_data_coordinator_update_failure")
def vizio_data_coordinator_update_failure_fixture() -> Generator[None]:
"""Mock get data coordinator update failure."""
with (
patch(
"homeassistant.components.vizio.coordinator.fetch_remote_app_catalog",
side_effect=VizioConnectionError("fetch failed"),
),
patch(
"homeassistant.components.vizio.coordinator.fetch_app_availability",
return_value=(),
),
):
yield
@pytest.fixture(name="vizio_no_unique_id")
def vizio_no_unique_id_fixture() -> Generator[None]:
"""Mock no vizio unique ID returrned."""
with patch(
"homeassistant.components.vizio.config_flow.Vizio.get_serial_number",
side_effect=VizioConnectionError("cannot connect"),
):
yield
@pytest.fixture(name="vizio_connect")
def vizio_connect_fixture() -> Generator[None]:
"""Mock valid vizio device and entry setup."""
with (
patch(
"homeassistant.components.vizio.config_flow.Vizio.ping",
AsyncMock(return_value=None),
),
patch(
"homeassistant.components.vizio.config_flow.Vizio.ping_auth",
AsyncMock(return_value=None),
),
):
yield
@pytest.fixture(name="vizio_complete_pairing")
def vizio_complete_pairing_fixture() -> Generator[None]:
"""Mock complete vizio pairing workflow."""
with (
patch(
"homeassistant.components.vizio.config_flow.Vizio.begin_pair",
return_value=PAIR_CHALLENGE,
),
patch(
"homeassistant.components.vizio.config_flow.Vizio.finish_pair",
return_value=ACCESS_TOKEN,
),
):
yield
@pytest.fixture(name="vizio_start_pairing_failure")
def vizio_start_pairing_failure_fixture() -> Generator[None]:
"""Mock vizio start pairing failure."""
with patch(
"homeassistant.components.vizio.config_flow.Vizio.begin_pair",
side_effect=VizioConnectionError("cannot connect"),
):
yield
@pytest.fixture(name="vizio_invalid_pin_failure")
def vizio_invalid_pin_failure_fixture() -> Generator[None]:
"""Mock vizio failure due to invalid pin."""
with (
patch(
"homeassistant.components.vizio.config_flow.Vizio.begin_pair",
return_value=PAIR_CHALLENGE,
),
patch(
"homeassistant.components.vizio.config_flow.Vizio.finish_pair",
side_effect=VizioConnectionError("invalid pin"),
),
):
yield
@pytest.fixture(name="vizio_bypass_setup")
def vizio_bypass_setup_fixture() -> Generator[None]:
"""Mock component setup."""
with patch("homeassistant.components.vizio.async_setup_entry", return_value=True):
yield
@pytest.fixture(name="vizio_bypass_update")
def vizio_bypass_update_fixture() -> Generator[None]:
"""Mock component update with minimal data."""
with (
patch(
"homeassistant.components.vizio.Vizio.get_power_state",
return_value=True,
),
patch(
"homeassistant.components.vizio.Vizio.get_settings",
return_value=None,
),
patch(
"homeassistant.components.vizio.Vizio.get_current_input",
return_value=None,
),
patch(
"homeassistant.components.vizio.Vizio.get_inputs",
return_value=None,
),
patch(
"homeassistant.components.vizio.Vizio.get_current_app_config",
return_value=None,
),
patch(
"homeassistant.components.vizio.Vizio.get_model_name",
return_value=None,
),
patch(
"homeassistant.components.vizio.Vizio.get_version",
return_value=None,
),
):
yield
@pytest.fixture(name="vizio_guess_device_type")
def vizio_guess_device_type_fixture() -> Generator[None]:
"""Mock vizio device type probe to report a speaker."""
with patch(
"homeassistant.components.vizio.config_flow.async_is_tv",
return_value=False,
):
yield
@pytest.fixture(name="vizio_detect_tv")
def vizio_detect_tv_fixture() -> Generator[None]:
"""Mock vizio device type probe to report a TV."""
with patch(
"homeassistant.components.vizio.config_flow.async_is_tv",
return_value=True,
):
yield
@pytest.fixture(name="vizio_cant_connect")
def vizio_cant_connect_fixture() -> Generator[None]:
"""Mock vizio device can't connect with valid auth."""
with (
patch(
"homeassistant.components.vizio.config_flow.Vizio.ping",
side_effect=VizioConnectionError("cannot connect"),
),
patch(
"homeassistant.components.vizio.config_flow.Vizio.ping_auth",
side_effect=VizioConnectionError("cannot connect"),
),
patch(
"homeassistant.components.vizio.Vizio.get_power_state",
side_effect=VizioConnectionError("cannot connect"),
),
patch(
"homeassistant.components.vizio.Vizio.get_model_name",
side_effect=VizioConnectionError("cannot connect"),
),
patch(
"homeassistant.components.vizio.Vizio.get_version",
side_effect=VizioConnectionError("cannot connect"),
),
):
yield
@pytest.fixture(name="vizio_update")
def vizio_update_fixture() -> Generator[None]:
"""Mock valid updates to vizio device."""
with (
patch(
"homeassistant.components.vizio.Vizio.get_settings",
return_value={
"volume": audio_setting("volume", int(SOUNDBAR_PROFILE.max_volume / 2)),
"eq": audio_setting("eq", CURRENT_EQ),
"mute": audio_setting("mute", "Off"),
},
),
patch(
"homeassistant.components.vizio.Vizio.get_setting",
return_value=SettingInfo(
setting_type="audio",
name="eq",
value=CURRENT_EQ,
hashval=0,
type=SettingType.LIST,
options=tuple(EQ_LIST),
),
),
patch(
"homeassistant.components.vizio.Vizio.get_current_input",
return_value=CURRENT_INPUT,
),
patch(
"homeassistant.components.vizio.Vizio.get_inputs",
return_value=get_mock_inputs(INPUT_LIST),
),
patch(
"homeassistant.components.vizio.Vizio.get_power_state",
return_value=True,
),
patch(
"homeassistant.components.vizio.Vizio.get_model_name",
return_value=MODEL,
),
patch(
"homeassistant.components.vizio.Vizio.get_version",
return_value=VERSION,
),
patch(
"homeassistant.components.vizio.Vizio.get_current_app_config",
return_value=None,
),
):
yield
@pytest.fixture(name="vizio_update_with_apps")
def vizio_update_with_apps_fixture(vizio_update: None) -> Generator[None]:
"""Mock valid updates to vizio device that supports apps."""
with (
patch(
"homeassistant.components.vizio.Vizio.get_inputs",
return_value=get_mock_inputs(INPUT_LIST_WITH_APPS),
),
patch(
"homeassistant.components.vizio.Vizio.get_current_input",
return_value="CAST",
),
patch(
"homeassistant.components.vizio.Vizio.get_current_app_config",
return_value=CURRENT_APP_CONFIG_OBJ,
),
):
yield
@pytest.fixture(name="vizio_update_with_apps_on_input")
def vizio_update_with_apps_on_input_fixture(vizio_update: None) -> Generator[None]:
"""Mock valid updates to vizio device that supports apps but is on a TV input."""
with (
patch(
"homeassistant.components.vizio.Vizio.get_inputs",
return_value=get_mock_inputs(INPUT_LIST_WITH_APPS),
),
patch(
"homeassistant.components.vizio.Vizio.get_current_input",
return_value=CURRENT_INPUT,
),
patch(
"homeassistant.components.vizio.Vizio.get_current_app_config",
return_value=AppConfig(app_id="unknown", name_space=1, message="app"),
),
):
yield