2020-09-08 06:37:44 +00:00
|
|
|
"""Setup mocks for the Plugwise integration tests."""
|
2022-02-05 18:07:02 +00:00
|
|
|
from __future__ import annotations
|
2020-09-08 06:37:44 +00:00
|
|
|
|
2022-02-05 18:07:02 +00:00
|
|
|
from collections.abc import Generator
|
2020-09-08 06:37:44 +00:00
|
|
|
from functools import partial
|
2021-10-23 18:56:30 +00:00
|
|
|
from http import HTTPStatus
|
2022-02-08 10:13:05 +00:00
|
|
|
import json
|
2020-09-08 06:37:44 +00:00
|
|
|
import re
|
2022-02-05 18:07:02 +00:00
|
|
|
from unittest.mock import AsyncMock, MagicMock, Mock, patch
|
2020-09-08 06:37:44 +00:00
|
|
|
|
2020-11-21 02:43:20 +00:00
|
|
|
from plugwise.exceptions import (
|
|
|
|
ConnectionFailedError,
|
|
|
|
InvalidAuthentication,
|
|
|
|
PlugwiseException,
|
|
|
|
XMLDataMissingError,
|
|
|
|
)
|
2020-09-08 06:37:44 +00:00
|
|
|
import pytest
|
|
|
|
|
|
|
|
from tests.common import load_fixture
|
|
|
|
from tests.test_util.aiohttp import AiohttpClientMocker
|
|
|
|
|
|
|
|
|
|
|
|
def _read_json(environment, call):
|
|
|
|
"""Undecode the json data."""
|
|
|
|
fixture = load_fixture(f"plugwise/{environment}/{call}.json")
|
2022-02-08 10:13:05 +00:00
|
|
|
return json.loads(fixture)
|
2020-09-08 06:37:44 +00:00
|
|
|
|
|
|
|
|
2022-02-05 18:07:02 +00:00
|
|
|
@pytest.fixture
|
|
|
|
def mock_setup_entry() -> Generator[AsyncMock, None, None]:
|
|
|
|
"""Mock setting up a config entry."""
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.plugwise.async_setup_entry", return_value=True
|
|
|
|
) as mock_setup:
|
|
|
|
yield mock_setup
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture()
|
|
|
|
def mock_smile_config_flow() -> Generator[None, MagicMock, None]:
|
|
|
|
"""Return a mocked Smile client."""
|
2020-09-08 06:37:44 +00:00
|
|
|
with patch(
|
|
|
|
"homeassistant.components.plugwise.config_flow.Smile",
|
2022-02-05 18:07:02 +00:00
|
|
|
autospec=True,
|
2020-09-08 06:37:44 +00:00
|
|
|
) as smile_mock:
|
2022-02-05 18:07:02 +00:00
|
|
|
smile = smile_mock.return_value
|
|
|
|
smile.smile_hostname = "smile12345"
|
|
|
|
smile.smile_name = "Test Smile Name"
|
|
|
|
smile.connect.return_value = True
|
|
|
|
yield smile
|
2020-09-08 06:37:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(name="mock_smile_unauth")
|
|
|
|
def mock_smile_unauth(aioclient_mock: AiohttpClientMocker) -> None:
|
|
|
|
"""Mock the Plugwise Smile unauthorized for Home Assistant."""
|
2021-10-23 18:56:30 +00:00
|
|
|
aioclient_mock.get(re.compile(".*"), status=HTTPStatus.UNAUTHORIZED)
|
|
|
|
aioclient_mock.put(re.compile(".*"), status=HTTPStatus.UNAUTHORIZED)
|
2020-09-08 06:37:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(name="mock_smile_error")
|
|
|
|
def mock_smile_error(aioclient_mock: AiohttpClientMocker) -> None:
|
|
|
|
"""Mock the Plugwise Smile server failure for Home Assistant."""
|
2021-10-23 18:56:30 +00:00
|
|
|
aioclient_mock.get(re.compile(".*"), status=HTTPStatus.INTERNAL_SERVER_ERROR)
|
|
|
|
aioclient_mock.put(re.compile(".*"), status=HTTPStatus.INTERNAL_SERVER_ERROR)
|
2020-09-08 06:37:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(name="mock_smile_notconnect")
|
|
|
|
def mock_smile_notconnect():
|
|
|
|
"""Mock the Plugwise Smile general connection failure for Home Assistant."""
|
2020-10-07 20:25:42 +00:00
|
|
|
with patch("homeassistant.components.plugwise.gateway.Smile") as smile_mock:
|
2020-11-21 02:43:20 +00:00
|
|
|
smile_mock.InvalidAuthentication = InvalidAuthentication
|
|
|
|
smile_mock.ConnectionFailedError = ConnectionFailedError
|
|
|
|
smile_mock.PlugwiseException = PlugwiseException
|
2020-09-08 06:37:44 +00:00
|
|
|
smile_mock.return_value.connect.side_effect = AsyncMock(return_value=False)
|
|
|
|
yield smile_mock.return_value
|
|
|
|
|
|
|
|
|
|
|
|
def _get_device_data(chosen_env, device_id):
|
|
|
|
"""Mock return data for specific devices."""
|
|
|
|
return _read_json(chosen_env, "get_device_data/" + device_id)
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(name="mock_smile_adam")
|
|
|
|
def mock_smile_adam():
|
|
|
|
"""Create a Mock Adam environment for testing exceptions."""
|
|
|
|
chosen_env = "adam_multiple_devices_per_zone"
|
2020-10-07 20:25:42 +00:00
|
|
|
with patch("homeassistant.components.plugwise.gateway.Smile") as smile_mock:
|
2020-11-21 02:43:20 +00:00
|
|
|
smile_mock.InvalidAuthentication = InvalidAuthentication
|
|
|
|
smile_mock.ConnectionFailedError = ConnectionFailedError
|
|
|
|
smile_mock.XMLDataMissingError = XMLDataMissingError
|
2020-09-08 06:37:44 +00:00
|
|
|
|
|
|
|
smile_mock.return_value.gateway_id = "fe799307f1624099878210aa0b9f1475"
|
|
|
|
smile_mock.return_value.heater_id = "90986d591dcd426cae3ec3e8111ff730"
|
|
|
|
smile_mock.return_value.smile_version = "3.0.15"
|
|
|
|
smile_mock.return_value.smile_type = "thermostat"
|
2020-09-13 09:02:49 +00:00
|
|
|
smile_mock.return_value.smile_hostname = "smile98765"
|
2022-02-08 10:13:05 +00:00
|
|
|
smile_mock.return_value.smile_name = "Adam"
|
2020-09-08 06:37:44 +00:00
|
|
|
|
2020-11-17 01:54:44 +00:00
|
|
|
smile_mock.return_value.notifications = _read_json(chosen_env, "notifications")
|
|
|
|
|
2020-09-08 06:37:44 +00:00
|
|
|
smile_mock.return_value.connect.side_effect = AsyncMock(return_value=True)
|
2020-10-07 20:25:42 +00:00
|
|
|
smile_mock.return_value.single_master_thermostat.side_effect = Mock(
|
2020-10-15 14:59:02 +00:00
|
|
|
return_value=False
|
2020-10-07 20:25:42 +00:00
|
|
|
)
|
2020-09-08 06:37:44 +00:00
|
|
|
smile_mock.return_value.set_schedule_state.side_effect = AsyncMock(
|
|
|
|
return_value=True
|
|
|
|
)
|
|
|
|
smile_mock.return_value.set_preset.side_effect = AsyncMock(return_value=True)
|
|
|
|
smile_mock.return_value.set_temperature.side_effect = AsyncMock(
|
|
|
|
return_value=True
|
|
|
|
)
|
2022-02-08 10:13:05 +00:00
|
|
|
smile_mock.return_value.async_update.side_effect = AsyncMock(
|
|
|
|
return_value=_read_json(chosen_env, "all_data")
|
2020-09-08 06:37:44 +00:00
|
|
|
)
|
2022-02-08 10:13:05 +00:00
|
|
|
smile_mock.return_value.set_switch_state.side_effect = AsyncMock(
|
|
|
|
return_value=True
|
2020-09-08 06:37:44 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
yield smile_mock.return_value
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(name="mock_smile_anna")
|
|
|
|
def mock_smile_anna():
|
|
|
|
"""Create a Mock Anna environment for testing exceptions."""
|
|
|
|
chosen_env = "anna_heatpump"
|
2020-10-07 20:25:42 +00:00
|
|
|
with patch("homeassistant.components.plugwise.gateway.Smile") as smile_mock:
|
2020-11-21 02:43:20 +00:00
|
|
|
smile_mock.InvalidAuthentication = InvalidAuthentication
|
|
|
|
smile_mock.ConnectionFailedError = ConnectionFailedError
|
|
|
|
smile_mock.XMLDataMissingError = XMLDataMissingError
|
2020-09-08 06:37:44 +00:00
|
|
|
|
|
|
|
smile_mock.return_value.gateway_id = "015ae9ea3f964e668e490fa39da3870b"
|
|
|
|
smile_mock.return_value.heater_id = "1cbf783bb11e4a7c8a6843dee3a86927"
|
|
|
|
smile_mock.return_value.smile_version = "4.0.15"
|
|
|
|
smile_mock.return_value.smile_type = "thermostat"
|
2020-09-13 09:02:49 +00:00
|
|
|
smile_mock.return_value.smile_hostname = "smile98765"
|
2022-02-08 10:13:05 +00:00
|
|
|
smile_mock.return_value.smile_name = "Anna"
|
2020-09-08 06:37:44 +00:00
|
|
|
|
2020-11-17 01:54:44 +00:00
|
|
|
smile_mock.return_value.notifications = _read_json(chosen_env, "notifications")
|
|
|
|
|
2020-09-08 06:37:44 +00:00
|
|
|
smile_mock.return_value.connect.side_effect = AsyncMock(return_value=True)
|
2020-10-07 20:25:42 +00:00
|
|
|
smile_mock.return_value.single_master_thermostat.side_effect = Mock(
|
|
|
|
return_value=True
|
|
|
|
)
|
2020-09-08 06:37:44 +00:00
|
|
|
smile_mock.return_value.set_schedule_state.side_effect = AsyncMock(
|
|
|
|
return_value=True
|
|
|
|
)
|
|
|
|
smile_mock.return_value.set_preset.side_effect = AsyncMock(return_value=True)
|
|
|
|
smile_mock.return_value.set_temperature.side_effect = AsyncMock(
|
|
|
|
return_value=True
|
|
|
|
)
|
2022-02-08 10:13:05 +00:00
|
|
|
smile_mock.return_value.set_switch_state.side_effect = AsyncMock(
|
2020-09-08 06:37:44 +00:00
|
|
|
return_value=True
|
|
|
|
)
|
|
|
|
|
2022-02-08 10:13:05 +00:00
|
|
|
smile_mock.return_value.async_update.side_effect = AsyncMock(
|
|
|
|
return_value=_read_json(chosen_env, "all_data")
|
2020-09-08 06:37:44 +00:00
|
|
|
)
|
|
|
|
smile_mock.return_value.get_device_data.side_effect = partial(
|
|
|
|
_get_device_data, chosen_env
|
|
|
|
)
|
|
|
|
|
|
|
|
yield smile_mock.return_value
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(name="mock_smile_p1")
|
|
|
|
def mock_smile_p1():
|
|
|
|
"""Create a Mock P1 DSMR environment for testing exceptions."""
|
|
|
|
chosen_env = "p1v3_full_option"
|
2020-10-07 20:25:42 +00:00
|
|
|
with patch("homeassistant.components.plugwise.gateway.Smile") as smile_mock:
|
2020-11-21 02:43:20 +00:00
|
|
|
smile_mock.InvalidAuthentication = InvalidAuthentication
|
|
|
|
smile_mock.ConnectionFailedError = ConnectionFailedError
|
|
|
|
smile_mock.XMLDataMissingError = XMLDataMissingError
|
2020-09-08 06:37:44 +00:00
|
|
|
|
|
|
|
smile_mock.return_value.gateway_id = "e950c7d5e1ee407a858e2a8b5016c8b3"
|
|
|
|
smile_mock.return_value.heater_id = None
|
|
|
|
smile_mock.return_value.smile_version = "3.3.9"
|
|
|
|
smile_mock.return_value.smile_type = "power"
|
2020-09-13 09:02:49 +00:00
|
|
|
smile_mock.return_value.smile_hostname = "smile98765"
|
2022-02-08 10:13:05 +00:00
|
|
|
smile_mock.return_value.smile_name = "Smile P1"
|
2020-09-08 06:37:44 +00:00
|
|
|
|
2020-11-17 01:54:44 +00:00
|
|
|
smile_mock.return_value.notifications = _read_json(chosen_env, "notifications")
|
|
|
|
|
2020-09-08 06:37:44 +00:00
|
|
|
smile_mock.return_value.connect.side_effect = AsyncMock(return_value=True)
|
|
|
|
|
2020-10-07 20:25:42 +00:00
|
|
|
smile_mock.return_value.single_master_thermostat.side_effect = Mock(
|
|
|
|
return_value=None
|
|
|
|
)
|
|
|
|
|
2020-09-08 06:37:44 +00:00
|
|
|
smile_mock.return_value.get_device_data.side_effect = partial(
|
|
|
|
_get_device_data, chosen_env
|
|
|
|
)
|
|
|
|
|
2022-02-08 10:13:05 +00:00
|
|
|
smile_mock.return_value.async_update.side_effect = AsyncMock(
|
|
|
|
return_value=_read_json(chosen_env, "all_data")
|
|
|
|
)
|
|
|
|
|
2020-09-08 06:37:44 +00:00
|
|
|
yield smile_mock.return_value
|
2020-11-08 17:09:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(name="mock_stretch")
|
|
|
|
def mock_stretch():
|
|
|
|
"""Create a Mock Stretch environment for testing exceptions."""
|
|
|
|
chosen_env = "stretch_v31"
|
|
|
|
with patch("homeassistant.components.plugwise.gateway.Smile") as smile_mock:
|
2020-11-21 02:43:20 +00:00
|
|
|
smile_mock.InvalidAuthentication = InvalidAuthentication
|
|
|
|
smile_mock.ConnectionFailedError = ConnectionFailedError
|
|
|
|
smile_mock.XMLDataMissingError = XMLDataMissingError
|
2020-11-08 17:09:43 +00:00
|
|
|
|
|
|
|
smile_mock.return_value.gateway_id = "259882df3c05415b99c2d962534ce820"
|
|
|
|
smile_mock.return_value.heater_id = None
|
|
|
|
smile_mock.return_value.smile_version = "3.1.11"
|
|
|
|
smile_mock.return_value.smile_type = "stretch"
|
|
|
|
smile_mock.return_value.smile_hostname = "stretch98765"
|
2022-02-08 10:13:05 +00:00
|
|
|
smile_mock.return_value.smile_name = "Stretch"
|
2020-11-08 17:09:43 +00:00
|
|
|
|
|
|
|
smile_mock.return_value.connect.side_effect = AsyncMock(return_value=True)
|
2022-02-08 10:13:05 +00:00
|
|
|
smile_mock.return_value.set_switch_state.side_effect = AsyncMock(
|
2020-11-08 17:09:43 +00:00
|
|
|
return_value=True
|
|
|
|
)
|
|
|
|
smile_mock.return_value.get_device_data.side_effect = partial(
|
|
|
|
_get_device_data, chosen_env
|
|
|
|
)
|
|
|
|
|
2022-02-08 10:13:05 +00:00
|
|
|
smile_mock.return_value.async_update.side_effect = AsyncMock(
|
|
|
|
return_value=_read_json(chosen_env, "all_data")
|
|
|
|
)
|
|
|
|
|
2020-11-08 17:09:43 +00:00
|
|
|
yield smile_mock.return_value
|