core/tests/components/subaru/conftest.py

203 lines
6.3 KiB
Python

"""Common functions needed to setup tests for Subaru component."""
from datetime import timedelta
from typing import Any
from unittest.mock import patch
import pytest
from subarulink.const import COUNTRY_USA
from homeassistant import config_entries
from homeassistant.components.homeassistant import DOMAIN as HA_DOMAIN
from homeassistant.components.subaru.const import (
CONF_UPDATE_ENABLED,
DOMAIN,
FETCH_INTERVAL,
VEHICLE_API_GEN,
VEHICLE_HAS_EV,
VEHICLE_HAS_REMOTE_SERVICE,
VEHICLE_HAS_REMOTE_START,
VEHICLE_HAS_SAFETY_SERVICE,
VEHICLE_MODEL_NAME,
VEHICLE_MODEL_YEAR,
VEHICLE_NAME,
)
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import (
CONF_COUNTRY,
CONF_DEVICE_ID,
CONF_PASSWORD,
CONF_PIN,
CONF_USERNAME,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.typing import UNDEFINED, UndefinedType
from homeassistant.setup import async_setup_component
import homeassistant.util.dt as dt_util
from .api_responses import TEST_VIN_2_EV, VEHICLE_DATA, VEHICLE_STATUS_EV
from tests.common import MockConfigEntry, async_fire_time_changed
MOCK_API = "homeassistant.components.subaru.SubaruAPI."
MOCK_API_DEVICE_REGISTERED = f"{MOCK_API}device_registered"
MOCK_API_2FA_CONTACTS = f"{MOCK_API}contact_methods"
MOCK_API_2FA_REQUEST = f"{MOCK_API}request_auth_code"
MOCK_API_2FA_VERIFY = f"{MOCK_API}submit_auth_code"
MOCK_API_CONNECT = f"{MOCK_API}connect"
MOCK_API_IS_PIN_REQUIRED = f"{MOCK_API}is_pin_required"
MOCK_API_TEST_PIN = f"{MOCK_API}test_pin"
MOCK_API_UPDATE_SAVED_PIN = f"{MOCK_API}update_saved_pin"
MOCK_API_GET_VEHICLES = f"{MOCK_API}get_vehicles"
MOCK_API_VIN_TO_NAME = f"{MOCK_API}vin_to_name"
MOCK_API_GET_API_GEN = f"{MOCK_API}get_api_gen"
MOCK_API_GET_MODEL_NAME = f"{MOCK_API}get_model_name"
MOCK_API_GET_MODEL_YEAR = f"{MOCK_API}get_model_year"
MOCK_API_GET_EV_STATUS = f"{MOCK_API}get_ev_status"
MOCK_API_GET_RES_STATUS = f"{MOCK_API}get_res_status"
MOCK_API_GET_REMOTE_STATUS = f"{MOCK_API}get_remote_status"
MOCK_API_GET_SAFETY_STATUS = f"{MOCK_API}get_safety_status"
MOCK_API_GET_SUBSCRIPTION_STATUS = f"{MOCK_API}get_subscription_status"
MOCK_API_GET_DATA = f"{MOCK_API}get_data"
MOCK_API_GET_RAW_DATA = f"{MOCK_API}get_raw_data"
MOCK_API_UPDATE = f"{MOCK_API}update"
MOCK_API_FETCH = f"{MOCK_API}fetch"
TEST_USERNAME = "user@email.com"
TEST_PASSWORD = "password"
TEST_PIN = "1234"
TEST_DEVICE_ID = 1613183362
TEST_COUNTRY = COUNTRY_USA
TEST_CREDS = {
CONF_USERNAME: TEST_USERNAME,
CONF_PASSWORD: TEST_PASSWORD,
CONF_COUNTRY: TEST_COUNTRY,
}
TEST_CONFIG = {
CONF_USERNAME: TEST_USERNAME,
CONF_PASSWORD: TEST_PASSWORD,
CONF_COUNTRY: TEST_COUNTRY,
CONF_PIN: TEST_PIN,
CONF_DEVICE_ID: TEST_DEVICE_ID,
}
TEST_OPTIONS = {
CONF_UPDATE_ENABLED: True,
}
TEST_CONFIG_ENTRY = {
"entry_id": "1",
"domain": DOMAIN,
"title": TEST_CONFIG[CONF_USERNAME],
"data": TEST_CONFIG,
"options": TEST_OPTIONS,
"source": config_entries.SOURCE_USER,
}
TEST_DEVICE_NAME = "test_vehicle_2"
TEST_ENTITY_ID = f"sensor.{TEST_DEVICE_NAME}_odometer"
def advance_time_to_next_fetch(hass: HomeAssistant) -> None:
"""Fast forward time to next fetch."""
future = dt_util.utcnow() + timedelta(seconds=FETCH_INTERVAL + 30)
async_fire_time_changed(hass, future)
async def setup_subaru_config_entry(
hass: HomeAssistant,
config_entry,
vehicle_list: list[str] | UndefinedType = UNDEFINED,
vehicle_data: dict[str, Any] | UndefinedType = UNDEFINED,
vehicle_status: dict[str, Any] | UndefinedType = UNDEFINED,
connect_effect=None,
fetch_effect=None,
):
"""Run async_setup with API mocks in place."""
if vehicle_data is UNDEFINED:
vehicle_data = VEHICLE_DATA[TEST_VIN_2_EV]
with (
patch(
MOCK_API_CONNECT,
return_value=connect_effect is None,
side_effect=connect_effect,
),
patch(
MOCK_API_GET_VEHICLES,
return_value=[TEST_VIN_2_EV] if vehicle_list is UNDEFINED else vehicle_list,
),
patch(
MOCK_API_VIN_TO_NAME,
return_value=vehicle_data[VEHICLE_NAME],
),
patch(
MOCK_API_GET_API_GEN,
return_value=vehicle_data[VEHICLE_API_GEN],
),
patch(
MOCK_API_GET_MODEL_NAME,
return_value=vehicle_data[VEHICLE_MODEL_NAME],
),
patch(
MOCK_API_GET_MODEL_YEAR,
return_value=vehicle_data[VEHICLE_MODEL_YEAR],
),
patch(
MOCK_API_GET_EV_STATUS,
return_value=vehicle_data[VEHICLE_HAS_EV],
),
patch(
MOCK_API_GET_RES_STATUS,
return_value=vehicle_data[VEHICLE_HAS_REMOTE_START],
),
patch(
MOCK_API_GET_REMOTE_STATUS,
return_value=vehicle_data[VEHICLE_HAS_REMOTE_SERVICE],
),
patch(
MOCK_API_GET_SAFETY_STATUS,
return_value=vehicle_data[VEHICLE_HAS_SAFETY_SERVICE],
),
patch(
MOCK_API_GET_SUBSCRIPTION_STATUS,
return_value=True,
),
patch(
MOCK_API_GET_DATA,
return_value=VEHICLE_STATUS_EV
if vehicle_status is UNDEFINED
else vehicle_status,
),
patch(
MOCK_API_UPDATE,
),
patch(MOCK_API_FETCH, side_effect=fetch_effect),
):
await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
@pytest.fixture
async def subaru_config_entry(hass: HomeAssistant) -> MockConfigEntry:
"""Create a Subaru config entry prior to setup."""
await async_setup_component(hass, HA_DOMAIN, {})
config_entry = MockConfigEntry(**TEST_CONFIG_ENTRY)
config_entry.add_to_hass(hass)
return config_entry
@pytest.fixture
async def ev_entry(
hass: HomeAssistant, subaru_config_entry: MockConfigEntry
) -> MockConfigEntry:
"""Create a Subaru entry representing an EV vehicle with full STARLINK subscription."""
await setup_subaru_config_entry(hass, subaru_config_entry)
assert DOMAIN in hass.config_entries.async_domains()
assert len(hass.config_entries.async_entries(DOMAIN)) == 1
assert hass.config_entries.async_get_entry(subaru_config_entry.entry_id)
assert subaru_config_entry.state is ConfigEntryState.LOADED
return subaru_config_entry