diff --git a/tests/components/sensibo/conftest.py b/tests/components/sensibo/conftest.py index 9380ee6ab6b..48c9317a5cb 100644 --- a/tests/components/sensibo/conftest.py +++ b/tests/components/sensibo/conftest.py @@ -1,8 +1,12 @@ """Fixtures for the Sensibo integration.""" from __future__ import annotations +import json +from typing import Any from unittest.mock import patch +from pysensibo import SensiboClient +from pysensibo.model import SensiboData import pytest from homeassistant.components.sensibo.const import DOMAIN @@ -10,13 +14,13 @@ from homeassistant.config_entries import SOURCE_USER from homeassistant.core import HomeAssistant from . import ENTRY_CONFIG -from .response import DATA_FROM_API -from tests.common import MockConfigEntry +from tests.common import MockConfigEntry, load_fixture +from tests.test_util.aiohttp import AiohttpClientMocker @pytest.fixture -async def load_int(hass: HomeAssistant) -> MockConfigEntry: +async def load_int(hass: HomeAssistant, get_data: SensiboData) -> MockConfigEntry: """Set up the Sensibo integration in Home Assistant.""" config_entry = MockConfigEntry( domain=DOMAIN, @@ -31,7 +35,7 @@ async def load_int(hass: HomeAssistant) -> MockConfigEntry: with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ), patch( "homeassistant.components.sensibo.util.SensiboClient.async_get_devices", return_value={"result": [{"id": "xyzxyz"}, {"id": "abcabc"}]}, @@ -43,3 +47,25 @@ async def load_int(hass: HomeAssistant) -> MockConfigEntry: await hass.async_block_till_done() return config_entry + + +@pytest.fixture(name="get_data") +async def get_data_from_library( + hass: HomeAssistant, aioclient_mock: AiohttpClientMocker, load_json: dict[str, Any] +) -> SensiboData: + """Retrieve data from upstream Sensibo library.""" + + client = SensiboClient("123467890", aioclient_mock.create_session(hass.loop)) + with patch("pysensibo.SensiboClient.async_get_devices", return_value=load_json): + output = await client.async_get_devices_data() + await client._session.close() # pylint: disable=protected-access + return output + + +@pytest.fixture(name="load_json", scope="session") +def load_json_from_fixture() -> SensiboData: + """Load fixture with json data and return.""" + + data_fixture = load_fixture("data.json", "sensibo") + json_data: dict[str, Any] = json.loads(data_fixture) + return json_data diff --git a/tests/components/sensibo/fixtures/data.json b/tests/components/sensibo/fixtures/data.json new file mode 100644 index 00000000000..c75423fe464 --- /dev/null +++ b/tests/components/sensibo/fixtures/data.json @@ -0,0 +1,551 @@ +{ + "status": "success", + "result": [ + { + "isGeofenceOnEnterEnabledForThisUser": false, + "isClimateReactGeofenceOnEnterEnabledForThisUser": false, + "isMotionGeofenceOnEnterEnabled": false, + "isOwner": true, + "id": "ABC999111", + "qrId": "AAAAAAAAAA", + "temperatureUnit": "C", + "room": { + "uid": "99TT99TT", + "name": "Hallway", + "icon": "Lounge" + }, + "acState": { + "timestamp": { + "time": "2022-04-30T11:23:30.019722Z", + "secondsAgo": -1 + }, + "on": true, + "mode": "heat", + "fanLevel": "high", + "targetTemperature": 25, + "swing": "stopped", + "horizontalSwing": "stopped", + "light": "on" + }, + "lastStateChange": { + "time": "2022-04-30T11:21:30Z", + "secondsAgo": 119 + }, + "lastStateChangeToOn": { + "time": "2022-04-30T11:20:28Z", + "secondsAgo": 181 + }, + "lastStateChangeToOff": { + "time": "2022-04-30T11:21:30Z", + "secondsAgo": 119 + }, + "location": { + "id": "ZZZZZZZZZZZZ", + "name": "Home", + "latLon": [58.9806976, 20.5864297], + "address": ["Sealand 99", "Some county"], + "country": "United Country", + "createTime": { + "time": "2020-03-21T15:44:15Z", + "secondsAgo": 66543240 + } + }, + "connectionStatus": { + "isAlive": true, + "lastSeen": { + "time": "2022-04-30T11:22:57.894846Z", + "secondsAgo": 32 + } + }, + "firmwareVersion": "SKY30046", + "firmwareType": "esp8266ex", + "productModel": "skyv2", + "configGroup": "stable", + "currentlyAvailableFirmwareVersion": "SKY30046", + "cleanFiltersNotificationEnabled": false, + "shouldShowFilterCleaningNotification": false, + "isGeofenceOnExitEnabled": false, + "isClimateReactGeofenceOnExitEnabled": false, + "isMotionGeofenceOnExitEnabled": false, + "serial": "1234567890", + "sensorsCalibration": { + "temperature": 0.1, + "humidity": 0.0 + }, + "motionSensors": [ + { + "configGroup": "stable", + "connectionStatus": { + "isAlive": true, + "lastSeen": { + "secondsAgo": 86, + "time": "2022-01-01T18:59:48.665878Z" + } + }, + "firmwareType": "nrf52", + "firmwareVersion": "V17", + "id": "AABBCC", + "isMainSensor": true, + "macAddress": "00:04:00:B6:00:00", + "measurements": { + "batteryVoltage": 3000, + "humidity": 57, + "motion": true, + "rssi": -72, + "temperature": 23.9, + "time": { + "secondsAgo": 86, + "time": "2022-01-01T18:59:48.665878Z" + } + }, + "parentDeviceUid": "ABC999111", + "productModel": "motion_sensor", + "qrId": "AAZZAAZZ", + "serial": "12123434" + } + ], + "tags": [], + "timer": null, + "schedules": [ + { + "id": "11", + "isEnabled": false, + "acState": { + "on": false, + "targetTemperature": 21, + "temperatureUnit": "C", + "mode": "heat", + "fanLevel": "low", + "swing": "stopped", + "extra": { + "scheduler": { + "climate_react": null, + "motion": null, + "on": false, + "climate_react_settings": null, + "pure_boost": null + } + }, + "horizontalSwing": "stopped", + "light": "on" + }, + "createTime": "2022-04-17T15:41:05", + "createTimeSecondsAgo": 1107745, + "recurringDays": ["Wednesday", "Thursday"], + "targetTimeLocal": "17:40", + "timezone": "Europe/Stockholm", + "podUid": "ABC999111", + "nextTime": "2022-05-04T15:40:00", + "nextTimeSecondsFromNow": 360989 + } + ], + "motionConfig": { + "enabled": true, + "onEnterACChange": false, + "onEnterACState": null, + "onEnterCRChange": true, + "onExitACChange": true, + "onExitACState": null, + "onExitCRChange": true, + "onExitDelayMinutes": 20 + }, + "filtersCleaning": { + "acOnSecondsSinceLastFiltersClean": 667991, + "filtersCleanSecondsThreshold": 1080000, + "lastFiltersCleanTime": { + "time": "2022-03-12T15:24:26Z", + "secondsAgo": 4219143 + }, + "shouldCleanFilters": false + }, + "serviceSubscriptions": [], + "roomIsOccupied": true, + "mainMeasurementsSensor": { + "configGroup": "stable", + "connectionStatus": { + "isAlive": true, + "lastSeen": { + "secondsAgo": 86, + "time": "2022-01-01T18:59:48.665878Z" + } + }, + "firmwareType": "nrf52", + "firmwareVersion": "V17", + "id": "AABBCC", + "isMainSensor": true, + "macAddress": "00:04:00:B6:00:00", + "measurements": { + "batteryVoltage": 3000, + "humidity": 32.9, + "motion": false, + "rssi": -72, + "temperature": 21.2, + "time": { + "secondsAgo": 86, + "time": "2022-01-01T18:59:48.665878Z" + } + }, + "parentDeviceUid": "ABC999111", + "productModel": "motion_sensor", + "qrId": "AAZZAAZZ", + "serial": "12123434" + }, + "pureBoostConfig": null, + "warrantyEligible": "no", + "warrantyEligibleUntil": { + "time": "2020-04-18T15:43:08Z", + "secondsAgo": 64093221 + }, + "features": ["softShowPlus", "optimusTrial"], + "runningHealthcheck": null, + "lastHealthcheck": null, + "lastACStateChange": { + "id": "11", + "time": { + "time": "2022-04-30T11:21:29Z", + "secondsAgo": 120 + }, + "status": "Success", + "acState": { + "timestamp": { + "time": "2022-04-30T11:23:30.062645Z", + "secondsAgo": -1 + }, + "on": false, + "mode": "fan", + "fanLevel": "high", + "swing": "stopped", + "horizontalSwing": "stopped", + "light": "on" + }, + "resultingAcState": { + "timestamp": { + "time": "2022-04-30T11:23:30.062688Z", + "secondsAgo": -1 + }, + "on": false, + "mode": "fan", + "fanLevel": "high", + "swing": "stopped", + "horizontalSwing": "stopped", + "light": "on" + }, + "changedProperties": ["on"], + "reason": "UserRequest", + "failureReason": null, + "resolveTime": { + "time": "2022-04-30T11:21:30Z", + "secondsAgo": 119 + }, + "causedByScheduleId": null, + "causedByScheduleType": null + }, + "homekitSupported": false, + "remoteCapabilities": { + "modes": { + "cool": { + "temperatures": { + "F": { + "isNative": false, + "values": [64, 66, 68] + }, + "C": { + "isNative": true, + "values": [18, 19, 20] + } + }, + "fanLevels": ["quiet", "low", "medium"], + "swing": ["stopped", "fixedTop", "fixedMiddleTop"], + "horizontalSwing": ["stopped", "fixedLeft", "fixedCenterLeft"], + "light": ["on", "off"] + }, + "heat": { + "temperatures": { + "F": { + "isNative": false, + "values": [63, 64, 66] + }, + "C": { + "isNative": true, + "values": [17, 18, 19, 20] + } + }, + "fanLevels": ["quiet", "low", "medium"], + "swing": ["stopped", "fixedTop", "fixedMiddleTop"], + "horizontalSwing": ["stopped", "fixedLeft", "fixedCenterLeft"], + "light": ["on", "off"] + }, + "dry": { + "temperatures": { + "F": { + "isNative": false, + "values": [64, 66, 68] + }, + "C": { + "isNative": true, + "values": [18, 19, 20] + } + }, + "swing": ["stopped", "fixedTop", "fixedMiddleTop"], + "horizontalSwing": ["stopped", "fixedLeft", "fixedCenterLeft"], + "light": ["on", "off"] + }, + "auto": { + "temperatures": { + "F": { + "isNative": false, + "values": [64, 66, 68] + }, + "C": { + "isNative": true, + "values": [18, 19, 20, 21] + } + }, + "fanLevels": ["quiet", "low", "medium"], + "swing": ["stopped", "fixedTop", "fixedMiddleTop"], + "horizontalSwing": ["stopped", "fixedLeft", "fixedCenterLeft"], + "light": ["on", "off"] + }, + "fan": { + "temperatures": {}, + "fanLevels": ["quiet", "low", "medium"], + "swing": ["stopped", "fixedTop", "fixedMiddleTop"], + "horizontalSwing": ["stopped", "fixedLeft", "fixedCenterLeft"], + "light": ["on", "off"] + } + } + }, + "remote": { + "toggle": false, + "window": false + }, + "remoteFlavor": "Curious Sea Cucumber", + "remoteAlternatives": ["_mitsubishi2_night_heat"], + "smartMode": { + "enabled": false, + "type": "temperature", + "deviceUid": "ABC999111", + "lowTemperatureThreshold": 0.0, + "highTemperatureThreshold": 27.5, + "lowTemperatureState": { + "on": true, + "targetTemperature": 21, + "temperatureUnit": "C", + "mode": "heat", + "fanLevel": "low", + "swing": "stopped", + "horizontalSwing": "stopped", + "light": "on" + }, + "highTemperatureState": { + "on": true, + "targetTemperature": 21, + "temperatureUnit": "C", + "mode": "cool", + "fanLevel": "high", + "swing": "stopped", + "horizontalSwing": "stopped", + "light": "on" + }, + "lowTemperatureWebhook": null, + "highTemperatureWebhook": null + }, + "measurements": { + "time": { + "time": "2022-04-30T11:22:57.894846Z", + "secondsAgo": 32 + }, + "temperature": 21.2, + "humidity": 32.9, + "motion": true, + "roomIsOccupied": true, + "feelsLike": 21.2, + "rssi": -45 + }, + "accessPoint": { + "ssid": "Sensibo-1234567890", + "password": null + }, + "macAddress": "00:02:00:B6:00:00", + "autoOffMinutes": null, + "autoOffEnabled": false, + "antiMoldTimer": null, + "antiMoldConfig": null + }, + { + "isGeofenceOnEnterEnabledForThisUser": false, + "isClimateReactGeofenceOnEnterEnabledForThisUser": false, + "isMotionGeofenceOnEnterEnabled": false, + "isOwner": true, + "id": "AAZZAAZZ", + "qrId": "AAAAAAAABB", + "temperatureUnit": "C", + "room": { + "uid": "99TT99ZZ", + "name": "Kitchen", + "icon": "Diningroom" + }, + "acState": { + "timestamp": { + "time": "2022-04-30T11:23:30.067312Z", + "secondsAgo": -1 + }, + "on": false, + "mode": "fan", + "fanLevel": "low", + "light": "on" + }, + "lastStateChange": { + "time": "2022-04-30T11:21:41Z", + "secondsAgo": 108 + }, + "lastStateChangeToOn": { + "time": "2022-04-30T09:43:26Z", + "secondsAgo": 6003 + }, + "lastStateChangeToOff": { + "time": "2022-04-30T11:21:37Z", + "secondsAgo": 112 + }, + "location": { + "id": "ZZZZZZZZZZZZ", + "name": "Home", + "latLon": [58.9806976, 20.5864297], + "address": ["Sealand 99", "Some county"], + "country": "United Country", + "createTime": { + "time": "2020-03-21T15:44:15Z", + "secondsAgo": 66543240 + } + }, + "connectionStatus": { + "isAlive": true, + "lastSeen": { + "time": "2022-04-30T11:23:20.642798Z", + "secondsAgo": 9 + } + }, + "firmwareVersion": "PUR00111", + "firmwareType": "pure-esp32", + "productModel": "pure", + "configGroup": "stable", + "currentlyAvailableFirmwareVersion": "PUR00111", + "cleanFiltersNotificationEnabled": false, + "shouldShowFilterCleaningNotification": false, + "isGeofenceOnExitEnabled": false, + "isClimateReactGeofenceOnExitEnabled": false, + "isMotionGeofenceOnExitEnabled": false, + "serial": "0987654321", + "sensorsCalibration": { + "temperature": 0.0, + "humidity": 0.0 + }, + "motionSensors": [], + "tags": [], + "timer": null, + "schedules": [], + "motionConfig": null, + "filtersCleaning": { + "acOnSecondsSinceLastFiltersClean": 415560, + "filtersCleanSecondsThreshold": 14256000, + "lastFiltersCleanTime": { + "time": "2022-04-23T15:58:45Z", + "secondsAgo": 588284 + }, + "shouldCleanFilters": false + }, + "serviceSubscriptions": [], + "roomIsOccupied": null, + "mainMeasurementsSensor": null, + "pureBoostConfig": { + "enabled": false, + "sensitivity": "N", + "measurements_integration": true, + "ac_integration": false, + "geo_integration": false, + "prime_integration": false + }, + "warrantyEligible": "no", + "warrantyEligibleUntil": { + "time": "2022-04-10T09:58:58Z", + "secondsAgo": 1733071 + }, + "features": ["optimusTrial", "softShowPlus"], + "runningHealthcheck": null, + "lastHealthcheck": null, + "lastACStateChange": { + "id": "AA22", + "time": { + "time": "2022-04-30T11:21:37Z", + "secondsAgo": 112 + }, + "status": "Success", + "acState": { + "timestamp": { + "time": "2022-04-30T11:23:30.090144Z", + "secondsAgo": -1 + }, + "on": false, + "mode": "fan", + "fanLevel": "low", + "light": "on" + }, + "resultingAcState": { + "timestamp": { + "time": "2022-04-30T11:23:30.090185Z", + "secondsAgo": -1 + }, + "on": false, + "mode": "fan", + "fanLevel": "low", + "light": "on" + }, + "changedProperties": ["on"], + "reason": "UserRequest", + "failureReason": null, + "resolveTime": { + "time": "2022-04-30T11:21:37Z", + "secondsAgo": 112 + }, + "causedByScheduleId": null, + "causedByScheduleType": null + }, + "homekitSupported": true, + "remoteCapabilities": { + "modes": { + "fan": { + "temperatures": {}, + "fanLevels": ["low", "high"], + "light": ["on", "dim", "off"] + } + } + }, + "remote": { + "toggle": false, + "window": false + }, + "remoteFlavor": "Eccentric Eagle", + "remoteAlternatives": [], + "smartMode": null, + "measurements": { + "time": { + "time": "2022-04-30T11:23:20.642798Z", + "secondsAgo": 9 + }, + "rssi": -58, + "pm25": 1, + "motion": false, + "roomIsOccupied": null + }, + "accessPoint": { + "ssid": "Sensibo-09876", + "password": null + }, + "macAddress": "00:01:00:01:00:01", + "autoOffMinutes": null, + "autoOffEnabled": false, + "antiMoldTimer": null, + "antiMoldConfig": null + } + ] +} diff --git a/tests/components/sensibo/test_binary_sensor.py b/tests/components/sensibo/test_binary_sensor.py index cbf38ff27b0..3a84dc99ca5 100644 --- a/tests/components/sensibo/test_binary_sensor.py +++ b/tests/components/sensibo/test_binary_sensor.py @@ -4,19 +4,21 @@ from __future__ import annotations from datetime import timedelta from unittest.mock import patch +from pysensibo.model import SensiboData from pytest import MonkeyPatch from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.util import dt -from .response import DATA_FROM_API - from tests.common import async_fire_time_changed async def test_binary_sensor( - hass: HomeAssistant, load_int: ConfigEntry, monkeypatch: MonkeyPatch + hass: HomeAssistant, + load_int: ConfigEntry, + monkeypatch: MonkeyPatch, + get_data: SensiboData, ) -> None: """Test the Sensibo binary sensor.""" @@ -30,15 +32,15 @@ async def test_binary_sensor( assert state4.state == "on" monkeypatch.setattr( - DATA_FROM_API.parsed["ABC999111"].motion_sensors["AABBCC"], "alive", False + get_data.parsed["ABC999111"].motion_sensors["AABBCC"], "alive", False ) monkeypatch.setattr( - DATA_FROM_API.parsed["ABC999111"].motion_sensors["AABBCC"], "motion", False + get_data.parsed["ABC999111"].motion_sensors["AABBCC"], "motion", False ) with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ): async_fire_time_changed( hass, diff --git a/tests/components/sensibo/test_climate.py b/tests/components/sensibo/test_climate.py index 8b087da5d95..0b6c043240c 100644 --- a/tests/components/sensibo/test_climate.py +++ b/tests/components/sensibo/test_climate.py @@ -4,6 +4,7 @@ from __future__ import annotations from datetime import timedelta from unittest.mock import patch +from pysensibo.model import SensiboData import pytest from voluptuous import MultipleInvalid @@ -33,12 +34,12 @@ from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError from homeassistant.util import dt -from .response import DATA_FROM_API - from tests.common import async_fire_time_changed -async def test_climate(hass: HomeAssistant, load_int: ConfigEntry) -> None: +async def test_climate( + hass: HomeAssistant, load_int: ConfigEntry, get_data: SensiboData +) -> None: """Test the Sensibo climate.""" state1 = hass.states.get("climate.hallway") @@ -54,7 +55,7 @@ async def test_climate(hass: HomeAssistant, load_int: ConfigEntry) -> None: "fan_only", "off", ], - "min_temp": 18, + "min_temp": 17, "max_temp": 20, "target_temp_step": 1, "fan_modes": ["quiet", "low", "medium"], @@ -63,9 +64,9 @@ async def test_climate(hass: HomeAssistant, load_int: ConfigEntry) -> None: "fixedTop", "fixedMiddleTop", ], - "current_temperature": 22.4, + "current_temperature": 21.2, "temperature": 25, - "current_humidity": 38, + "current_humidity": 32.9, "fan_mode": "high", "swing_mode": "stopped", "friendly_name": "Hallway", @@ -76,7 +77,10 @@ async def test_climate(hass: HomeAssistant, load_int: ConfigEntry) -> None: async def test_climate_fan( - hass: HomeAssistant, load_int: ConfigEntry, monkeypatch: pytest.MonkeyPatch + hass: HomeAssistant, + load_int: ConfigEntry, + monkeypatch: pytest.MonkeyPatch, + get_data: SensiboData, ) -> None: """Test the Sensibo climate fan service.""" @@ -99,7 +103,7 @@ async def test_climate_fan( assert state2.attributes["fan_mode"] == "low" monkeypatch.setattr( - DATA_FROM_API.parsed["ABC999111"], + get_data.parsed["ABC999111"], "active_features", [ "timestamp", @@ -113,7 +117,7 @@ async def test_climate_fan( ) with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ): async_fire_time_changed( hass, @@ -138,7 +142,10 @@ async def test_climate_fan( async def test_climate_swing( - hass: HomeAssistant, load_int: ConfigEntry, monkeypatch: pytest.MonkeyPatch + hass: HomeAssistant, + load_int: ConfigEntry, + monkeypatch: pytest.MonkeyPatch, + get_data: SensiboData, ) -> None: """Test the Sensibo climate swing service.""" @@ -161,7 +168,7 @@ async def test_climate_swing( assert state2.attributes["swing_mode"] == "fixedTop" monkeypatch.setattr( - DATA_FROM_API.parsed["ABC999111"], + get_data.parsed["ABC999111"], "active_features", [ "timestamp", @@ -174,7 +181,7 @@ async def test_climate_swing( ) with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ): async_fire_time_changed( hass, @@ -199,7 +206,10 @@ async def test_climate_swing( async def test_climate_temperatures( - hass: HomeAssistant, load_int: ConfigEntry, monkeypatch: pytest.MonkeyPatch + hass: HomeAssistant, + load_int: ConfigEntry, + monkeypatch: pytest.MonkeyPatch, + get_data: SensiboData, ) -> None: """Test the Sensibo climate temperature service.""" @@ -234,7 +244,7 @@ async def test_climate_temperatures( await hass.async_block_till_done() state2 = hass.states.get("climate.hallway") - assert state2.attributes["temperature"] == 18 + assert state2.attributes["temperature"] == 17 with patch( "homeassistant.components.sensibo.util.SensiboClient.async_set_ac_state_property", @@ -250,7 +260,7 @@ async def test_climate_temperatures( await hass.async_block_till_done() state2 = hass.states.get("climate.hallway") - assert state2.attributes["temperature"] == 18 + assert state2.attributes["temperature"] == 17 with patch( "homeassistant.components.sensibo.util.SensiboClient.async_set_ac_state_property", @@ -299,7 +309,7 @@ async def test_climate_temperatures( assert state2.attributes["temperature"] == 20 monkeypatch.setattr( - DATA_FROM_API.parsed["ABC999111"], + get_data.parsed["ABC999111"], "active_features", [ "timestamp", @@ -312,7 +322,7 @@ async def test_climate_temperatures( ) with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ): async_fire_time_changed( hass, @@ -338,12 +348,15 @@ async def test_climate_temperatures( async def test_climate_temperature_is_none( - hass: HomeAssistant, load_int: ConfigEntry, monkeypatch: pytest.MonkeyPatch + hass: HomeAssistant, + load_int: ConfigEntry, + monkeypatch: pytest.MonkeyPatch, + get_data: SensiboData, ) -> None: """Test the Sensibo climate temperature service no temperature provided.""" monkeypatch.setattr( - DATA_FROM_API.parsed["ABC999111"], + get_data.parsed["ABC999111"], "active_features", [ "timestamp", @@ -357,13 +370,13 @@ async def test_climate_temperature_is_none( ], ) monkeypatch.setattr( - DATA_FROM_API.parsed["ABC999111"], + get_data.parsed["ABC999111"], "target_temp", 25, ) with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ): async_fire_time_changed( hass, @@ -395,12 +408,15 @@ async def test_climate_temperature_is_none( async def test_climate_hvac_mode( - hass: HomeAssistant, load_int: ConfigEntry, monkeypatch: pytest.MonkeyPatch + hass: HomeAssistant, + load_int: ConfigEntry, + monkeypatch: pytest.MonkeyPatch, + get_data: SensiboData, ) -> None: """Test the Sensibo climate hvac mode service.""" monkeypatch.setattr( - DATA_FROM_API.parsed["ABC999111"], + get_data.parsed["ABC999111"], "active_features", [ "timestamp", @@ -415,7 +431,7 @@ async def test_climate_hvac_mode( ) with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ): async_fire_time_changed( hass, @@ -428,7 +444,7 @@ async def test_climate_hvac_mode( with patch( "homeassistant.components.sensibo.util.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ), patch( "homeassistant.components.sensibo.util.SensiboClient.async_set_ac_state_property", return_value={"result": {"status": "Success"}}, @@ -444,10 +460,10 @@ async def test_climate_hvac_mode( state2 = hass.states.get("climate.hallway") assert state2.state == "off" - monkeypatch.setattr(DATA_FROM_API.parsed["ABC999111"], "device_on", False) + monkeypatch.setattr(get_data.parsed["ABC999111"], "device_on", False) with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ): async_fire_time_changed( hass, @@ -457,7 +473,7 @@ async def test_climate_hvac_mode( with patch( "homeassistant.components.sensibo.util.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ), patch( "homeassistant.components.sensibo.util.SensiboClient.async_set_ac_state_property", return_value={"result": {"status": "Success"}}, @@ -475,15 +491,18 @@ async def test_climate_hvac_mode( async def test_climate_on_off( - hass: HomeAssistant, load_int: ConfigEntry, monkeypatch: pytest.MonkeyPatch + hass: HomeAssistant, + load_int: ConfigEntry, + monkeypatch: pytest.MonkeyPatch, + get_data: SensiboData, ) -> None: """Test the Sensibo climate on/off service.""" - monkeypatch.setattr(DATA_FROM_API.parsed["ABC999111"], "hvac_mode", "heat") - monkeypatch.setattr(DATA_FROM_API.parsed["ABC999111"], "device_on", True) + monkeypatch.setattr(get_data.parsed["ABC999111"], "hvac_mode", "heat") + monkeypatch.setattr(get_data.parsed["ABC999111"], "device_on", True) with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ): async_fire_time_changed( hass, @@ -526,15 +545,18 @@ async def test_climate_on_off( async def test_climate_service_failed( - hass: HomeAssistant, load_int: ConfigEntry, monkeypatch: pytest.MonkeyPatch + hass: HomeAssistant, + load_int: ConfigEntry, + monkeypatch: pytest.MonkeyPatch, + get_data: SensiboData, ) -> None: """Test the Sensibo climate service failed.""" - monkeypatch.setattr(DATA_FROM_API.parsed["ABC999111"], "hvac_mode", "heat") - monkeypatch.setattr(DATA_FROM_API.parsed["ABC999111"], "device_on", True) + monkeypatch.setattr(get_data.parsed["ABC999111"], "hvac_mode", "heat") + monkeypatch.setattr(get_data.parsed["ABC999111"], "device_on", True) with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ): async_fire_time_changed( hass, @@ -563,15 +585,18 @@ async def test_climate_service_failed( async def test_climate_assumed_state( - hass: HomeAssistant, load_int: ConfigEntry, monkeypatch: pytest.MonkeyPatch + hass: HomeAssistant, + load_int: ConfigEntry, + monkeypatch: pytest.MonkeyPatch, + get_data: SensiboData, ) -> None: """Test the Sensibo climate assumed state service.""" - monkeypatch.setattr(DATA_FROM_API.parsed["ABC999111"], "hvac_mode", "heat") - monkeypatch.setattr(DATA_FROM_API.parsed["ABC999111"], "device_on", True) + monkeypatch.setattr(get_data.parsed["ABC999111"], "hvac_mode", "heat") + monkeypatch.setattr(get_data.parsed["ABC999111"], "device_on", True) with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ): async_fire_time_changed( hass, @@ -584,7 +609,7 @@ async def test_climate_assumed_state( with patch( "homeassistant.components.sensibo.util.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ), patch( "homeassistant.components.sensibo.util.SensiboClient.async_set_ac_state_property", return_value={"result": {"status": "Success"}}, diff --git a/tests/components/sensibo/test_coordinator.py b/tests/components/sensibo/test_coordinator.py index 703eb8b184b..f0b9d60f112 100644 --- a/tests/components/sensibo/test_coordinator.py +++ b/tests/components/sensibo/test_coordinator.py @@ -15,13 +15,12 @@ from homeassistant.core import HomeAssistant from homeassistant.util import dt from . import ENTRY_CONFIG -from .response import DATA_FROM_API from tests.common import MockConfigEntry, async_fire_time_changed async def test_coordinator( - hass: HomeAssistant, monkeypatch: pytest.MonkeyPatch + hass: HomeAssistant, monkeypatch: pytest.MonkeyPatch, get_data: SensiboData ) -> None: """Test the Sensibo coordinator with errors.""" config_entry = MockConfigEntry( @@ -44,9 +43,9 @@ async def test_coordinator( "homeassistant.components.sensibo.util.SensiboClient.async_get_me", return_value={"result": {"username": "username"}}, ): - monkeypatch.setattr(DATA_FROM_API.parsed["ABC999111"], "hvac_mode", "heat") - monkeypatch.setattr(DATA_FROM_API.parsed["ABC999111"], "device_on", True) - mock_data.return_value = DATA_FROM_API + monkeypatch.setattr(get_data.parsed["ABC999111"], "hvac_mode", "heat") + monkeypatch.setattr(get_data.parsed["ABC999111"], "device_on", True) + mock_data.return_value = get_data await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() mock_data.assert_called_once() @@ -71,10 +70,10 @@ async def test_coordinator( assert state.state == STATE_UNAVAILABLE mock_data.reset_mock() - monkeypatch.setattr(DATA_FROM_API.parsed["ABC999111"], "hvac_mode", "heat") - monkeypatch.setattr(DATA_FROM_API.parsed["ABC999111"], "device_on", True) + monkeypatch.setattr(get_data.parsed["ABC999111"], "hvac_mode", "heat") + monkeypatch.setattr(get_data.parsed["ABC999111"], "device_on", True) - mock_data.return_value = DATA_FROM_API + mock_data.return_value = get_data mock_data.side_effect = None async_fire_time_changed(hass, dt.utcnow() + timedelta(minutes=5)) await hass.async_block_till_done() diff --git a/tests/components/sensibo/test_diagnostics.py b/tests/components/sensibo/test_diagnostics.py index b4e85dad2b4..636fefa5054 100644 --- a/tests/components/sensibo/test_diagnostics.py +++ b/tests/components/sensibo/test_diagnostics.py @@ -17,32 +17,10 @@ async def test_diagnostics( diag = await get_diagnostics_for_config_entry(hass, hass_client, entry) - assert diag == { - "status": "success", - "result": [ - { - "id": "**REDACTED**", - "qrId": "**REDACTED**", - "room": {"uid": "**REDACTED**", "name": "Hallway", "icon": "Lounge"}, - "acState": { - "timestamp": { - "time": "2022-04-30T19:58:15.544787Z", - "secondsAgo": 0, - }, - "on": False, - "mode": "fan", - "fanLevel": "high", - "swing": "stopped", - "horizontalSwing": "stopped", - "light": "on", - }, - "location": "**REDACTED**", - "accessPoint": {"ssid": "**REDACTED**", "password": None}, - "macAddress": "**REDACTED**", - "autoOffMinutes": None, - "autoOffEnabled": False, - "antiMoldTimer": None, - "antiMoldConfig": None, - } - ], - } + assert diag["status"] == "success" + for device in diag["result"]: + assert device["id"] == "**REDACTED**" + assert device["qrId"] == "**REDACTED**" + assert device["macAddress"] == "**REDACTED**" + assert device["location"] == "**REDACTED**" + assert device["productModel"] in ["skyv2", "pure"] diff --git a/tests/components/sensibo/test_entity.py b/tests/components/sensibo/test_entity.py index 7df70c7d45e..27e0f4df772 100644 --- a/tests/components/sensibo/test_entity.py +++ b/tests/components/sensibo/test_entity.py @@ -4,6 +4,7 @@ from __future__ import annotations from datetime import timedelta from unittest.mock import patch +from pysensibo.model import SensiboData import pytest from homeassistant.components.climate.const import ( @@ -24,12 +25,12 @@ from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import device_registry as dr, entity_registry as er from homeassistant.util import dt -from .response import DATA_FROM_API - from tests.common import async_fire_time_changed -async def test_entity(hass: HomeAssistant, load_int: ConfigEntry) -> None: +async def test_entity( + hass: HomeAssistant, load_int: ConfigEntry, get_data: SensiboData +) -> None: """Test the Sensibo climate.""" state1 = hass.states.get("climate.hallway") @@ -55,7 +56,10 @@ async def test_entity(hass: HomeAssistant, load_int: ConfigEntry) -> None: @pytest.mark.parametrize("p_error", SENSIBO_ERRORS) async def test_entity_send_command( - hass: HomeAssistant, p_error: Exception, load_int: ConfigEntry + hass: HomeAssistant, + p_error: Exception, + load_int: ConfigEntry, + get_data: SensiboData, ) -> None: """Test the Sensibo send command with error.""" @@ -94,7 +98,7 @@ async def test_entity_send_command( async def test_entity_send_command_calibration( - hass: HomeAssistant, load_int: ConfigEntry + hass: HomeAssistant, load_int: ConfigEntry, get_data: SensiboData ) -> None: """Test the Sensibo send command for calibration.""" @@ -106,7 +110,7 @@ async def test_entity_send_command_calibration( with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ): async_fire_time_changed( hass, diff --git a/tests/components/sensibo/test_init.py b/tests/components/sensibo/test_init.py index b9ad56eaf07..505816e3f41 100644 --- a/tests/components/sensibo/test_init.py +++ b/tests/components/sensibo/test_init.py @@ -3,6 +3,8 @@ from __future__ import annotations from unittest.mock import patch +from pysensibo.model import SensiboData + from homeassistant import config_entries from homeassistant.components.sensibo.const import DOMAIN from homeassistant.components.sensibo.util import NoUsernameError @@ -10,12 +12,11 @@ from homeassistant.config_entries import SOURCE_USER from homeassistant.core import HomeAssistant from . import ENTRY_CONFIG -from .response import DATA_FROM_API from tests.common import MockConfigEntry -async def test_setup_entry(hass: HomeAssistant) -> None: +async def test_setup_entry(hass: HomeAssistant, get_data: SensiboData) -> None: """Test setup entry.""" entry = MockConfigEntry( domain=DOMAIN, @@ -29,7 +30,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None: with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ), patch( "homeassistant.components.sensibo.util.SensiboClient.async_get_devices", return_value={"result": [{"id": "xyzxyz"}, {"id": "abcabc"}]}, @@ -43,7 +44,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None: assert entry.state == config_entries.ConfigEntryState.LOADED -async def test_migrate_entry(hass: HomeAssistant) -> None: +async def test_migrate_entry(hass: HomeAssistant, get_data: SensiboData) -> None: """Test migrate entry unique id.""" entry = MockConfigEntry( domain=DOMAIN, @@ -57,7 +58,7 @@ async def test_migrate_entry(hass: HomeAssistant) -> None: with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ), patch( "homeassistant.components.sensibo.util.SensiboClient.async_get_devices", return_value={"result": [{"id": "xyzxyz"}, {"id": "abcabc"}]}, @@ -73,7 +74,7 @@ async def test_migrate_entry(hass: HomeAssistant) -> None: assert entry.unique_id == "username" -async def test_migrate_entry_fails(hass: HomeAssistant) -> None: +async def test_migrate_entry_fails(hass: HomeAssistant, get_data: SensiboData) -> None: """Test migrate entry unique id.""" entry = MockConfigEntry( domain=DOMAIN, @@ -101,7 +102,7 @@ async def test_migrate_entry_fails(hass: HomeAssistant) -> None: assert entry.unique_id == "12" -async def test_unload_entry(hass: HomeAssistant) -> None: +async def test_unload_entry(hass: HomeAssistant, get_data: SensiboData) -> None: """Test unload an entry.""" entry = MockConfigEntry( domain=DOMAIN, @@ -115,7 +116,7 @@ async def test_unload_entry(hass: HomeAssistant) -> None: with patch( "homeassistant.components.sensibo.coordinator.SensiboClient.async_get_devices_data", - return_value=DATA_FROM_API, + return_value=get_data, ), patch( "homeassistant.components.sensibo.util.SensiboClient.async_get_devices", return_value={"result": [{"id": "xyzxyz"}, {"id": "abcabc"}]},