231 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
"""Fixtures for Risco tests."""
 | 
						|
 | 
						|
from collections.abc import AsyncGenerator
 | 
						|
from typing import Any
 | 
						|
from unittest.mock import MagicMock, PropertyMock, patch
 | 
						|
 | 
						|
from pyrisco.cloud.event import Event
 | 
						|
import pytest
 | 
						|
 | 
						|
from homeassistant.components.risco.const import DOMAIN, TYPE_LOCAL
 | 
						|
from homeassistant.const import (
 | 
						|
    CONF_HOST,
 | 
						|
    CONF_PASSWORD,
 | 
						|
    CONF_PIN,
 | 
						|
    CONF_PORT,
 | 
						|
    CONF_TYPE,
 | 
						|
    CONF_USERNAME,
 | 
						|
)
 | 
						|
from homeassistant.core import HomeAssistant
 | 
						|
 | 
						|
from .util import TEST_SITE_NAME, TEST_SITE_UUID, system_mock, zone_mock
 | 
						|
 | 
						|
from tests.common import MockConfigEntry
 | 
						|
 | 
						|
TEST_CLOUD_CONFIG = {
 | 
						|
    CONF_USERNAME: "test-username",
 | 
						|
    CONF_PASSWORD: "test-password",
 | 
						|
    CONF_PIN: "1234",
 | 
						|
}
 | 
						|
TEST_LOCAL_CONFIG = {
 | 
						|
    CONF_TYPE: TYPE_LOCAL,
 | 
						|
    CONF_HOST: "test-host",
 | 
						|
    CONF_PORT: 5004,
 | 
						|
    CONF_PIN: "1234",
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def two_zone_cloud():
 | 
						|
    """Fixture to mock alarm with two zones."""
 | 
						|
    zone_mocks = {0: zone_mock(), 1: zone_mock()}
 | 
						|
    alarm_mock = MagicMock()
 | 
						|
    with (
 | 
						|
        patch.object(zone_mocks[0], "id", new_callable=PropertyMock(return_value=0)),
 | 
						|
        patch.object(
 | 
						|
            zone_mocks[0], "name", new_callable=PropertyMock(return_value="Zone 0")
 | 
						|
        ),
 | 
						|
        patch.object(
 | 
						|
            zone_mocks[0], "bypassed", new_callable=PropertyMock(return_value=False)
 | 
						|
        ),
 | 
						|
        patch.object(zone_mocks[1], "id", new_callable=PropertyMock(return_value=1)),
 | 
						|
        patch.object(
 | 
						|
            zone_mocks[1], "name", new_callable=PropertyMock(return_value="Zone 1")
 | 
						|
        ),
 | 
						|
        patch.object(
 | 
						|
            zone_mocks[1], "bypassed", new_callable=PropertyMock(return_value=False)
 | 
						|
        ),
 | 
						|
        patch.object(
 | 
						|
            alarm_mock,
 | 
						|
            "zones",
 | 
						|
            new_callable=PropertyMock(return_value=zone_mocks),
 | 
						|
        ),
 | 
						|
        patch(
 | 
						|
            "homeassistant.components.risco.RiscoCloud.get_state",
 | 
						|
            return_value=alarm_mock,
 | 
						|
        ),
 | 
						|
    ):
 | 
						|
        yield zone_mocks
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def two_zone_local():
 | 
						|
    """Fixture to mock alarm with two zones."""
 | 
						|
    zone_mocks = {0: zone_mock(), 1: zone_mock()}
 | 
						|
    system = system_mock()
 | 
						|
    with (
 | 
						|
        patch.object(zone_mocks[0], "id", new_callable=PropertyMock(return_value=0)),
 | 
						|
        patch.object(
 | 
						|
            zone_mocks[0], "name", new_callable=PropertyMock(return_value="Zone 0")
 | 
						|
        ),
 | 
						|
        patch.object(
 | 
						|
            zone_mocks[0], "alarmed", new_callable=PropertyMock(return_value=False)
 | 
						|
        ),
 | 
						|
        patch.object(
 | 
						|
            zone_mocks[0], "bypassed", new_callable=PropertyMock(return_value=False)
 | 
						|
        ),
 | 
						|
        patch.object(
 | 
						|
            zone_mocks[0], "armed", new_callable=PropertyMock(return_value=False)
 | 
						|
        ),
 | 
						|
        patch.object(zone_mocks[1], "id", new_callable=PropertyMock(return_value=1)),
 | 
						|
        patch.object(
 | 
						|
            zone_mocks[1], "name", new_callable=PropertyMock(return_value="Zone 1")
 | 
						|
        ),
 | 
						|
        patch.object(
 | 
						|
            zone_mocks[1], "alarmed", new_callable=PropertyMock(return_value=False)
 | 
						|
        ),
 | 
						|
        patch.object(
 | 
						|
            zone_mocks[1], "bypassed", new_callable=PropertyMock(return_value=False)
 | 
						|
        ),
 | 
						|
        patch.object(
 | 
						|
            zone_mocks[1], "armed", new_callable=PropertyMock(return_value=False)
 | 
						|
        ),
 | 
						|
        patch.object(
 | 
						|
            system, "name", new_callable=PropertyMock(return_value=TEST_SITE_NAME)
 | 
						|
        ),
 | 
						|
        patch(
 | 
						|
            "homeassistant.components.risco.RiscoLocal.partitions",
 | 
						|
            new_callable=PropertyMock(return_value={}),
 | 
						|
        ),
 | 
						|
        patch(
 | 
						|
            "homeassistant.components.risco.RiscoLocal.zones",
 | 
						|
            new_callable=PropertyMock(return_value=zone_mocks),
 | 
						|
        ),
 | 
						|
        patch(
 | 
						|
            "homeassistant.components.risco.RiscoLocal.system",
 | 
						|
            new_callable=PropertyMock(return_value=system),
 | 
						|
        ),
 | 
						|
    ):
 | 
						|
        yield zone_mocks
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def options() -> dict[str, Any]:
 | 
						|
    """Fixture for default (empty) options."""
 | 
						|
    return {}
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def events() -> list[Event]:
 | 
						|
    """Fixture for default (empty) events."""
 | 
						|
    return []
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def cloud_config_entry(hass: HomeAssistant, options: dict[str, Any]) -> MockConfigEntry:
 | 
						|
    """Fixture for a cloud config entry."""
 | 
						|
    config_entry = MockConfigEntry(
 | 
						|
        domain=DOMAIN,
 | 
						|
        data=TEST_CLOUD_CONFIG,
 | 
						|
        options=options,
 | 
						|
        unique_id=TEST_CLOUD_CONFIG[CONF_USERNAME],
 | 
						|
    )
 | 
						|
    config_entry.add_to_hass(hass)
 | 
						|
    return config_entry
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def login_with_error(exception):
 | 
						|
    """Fixture to simulate error on login."""
 | 
						|
    with patch(
 | 
						|
        "homeassistant.components.risco.RiscoCloud.login",
 | 
						|
        side_effect=exception,
 | 
						|
    ):
 | 
						|
        yield
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
async def setup_risco_cloud(
 | 
						|
    hass: HomeAssistant, cloud_config_entry: MockConfigEntry, events: list[Event]
 | 
						|
) -> AsyncGenerator[MockConfigEntry]:
 | 
						|
    """Set up a Risco integration for testing."""
 | 
						|
    with (
 | 
						|
        patch(
 | 
						|
            "homeassistant.components.risco.RiscoCloud.login",
 | 
						|
            return_value=True,
 | 
						|
        ),
 | 
						|
        patch(
 | 
						|
            "homeassistant.components.risco.RiscoCloud.site_uuid",
 | 
						|
            new_callable=PropertyMock(return_value=TEST_SITE_UUID),
 | 
						|
        ),
 | 
						|
        patch(
 | 
						|
            "homeassistant.components.risco.RiscoCloud.site_name",
 | 
						|
            new_callable=PropertyMock(return_value=TEST_SITE_NAME),
 | 
						|
        ),
 | 
						|
        patch(
 | 
						|
            "homeassistant.components.risco.RiscoCloud.close",
 | 
						|
        ),
 | 
						|
        patch(
 | 
						|
            "homeassistant.components.risco.RiscoCloud.get_events",
 | 
						|
            return_value=events,
 | 
						|
        ),
 | 
						|
    ):
 | 
						|
        await hass.config_entries.async_setup(cloud_config_entry.entry_id)
 | 
						|
        await hass.async_block_till_done()
 | 
						|
 | 
						|
        yield cloud_config_entry
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def local_config_entry(hass: HomeAssistant, options: dict[str, Any]) -> MockConfigEntry:
 | 
						|
    """Fixture for a local config entry."""
 | 
						|
    config_entry = MockConfigEntry(
 | 
						|
        domain=DOMAIN, data=TEST_LOCAL_CONFIG, options=options
 | 
						|
    )
 | 
						|
    config_entry.add_to_hass(hass)
 | 
						|
    return config_entry
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def connect_with_error(exception):
 | 
						|
    """Fixture to simulate error on connect."""
 | 
						|
    with patch(
 | 
						|
        "homeassistant.components.risco.RiscoLocal.connect",
 | 
						|
        side_effect=exception,
 | 
						|
    ):
 | 
						|
        yield
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
async def setup_risco_local(
 | 
						|
    hass: HomeAssistant, local_config_entry: MockConfigEntry
 | 
						|
) -> AsyncGenerator[MockConfigEntry]:
 | 
						|
    """Set up a local Risco integration for testing."""
 | 
						|
    with (
 | 
						|
        patch(
 | 
						|
            "homeassistant.components.risco.RiscoLocal.connect",
 | 
						|
            return_value=True,
 | 
						|
        ),
 | 
						|
        patch(
 | 
						|
            "homeassistant.components.risco.RiscoLocal.id",
 | 
						|
            new_callable=PropertyMock(return_value=TEST_SITE_UUID),
 | 
						|
        ),
 | 
						|
        patch(
 | 
						|
            "homeassistant.components.risco.RiscoLocal.disconnect",
 | 
						|
        ),
 | 
						|
    ):
 | 
						|
        await hass.config_entries.async_setup(local_config_entry.entry_id)
 | 
						|
        await hass.async_block_till_done()
 | 
						|
 | 
						|
        yield local_config_entry
 |