Improve Netatmo tests (#107902)

* Improve Netatmo tests

* Improve Netatmo tests
This commit is contained in:
Joost Lekkerkerker 2024-01-12 23:27:31 +01:00 committed by GitHub
parent 68698cacac
commit 7bcfcfef5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 152 additions and 115 deletions

View File

@ -1,17 +1,17 @@
"""Common methods used across tests for Netatmo.""" """Common methods used across tests for Netatmo."""
from contextlib import contextmanager from contextlib import contextmanager
import json import json
from unittest.mock import patch from typing import Any
from unittest.mock import AsyncMock, patch
from homeassistant.components.webhook import async_handle_webhook from homeassistant.components.webhook import async_handle_webhook
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.util.aiohttp import MockRequest from homeassistant.util.aiohttp import MockRequest
from tests.common import load_fixture from tests.common import load_fixture
from tests.test_util.aiohttp import AiohttpClientMockResponse from tests.test_util.aiohttp import AiohttpClientMockResponse
CLIENT_ID = "1234"
CLIENT_SECRET = "5678"
COMMON_RESPONSE = { COMMON_RESPONSE = {
"user_id": "91763b24c43d3e344f424e8d", "user_id": "91763b24c43d3e344f424e8d",
"home_id": "91763b24c43d3e344f424e8b", "home_id": "91763b24c43d3e344f424e8b",
@ -19,16 +19,12 @@ COMMON_RESPONSE = {
"user": {"id": "91763b24c43d3e344f424e8b", "email": "john@doe.com"}, "user": {"id": "91763b24c43d3e344f424e8b", "email": "john@doe.com"},
} }
TEST_TIME = 1559347200.0
FAKE_WEBHOOK_ACTIVATION = { FAKE_WEBHOOK_ACTIVATION = {
"push_type": "webhook_activation", "push_type": "webhook_activation",
} }
DEFAULT_PLATFORMS = ["camera", "climate", "light", "sensor"]
async def fake_post_request(*args: Any, **kwargs: Any):
async def fake_post_request(*args, **kwargs):
"""Return fake data.""" """Return fake data."""
if "endpoint" not in kwargs: if "endpoint" not in kwargs:
return "{}" return "{}"
@ -62,7 +58,7 @@ async def fake_post_request(*args, **kwargs):
) )
async def fake_get_image(*args, **kwargs): async def fake_get_image(*args: Any, **kwargs: Any) -> bytes | str:
"""Return fake data.""" """Return fake data."""
if "endpoint" not in kwargs: if "endpoint" not in kwargs:
return "{}" return "{}"
@ -73,12 +69,7 @@ async def fake_get_image(*args, **kwargs):
return b"test stream image bytes" return b"test stream image bytes"
async def fake_post_request_no_data(*args, **kwargs): async def simulate_webhook(hass: HomeAssistant, webhook_id: str, response) -> None:
"""Fake error during requesting backend data."""
return "{}"
async def simulate_webhook(hass, webhook_id, response):
"""Simulate a webhook event.""" """Simulate a webhook event."""
request = MockRequest( request = MockRequest(
method="POST", method="POST",
@ -90,7 +81,7 @@ async def simulate_webhook(hass, webhook_id, response):
@contextmanager @contextmanager
def selected_platforms(platforms): def selected_platforms(platforms: list[Platform]) -> AsyncMock:
"""Restrict loaded platforms to list given.""" """Restrict loaded platforms to list given."""
with patch( with patch(
"homeassistant.components.netatmo.data_handler.PLATFORMS", platforms "homeassistant.components.netatmo.data_handler.PLATFORMS", platforms

View File

@ -5,13 +5,15 @@ from unittest.mock import AsyncMock, patch
from pyatmo.const import ALL_SCOPES from pyatmo.const import ALL_SCOPES
import pytest import pytest
from homeassistant.core import HomeAssistant
from .common import fake_get_image, fake_post_request from .common import fake_get_image, fake_post_request
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@pytest.fixture(name="config_entry") @pytest.fixture(name="config_entry")
def mock_config_entry_fixture(hass): def mock_config_entry_fixture(hass: HomeAssistant) -> MockConfigEntry:
"""Mock a config entry.""" """Mock a config entry."""
mock_entry = MockConfigEntry( mock_entry = MockConfigEntry(
domain="netatmo", domain="netatmo",
@ -55,7 +57,7 @@ def mock_config_entry_fixture(hass):
@pytest.fixture(name="netatmo_auth") @pytest.fixture(name="netatmo_auth")
def netatmo_auth(): def netatmo_auth() -> AsyncMock:
"""Restrict loaded platforms to list given.""" """Restrict loaded platforms to list given."""
with patch( with patch(
"homeassistant.components.netatmo.api.AsyncConfigEntryNetatmoAuth" "homeassistant.components.netatmo.api.AsyncConfigEntryNetatmoAuth"

View File

@ -1,10 +1,10 @@
"""The tests for Netatmo camera.""" """The tests for Netatmo camera."""
from datetime import timedelta from datetime import timedelta
from typing import Any
from unittest.mock import AsyncMock, patch from unittest.mock import AsyncMock, patch
import pyatmo import pyatmo
import pytest import pytest
import requests_mock
from homeassistant.components import camera from homeassistant.components import camera
from homeassistant.components.camera import STATE_STREAMING from homeassistant.components.camera import STATE_STREAMING
@ -14,21 +14,21 @@ from homeassistant.components.netatmo.const import (
SERVICE_SET_PERSON_AWAY, SERVICE_SET_PERSON_AWAY,
SERVICE_SET_PERSONS_HOME, SERVICE_SET_PERSONS_HOME,
) )
from homeassistant.const import CONF_WEBHOOK_ID from homeassistant.const import CONF_WEBHOOK_ID, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
from .common import fake_post_request, selected_platforms, simulate_webhook from .common import fake_post_request, selected_platforms, simulate_webhook
from tests.common import async_capture_events, async_fire_time_changed from tests.common import MockConfigEntry, async_capture_events, async_fire_time_changed
async def test_setup_component_with_webhook( async def test_setup_component_with_webhook(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test setup with webhook.""" """Test setup with webhook."""
with selected_platforms(["camera"]): with selected_platforms([Platform.CAMERA]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -134,10 +134,10 @@ IMAGE_BYTES_FROM_STREAM = b"test stream image bytes"
async def test_camera_image_local( async def test_camera_image_local(
hass: HomeAssistant, config_entry, requests_mock: requests_mock.Mocker, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test retrieval or local camera image.""" """Test retrieval or local camera image."""
with selected_platforms(["camera"]): with selected_platforms([Platform.CAMERA]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -162,10 +162,10 @@ async def test_camera_image_local(
async def test_camera_image_vpn( async def test_camera_image_vpn(
hass: HomeAssistant, config_entry, requests_mock: requests_mock.Mocker, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test retrieval of remote camera image.""" """Test retrieval of remote camera image."""
with selected_platforms(["camera"]): with selected_platforms([Platform.CAMERA]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -188,10 +188,10 @@ async def test_camera_image_vpn(
async def test_service_set_person_away( async def test_service_set_person_away(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service to set person as away.""" """Test service to set person as away."""
with selected_platforms(["camera"]): with selected_platforms([Platform.CAMERA]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -227,10 +227,10 @@ async def test_service_set_person_away(
async def test_service_set_person_away_invalid_person( async def test_service_set_person_away_invalid_person(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service to set invalid person as away.""" """Test service to set invalid person as away."""
with selected_platforms(["camera"]): with selected_platforms([Platform.CAMERA]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -255,10 +255,10 @@ async def test_service_set_person_away_invalid_person(
async def test_service_set_persons_home_invalid_person( async def test_service_set_persons_home_invalid_person(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service to set invalid persons as home.""" """Test service to set invalid persons as home."""
with selected_platforms(["camera"]): with selected_platforms([Platform.CAMERA]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -283,10 +283,10 @@ async def test_service_set_persons_home_invalid_person(
async def test_service_set_persons_home( async def test_service_set_persons_home(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service to set persons as home.""" """Test service to set persons as home."""
with selected_platforms(["camera"]): with selected_platforms([Platform.CAMERA]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -309,10 +309,10 @@ async def test_service_set_persons_home(
async def test_service_set_camera_light( async def test_service_set_camera_light(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service to set the outdoor camera light mode.""" """Test service to set the outdoor camera light mode."""
with selected_platforms(["camera"]): with selected_platforms([Platform.CAMERA]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -341,10 +341,10 @@ async def test_service_set_camera_light(
async def test_service_set_camera_light_invalid_type( async def test_service_set_camera_light_invalid_type(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service to set the indoor camera light mode.""" """Test service to set the indoor camera light mode."""
with selected_platforms(["camera"]): with selected_platforms([Platform.CAMERA]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -371,11 +371,13 @@ async def test_service_set_camera_light_invalid_type(
assert "NACamera <Hall> does not have a floodlight" in excinfo.value.args[0] assert "NACamera <Hall> does not have a floodlight" in excinfo.value.args[0]
async def test_camera_reconnect_webhook(hass: HomeAssistant, config_entry) -> None: async def test_camera_reconnect_webhook(
hass: HomeAssistant, config_entry: MockConfigEntry
) -> None:
"""Test webhook event on camera reconnect.""" """Test webhook event on camera reconnect."""
fake_post_hits = 0 fake_post_hits = 0
async def fake_post(*args, **kwargs): async def fake_post(*args: Any, **kwargs: Any):
"""Fake error during requesting backend data.""" """Fake error during requesting backend data."""
nonlocal fake_post_hits nonlocal fake_post_hits
fake_post_hits += 1 fake_post_hits += 1
@ -427,7 +429,7 @@ async def test_camera_reconnect_webhook(hass: HomeAssistant, config_entry) -> No
async def test_webhook_person_event( async def test_webhook_person_event(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test that person events are handled.""" """Test that person events are handled."""
with selected_platforms(["camera"]): with selected_platforms(["camera"]):
@ -465,7 +467,9 @@ async def test_webhook_person_event(
assert test_netatmo_event assert test_netatmo_event
async def test_setup_component_no_devices(hass: HomeAssistant, config_entry) -> None: async def test_setup_component_no_devices(
hass: HomeAssistant, config_entry: MockConfigEntry
) -> None:
"""Test setup with no devices.""" """Test setup with no devices."""
fake_post_hits = 0 fake_post_hits = 0
@ -495,12 +499,12 @@ async def test_setup_component_no_devices(hass: HomeAssistant, config_entry) ->
async def test_camera_image_raises_exception( async def test_camera_image_raises_exception(
hass: HomeAssistant, config_entry, requests_mock: requests_mock.Mocker hass: HomeAssistant, config_entry: MockConfigEntry
) -> None: ) -> None:
"""Test setup with no devices.""" """Test setup with no devices."""
fake_post_hits = 0 fake_post_hits = 0
async def fake_post(*args, **kwargs): async def fake_post(*args: Any, **kwargs: Any):
"""Return fake data.""" """Return fake data."""
nonlocal fake_post_hits nonlocal fake_post_hits
fake_post_hits += 1 fake_post_hits += 1

View File

@ -1,6 +1,6 @@
"""The tests for the Netatmo climate platform.""" """The tests for the Netatmo climate platform."""
from datetime import timedelta from datetime import timedelta
from unittest.mock import patch from unittest.mock import AsyncMock, patch
import pytest import pytest
from voluptuous.error import MultipleInvalid from voluptuous.error import MultipleInvalid
@ -31,19 +31,26 @@ from homeassistant.components.netatmo.const import (
SERVICE_SET_TEMPERATURE_WITH_END_DATETIME, SERVICE_SET_TEMPERATURE_WITH_END_DATETIME,
SERVICE_SET_TEMPERATURE_WITH_TIME_PERIOD, SERVICE_SET_TEMPERATURE_WITH_TIME_PERIOD,
) )
from homeassistant.const import ATTR_ENTITY_ID, ATTR_TEMPERATURE, CONF_WEBHOOK_ID from homeassistant.const import (
ATTR_ENTITY_ID,
ATTR_TEMPERATURE,
CONF_WEBHOOK_ID,
Platform,
)
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ServiceValidationError from homeassistant.exceptions import ServiceValidationError
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
from .common import selected_platforms, simulate_webhook from .common import selected_platforms, simulate_webhook
from tests.common import MockConfigEntry
async def test_webhook_event_handling_thermostats( async def test_webhook_event_handling_thermostats(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service and webhook event handling with thermostats.""" """Test service and webhook event handling with thermostats."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -214,10 +221,10 @@ async def test_webhook_event_handling_thermostats(
async def test_service_preset_mode_frost_guard_thermostat( async def test_service_preset_mode_frost_guard_thermostat(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service with frost guard preset for thermostats.""" """Test service with frost guard preset for thermostats."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -287,10 +294,10 @@ async def test_service_preset_mode_frost_guard_thermostat(
async def test_service_preset_modes_thermostat( async def test_service_preset_modes_thermostat(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service with preset modes for thermostats.""" """Test service with preset modes for thermostats."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -367,10 +374,10 @@ async def test_service_preset_modes_thermostat(
async def test_service_set_temperature_with_end_datetime( async def test_service_set_temperature_with_end_datetime(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service setting temperature with an end datetime.""" """Test service setting temperature with an end datetime."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -425,10 +432,10 @@ async def test_service_set_temperature_with_end_datetime(
async def test_service_set_temperature_with_time_period( async def test_service_set_temperature_with_time_period(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service setting temperature with an end datetime.""" """Test service setting temperature with an end datetime."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -483,10 +490,10 @@ async def test_service_set_temperature_with_time_period(
async def test_service_clear_temperature_setting( async def test_service_clear_temperature_setting(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service clearing temperature setting.""" """Test service clearing temperature setting."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -564,10 +571,10 @@ async def test_service_clear_temperature_setting(
async def test_webhook_event_handling_no_data( async def test_webhook_event_handling_no_data(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service and webhook event handling with erroneous data.""" """Test service and webhook event handling with erroneous data."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -618,7 +625,7 @@ async def test_service_schedule_thermostats(
hass: HomeAssistant, config_entry, caplog: pytest.LogCaptureFixture, netatmo_auth hass: HomeAssistant, config_entry, caplog: pytest.LogCaptureFixture, netatmo_auth
) -> None: ) -> None:
"""Test service for selecting Netatmo schedule with thermostats.""" """Test service for selecting Netatmo schedule with thermostats."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -671,7 +678,7 @@ async def test_service_preset_mode_with_end_time_thermostats(
hass: HomeAssistant, config_entry, caplog: pytest.LogCaptureFixture, netatmo_auth hass: HomeAssistant, config_entry, caplog: pytest.LogCaptureFixture, netatmo_auth
) -> None: ) -> None:
"""Test service for set preset mode with end datetime for Netatmo thermostats.""" """Test service for set preset mode with end datetime for Netatmo thermostats."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -740,10 +747,10 @@ async def test_service_preset_mode_with_end_time_thermostats(
async def test_service_preset_mode_already_boost_valves( async def test_service_preset_mode_already_boost_valves(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service with boost preset for valves when already in boost mode.""" """Test service with boost preset for valves when already in boost mode."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -820,10 +827,10 @@ async def test_service_preset_mode_already_boost_valves(
async def test_service_preset_mode_boost_valves( async def test_service_preset_mode_boost_valves(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service with boost preset for valves.""" """Test service with boost preset for valves."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -875,7 +882,7 @@ async def test_service_preset_mode_invalid(
hass: HomeAssistant, config_entry, caplog: pytest.LogCaptureFixture, netatmo_auth hass: HomeAssistant, config_entry, caplog: pytest.LogCaptureFixture, netatmo_auth
) -> None: ) -> None:
"""Test service with invalid preset.""" """Test service with invalid preset."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -891,10 +898,10 @@ async def test_service_preset_mode_invalid(
async def test_valves_service_turn_off( async def test_valves_service_turn_off(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service turn off for valves.""" """Test service turn off for valves."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -943,10 +950,10 @@ async def test_valves_service_turn_off(
async def test_valves_service_turn_on( async def test_valves_service_turn_on(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service turn on for valves.""" """Test service turn on for valves."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -990,10 +997,10 @@ async def test_valves_service_turn_on(
async def test_webhook_home_id_mismatch( async def test_webhook_home_id_mismatch(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service turn on for valves.""" """Test service turn on for valves."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -1030,10 +1037,10 @@ async def test_webhook_home_id_mismatch(
async def test_webhook_set_point( async def test_webhook_set_point(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test service turn on for valves.""" """Test service turn on for valves."""
with selected_platforms(["climate"]): with selected_platforms([Platform.CLIMATE]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()

View File

@ -1,5 +1,5 @@
"""The tests for Netatmo cover.""" """The tests for Netatmo cover."""
from unittest.mock import patch from unittest.mock import AsyncMock, patch
from homeassistant.components.cover import ( from homeassistant.components.cover import (
ATTR_POSITION, ATTR_POSITION,
@ -9,17 +9,19 @@ from homeassistant.components.cover import (
SERVICE_SET_COVER_POSITION, SERVICE_SET_COVER_POSITION,
SERVICE_STOP_COVER, SERVICE_STOP_COVER,
) )
from homeassistant.const import ATTR_ENTITY_ID from homeassistant.const import ATTR_ENTITY_ID, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from .common import selected_platforms from .common import selected_platforms
from tests.common import MockConfigEntry
async def test_cover_setup_and_services( async def test_cover_setup_and_services(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test setup and services.""" """Test setup and services."""
with selected_platforms(["cover"]): with selected_platforms([Platform.COVER]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()

View File

@ -9,6 +9,7 @@ from homeassistant.setup import async_setup_component
from .common import fake_post_request from .common import fake_post_request
from tests.common import MockConfigEntry
from tests.components.diagnostics import get_diagnostics_for_config_entry from tests.components.diagnostics import get_diagnostics_for_config_entry
from tests.typing import ClientSessionGenerator from tests.typing import ClientSessionGenerator
@ -17,7 +18,7 @@ async def test_entry_diagnostics(
hass: HomeAssistant, hass: HomeAssistant,
hass_client: ClientSessionGenerator, hass_client: ClientSessionGenerator,
snapshot: SnapshotAssertion, snapshot: SnapshotAssertion,
config_entry, config_entry: MockConfigEntry,
) -> None: ) -> None:
"""Test config entry diagnostics.""" """Test config entry diagnostics."""
with patch( with patch(

View File

@ -9,7 +9,7 @@ import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.netatmo import DOMAIN from homeassistant.components.netatmo import DOMAIN
from homeassistant.const import CONF_WEBHOOK_ID from homeassistant.const import CONF_WEBHOOK_ID, Platform
from homeassistant.core import CoreState, HomeAssistant from homeassistant.core import CoreState, HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
@ -54,7 +54,9 @@ FAKE_WEBHOOK = {
} }
async def test_setup_component(hass: HomeAssistant, config_entry) -> None: async def test_setup_component(
hass: HomeAssistant, config_entry: MockConfigEntry
) -> None:
"""Test setup and teardown of the netatmo component.""" """Test setup and teardown of the netatmo component."""
with patch( with patch(
"homeassistant.components.netatmo.api.AsyncConfigEntryNetatmoAuth", "homeassistant.components.netatmo.api.AsyncConfigEntryNetatmoAuth",
@ -86,7 +88,9 @@ async def test_setup_component(hass: HomeAssistant, config_entry) -> None:
assert not hass.config_entries.async_entries(DOMAIN) assert not hass.config_entries.async_entries(DOMAIN)
async def test_setup_component_with_config(hass: HomeAssistant, config_entry) -> None: async def test_setup_component_with_config(
hass: HomeAssistant, config_entry: MockConfigEntry
) -> None:
"""Test setup of the netatmo component with dev account.""" """Test setup of the netatmo component with dev account."""
fake_post_hits = 0 fake_post_hits = 0
@ -127,7 +131,9 @@ async def test_setup_component_with_webhook(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry, netatmo_auth
) -> None: ) -> None:
"""Test setup and teardown of the netatmo component with webhook registration.""" """Test setup and teardown of the netatmo component with webhook registration."""
with selected_platforms(["camera", "climate", "light", "sensor"]): with selected_platforms(
[Platform.CAMERA, Platform.CLIMATE, Platform.LIGHT, Platform.SENSOR]
):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -155,7 +161,7 @@ async def test_setup_component_with_webhook(
async def test_setup_without_https( async def test_setup_without_https(
hass: HomeAssistant, config_entry, caplog: pytest.LogCaptureFixture hass: HomeAssistant, config_entry: MockConfigEntry, caplog: pytest.LogCaptureFixture
) -> None: ) -> None:
"""Test if set up with cloud link and without https.""" """Test if set up with cloud link and without https."""
hass.config.components.add("cloud") hass.config.components.add("cloud")
@ -182,7 +188,9 @@ async def test_setup_without_https(
assert "https and port 443 is required to register the webhook" in caplog.text assert "https and port 443 is required to register the webhook" in caplog.text
async def test_setup_with_cloud(hass: HomeAssistant, config_entry) -> None: async def test_setup_with_cloud(
hass: HomeAssistant, config_entry: MockConfigEntry
) -> None:
"""Test if set up with active cloud subscription.""" """Test if set up with active cloud subscription."""
await mock_cloud(hass) await mock_cloud(hass)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -296,7 +304,9 @@ async def test_setup_with_cloudhook(hass: HomeAssistant) -> None:
assert not hass.config_entries.async_entries(DOMAIN) assert not hass.config_entries.async_entries(DOMAIN)
async def test_setup_component_with_delay(hass: HomeAssistant, config_entry) -> None: async def test_setup_component_with_delay(
hass: HomeAssistant, config_entry: MockConfigEntry
) -> None:
"""Test setup of the netatmo component with delayed startup.""" """Test setup of the netatmo component with delayed startup."""
hass.state = CoreState.not_running hass.state = CoreState.not_running
@ -404,7 +414,9 @@ async def test_setup_component_invalid_token_scope(hass: HomeAssistant) -> None:
await hass.config_entries.async_remove(config_entry.entry_id) await hass.config_entries.async_remove(config_entry.entry_id)
async def test_setup_component_invalid_token(hass: HomeAssistant, config_entry) -> None: async def test_setup_component_invalid_token(
hass: HomeAssistant, config_entry: MockConfigEntry
) -> None:
"""Test handling of invalid token.""" """Test handling of invalid token."""
async def fake_ensure_valid_token(*args, **kwargs): async def fake_ensure_valid_token(*args, **kwargs):

View File

@ -12,11 +12,12 @@ from homeassistant.core import HomeAssistant
from .common import FAKE_WEBHOOK_ACTIVATION, selected_platforms, simulate_webhook from .common import FAKE_WEBHOOK_ACTIVATION, selected_platforms, simulate_webhook
from tests.common import MockConfigEntry
from tests.test_util.aiohttp import AiohttpClientMockResponse from tests.test_util.aiohttp import AiohttpClientMockResponse
async def test_camera_light_setup_and_services( async def test_camera_light_setup_and_services(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test camera ligiht setup and services.""" """Test camera ligiht setup and services."""
with selected_platforms(["light"]): with selected_platforms(["light"]):
@ -127,7 +128,7 @@ async def test_setup_component_no_devices(hass: HomeAssistant, config_entry) ->
async def test_light_setup_and_services( async def test_light_setup_and_services(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test setup and services.""" """Test setup and services."""
with selected_platforms(["light"]): with selected_platforms(["light"]):

View File

@ -1,5 +1,5 @@
"""The tests for the Netatmo climate platform.""" """The tests for the Netatmo climate platform."""
from unittest.mock import patch from unittest.mock import AsyncMock, patch
import pytest import pytest
@ -13,9 +13,14 @@ from homeassistant.core import HomeAssistant
from .common import selected_platforms, simulate_webhook from .common import selected_platforms, simulate_webhook
from tests.common import MockConfigEntry
async def test_select_schedule_thermostats( async def test_select_schedule_thermostats(
hass: HomeAssistant, config_entry, caplog: pytest.LogCaptureFixture, netatmo_auth hass: HomeAssistant,
config_entry: MockConfigEntry,
caplog: pytest.LogCaptureFixture,
netatmo_auth: AsyncMock,
) -> None: ) -> None:
"""Test service for selecting Netatmo schedule with thermostats.""" """Test service for selecting Netatmo schedule with thermostats."""
with selected_platforms(["climate", "select"]): with selected_platforms(["climate", "select"]):

View File

@ -1,18 +1,23 @@
"""The tests for the Netatmo sensor platform.""" """The tests for the Netatmo sensor platform."""
from unittest.mock import patch from unittest.mock import AsyncMock
import pytest import pytest
from homeassistant.components.netatmo import sensor from homeassistant.components.netatmo import sensor
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er from homeassistant.helpers import entity_registry as er
from .common import TEST_TIME, selected_platforms from .common import selected_platforms
from tests.common import MockConfigEntry
async def test_indoor_sensor(hass: HomeAssistant, config_entry, netatmo_auth) -> None: async def test_indoor_sensor(
hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None:
"""Test indoor sensor setup.""" """Test indoor sensor setup."""
with patch("time.time", return_value=TEST_TIME), selected_platforms(["sensor"]): with selected_platforms([Platform.SENSOR]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -25,9 +30,11 @@ async def test_indoor_sensor(hass: HomeAssistant, config_entry, netatmo_auth) ->
assert hass.states.get(f"{prefix}pressure").state == "1014.5" assert hass.states.get(f"{prefix}pressure").state == "1014.5"
async def test_weather_sensor(hass: HomeAssistant, config_entry, netatmo_auth) -> None: async def test_weather_sensor(
hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None:
"""Test weather sensor unreachable.""" """Test weather sensor unreachable."""
with patch("time.time", return_value=TEST_TIME), selected_platforms(["sensor"]): with selected_platforms([Platform.SENSOR]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -38,10 +45,10 @@ async def test_weather_sensor(hass: HomeAssistant, config_entry, netatmo_auth) -
async def test_public_weather_sensor( async def test_public_weather_sensor(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test public weather sensor setup.""" """Test public weather sensor setup."""
with patch("time.time", return_value=TEST_TIME), selected_platforms(["sensor"]): with selected_platforms([Platform.SENSOR]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -93,7 +100,7 @@ async def test_public_weather_sensor(
("strength", "expected"), ("strength", "expected"),
[(50, "Full"), (60, "High"), (80, "Medium"), (90, "Low")], [(50, "Full"), (60, "High"), (80, "Medium"), (90, "Low")],
) )
async def test_process_wifi(strength, expected) -> None: async def test_process_wifi(strength: int, expected: str) -> None:
"""Test wifi strength translation.""" """Test wifi strength translation."""
assert sensor.process_wifi(strength) == expected assert sensor.process_wifi(strength) == expected
@ -102,7 +109,7 @@ async def test_process_wifi(strength, expected) -> None:
("strength", "expected"), ("strength", "expected"),
[(50, "Full"), (70, "High"), (80, "Medium"), (90, "Low")], [(50, "Full"), (70, "High"), (80, "Medium"), (90, "Low")],
) )
async def test_process_rf(strength, expected) -> None: async def test_process_rf(strength: int, expected: str) -> None:
"""Test radio strength translation.""" """Test radio strength translation."""
assert sensor.process_rf(strength) == expected assert sensor.process_rf(strength) == expected
@ -111,7 +118,7 @@ async def test_process_rf(strength, expected) -> None:
("health", "expected"), ("health", "expected"),
[(4, "Unhealthy"), (3, "Poor"), (2, "Fair"), (1, "Fine"), (0, "Healthy")], [(4, "Unhealthy"), (3, "Poor"), (2, "Fair"), (1, "Fine"), (0, "Healthy")],
) )
async def test_process_health(health, expected) -> None: async def test_process_health(health: int, expected: str) -> None:
"""Test health index translation.""" """Test health index translation."""
assert sensor.process_health(health) == expected assert sensor.process_health(health) == expected
@ -182,10 +189,15 @@ async def test_process_health(health, expected) -> None:
], ],
) )
async def test_weather_sensor_enabling( async def test_weather_sensor_enabling(
hass: HomeAssistant, config_entry, uid, name, expected, netatmo_auth hass: HomeAssistant,
config_entry: MockConfigEntry,
uid: str,
name: str,
expected: str,
netatmo_auth: AsyncMock,
) -> None: ) -> None:
"""Test enabling of by default disabled sensors.""" """Test enabling of by default disabled sensors."""
with patch("time.time", return_value=TEST_TIME), selected_platforms(["sensor"]): with selected_platforms([Platform.SENSOR]):
states_before = len(hass.states.async_all()) states_before = len(hass.states.async_all())
assert hass.states.get(f"sensor.{name}") is None assert hass.states.get(f"sensor.{name}") is None
@ -206,12 +218,10 @@ async def test_weather_sensor_enabling(
async def test_climate_battery_sensor( async def test_climate_battery_sensor(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test climate device battery sensor.""" """Test climate device battery sensor."""
with patch("time.time", return_value=TEST_TIME), selected_platforms( with selected_platforms([Platform.CLIMATE, Platform.SENSOR]):
["sensor", "climate"]
):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()

View File

@ -1,22 +1,24 @@
"""The tests for Netatmo switch.""" """The tests for Netatmo switch."""
from unittest.mock import patch from unittest.mock import AsyncMock, patch
from homeassistant.components.switch import ( from homeassistant.components.switch import (
DOMAIN as SWITCH_DOMAIN, DOMAIN as SWITCH_DOMAIN,
SERVICE_TURN_OFF, SERVICE_TURN_OFF,
SERVICE_TURN_ON, SERVICE_TURN_ON,
) )
from homeassistant.const import ATTR_ENTITY_ID from homeassistant.const import ATTR_ENTITY_ID, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from .common import selected_platforms from .common import selected_platforms
from tests.common import MockConfigEntry
async def test_switch_setup_and_services( async def test_switch_setup_and_services(
hass: HomeAssistant, config_entry, netatmo_auth hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None: ) -> None:
"""Test setup and services.""" """Test setup and services."""
with selected_platforms(["switch"]): with selected_platforms([Platform.SWITCH]):
assert await hass.config_entries.async_setup(config_entry.entry_id) assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()