core/tests/components/devialet/__init__.py

151 lines
4.4 KiB
Python

"""Tests for the Devialet integration."""
from ipaddress import ip_address
from aiohttp import ClientError as ServerTimeoutError
from devialet.const import UrlSuffix
from homeassistant.components import zeroconf
from homeassistant.components.devialet.const import DOMAIN
from homeassistant.const import CONF_HOST, CONF_NAME, CONTENT_TYPE_JSON
from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry, load_fixture
from tests.test_util.aiohttp import AiohttpClientMocker
NAME = "Livingroom"
SERIAL = "L00P00000AB11"
HOST = "127.0.0.1"
CONF_INPUT = {CONF_HOST: HOST}
CONF_DATA = {
CONF_HOST: HOST,
CONF_NAME: NAME,
}
MOCK_CONFIG = {DOMAIN: [{CONF_HOST: HOST}]}
MOCK_USER_INPUT = {CONF_HOST: HOST}
MOCK_ZEROCONF_DATA = zeroconf.ZeroconfServiceInfo(
ip_address=ip_address(HOST),
ip_addresses=[ip_address(HOST)],
hostname="PhantomISilver-L00P00000AB11.local.",
type="_devialet-http._tcp.",
name="Livingroom",
port=80,
properties={
"_raw": {
"firmwareFamily": "DOS",
"firmwareVersion": "2.16.1.49152",
"ipControlVersion": "1",
"manufacturer": "Devialet",
"model": "Phantom I Silver",
"path": "/ipcontrol/v1",
"serialNumber": "L00P00000AB11",
},
"firmwareFamily": "DOS",
"firmwareVersion": "2.16.1.49152",
"ipControlVersion": "1",
"manufacturer": "Devialet",
"model": "Phantom I Silver",
"path": "/ipcontrol/v1",
"serialNumber": "L00P00000AB11",
},
)
def mock_unavailable(aioclient_mock: AiohttpClientMocker) -> None:
"""Mock the Devialet connection for Home Assistant."""
aioclient_mock.get(
f"http://{HOST}{UrlSuffix.GET_GENERAL_INFO}", exc=ServerTimeoutError
)
def mock_idle(aioclient_mock: AiohttpClientMocker) -> None:
"""Mock the Devialet connection for Home Assistant."""
aioclient_mock.get(
f"http://{HOST}{UrlSuffix.GET_GENERAL_INFO}",
text=load_fixture("general_info.json", DOMAIN),
headers={"Content-Type": CONTENT_TYPE_JSON},
)
aioclient_mock.get(
f"http://{HOST}{UrlSuffix.GET_CURRENT_SOURCE}",
exc=ServerTimeoutError,
)
def mock_playing(aioclient_mock: AiohttpClientMocker) -> None:
"""Mock the Devialet connection for Home Assistant."""
aioclient_mock.get(
f"http://{HOST}{UrlSuffix.GET_GENERAL_INFO}",
text=load_fixture("general_info.json", DOMAIN),
headers={"Content-Type": CONTENT_TYPE_JSON},
)
aioclient_mock.get(
f"http://{HOST}{UrlSuffix.GET_CURRENT_SOURCE}",
text=load_fixture("source_state.json", DOMAIN),
headers={"Content-Type": CONTENT_TYPE_JSON},
)
aioclient_mock.get(
f"http://{HOST}{UrlSuffix.GET_SOURCES}",
text=load_fixture("sources.json", DOMAIN),
headers={"Content-Type": CONTENT_TYPE_JSON},
)
aioclient_mock.get(
f"http://{HOST}{UrlSuffix.GET_VOLUME}",
text=load_fixture("volume.json", DOMAIN),
headers={"Content-Type": CONTENT_TYPE_JSON},
)
aioclient_mock.get(
f"http://{HOST}{UrlSuffix.GET_NIGHT_MODE}",
text=load_fixture("night_mode.json", DOMAIN),
headers={"Content-Type": CONTENT_TYPE_JSON},
)
aioclient_mock.get(
f"http://{HOST}{UrlSuffix.GET_EQUALIZER}",
text=load_fixture("equalizer.json", DOMAIN),
headers={"Content-Type": CONTENT_TYPE_JSON},
)
aioclient_mock.get(
f"http://{HOST}{UrlSuffix.GET_CURRENT_POSITION}",
text=load_fixture("current_position.json", DOMAIN),
headers={"Content-Type": CONTENT_TYPE_JSON},
)
async def setup_integration(
hass: HomeAssistant,
aioclient_mock: AiohttpClientMocker,
skip_entry_setup: bool = False,
state: str = "playing",
serial: str = SERIAL,
) -> MockConfigEntry:
"""Set up the Devialet integration in Home Assistant."""
if state == "playing":
mock_playing(aioclient_mock)
elif state == "unavailable":
mock_unavailable(aioclient_mock)
elif state == "idle":
mock_idle(aioclient_mock)
entry = MockConfigEntry(
domain=DOMAIN,
unique_id=serial,
data=CONF_DATA,
)
entry.add_to_hass(hass)
if not skip_entry_setup:
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
return entry