core/tests/components/skybell/conftest.py

135 lines
4.3 KiB
Python

"""Configure pytest for Skybell tests."""
from unittest.mock import AsyncMock, patch
from aioskybell import Skybell, SkybellDevice
from aioskybell.helpers.const import BASE_URL, USERS_ME_URL
import orjson
import pytest
from homeassistant.components.skybell.const import DOMAIN
from homeassistant.const import CONF_EMAIL, CONF_PASSWORD
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from tests.common import MockConfigEntry, async_load_fixture
from tests.test_util.aiohttp import AiohttpClientMocker
USERNAME = "user"
PASSWORD = "password"
USER_ID = "1234567890abcdef12345678"
DEVICE_ID = "012345670123456789abcdef"
CONF_DATA = {
CONF_EMAIL: USERNAME,
CONF_PASSWORD: PASSWORD,
}
@pytest.fixture(autouse=True)
def skybell_mock():
"""Fixture for our skybell tests."""
mocked_skybell_device = AsyncMock(spec=SkybellDevice)
mocked_skybell = AsyncMock(spec=Skybell)
mocked_skybell.async_get_devices.return_value = [mocked_skybell_device]
mocked_skybell.async_send_request.return_value = {"id": USER_ID}
mocked_skybell.user_id = USER_ID
with (
patch(
"homeassistant.components.skybell.config_flow.Skybell",
return_value=mocked_skybell,
),
patch("homeassistant.components.skybell.Skybell", return_value=mocked_skybell),
):
yield mocked_skybell
def create_entry(hass: HomeAssistant) -> MockConfigEntry:
"""Create fixture for adding config entry in Home Assistant."""
entry = MockConfigEntry(domain=DOMAIN, unique_id=USER_ID, data=CONF_DATA)
entry.add_to_hass(hass)
return entry
async def set_aioclient_responses(
hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
) -> None:
"""Set AioClient responses."""
aioclient_mock.get(
f"{BASE_URL}devices/{DEVICE_ID}/info/",
text=await async_load_fixture(hass, "device_info.json", DOMAIN),
)
aioclient_mock.get(
f"{BASE_URL}devices/{DEVICE_ID}/settings/",
text=await async_load_fixture(hass, "device_settings.json", DOMAIN),
)
aioclient_mock.get(
f"{BASE_URL}devices/{DEVICE_ID}/activities/",
text=await async_load_fixture(hass, "activities.json", DOMAIN),
)
aioclient_mock.get(
f"{BASE_URL}devices/",
text=await async_load_fixture(hass, "device.json", DOMAIN),
)
aioclient_mock.get(
USERS_ME_URL,
text=await async_load_fixture(hass, "me.json", DOMAIN),
)
aioclient_mock.post(
f"{BASE_URL}login/",
text=await async_load_fixture(hass, "login.json", DOMAIN),
)
aioclient_mock.get(
f"{BASE_URL}devices/{DEVICE_ID}/activities/1234567890ab1234567890ac/video/",
text=await async_load_fixture(hass, "video.json", DOMAIN),
)
aioclient_mock.get(
f"{BASE_URL}devices/{DEVICE_ID}/avatar/",
text=await async_load_fixture(hass, "avatar.json", DOMAIN),
)
aioclient_mock.get(
f"https://v3-production-devices-avatar.s3.us-west-2.amazonaws.com/{DEVICE_ID}.jpg",
)
aioclient_mock.get(
f"https://skybell-thumbnails-stage.s3.amazonaws.com/{DEVICE_ID}/1646859244793-951{DEVICE_ID}_{DEVICE_ID}.jpeg",
)
@pytest.fixture
async def connection(hass: HomeAssistant, aioclient_mock: AiohttpClientMocker) -> None:
"""Fixture for good connection responses."""
await set_aioclient_responses(hass, aioclient_mock)
async def create_skybell(hass: HomeAssistant) -> Skybell:
"""Create Skybell object."""
skybell = Skybell(
username=USERNAME,
password=PASSWORD,
get_devices=True,
session=async_get_clientsession(hass),
)
skybell._cache = orjson.loads(await async_load_fixture(hass, "cache.json", DOMAIN))
return skybell
async def mock_skybell(hass: HomeAssistant):
"""Mock Skybell object."""
return patch(
"homeassistant.components.skybell.Skybell",
return_value=await create_skybell(hass),
)
async def async_init_integration(hass: HomeAssistant) -> MockConfigEntry:
"""Set up the Skybell integration in Home Assistant."""
config_entry = create_entry(hass)
with await mock_skybell(hass), patch("aioskybell.utils.async_save_cache"):
await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
return config_entry