"""Provide common Netatmo fixtures.""" from contextlib import contextmanager from time import time from unittest.mock import patch import pytest from .common import ALL_SCOPES, TEST_TIME, fake_post_request, fake_post_request_no_data from tests.common import MockConfigEntry @pytest.fixture(name="config_entry") async def mock_config_entry_fixture(hass): """Mock a config entry.""" mock_entry = MockConfigEntry( domain="netatmo", data={ "auth_implementation": "cloud", "token": { "refresh_token": "mock-refresh-token", "access_token": "mock-access-token", "type": "Bearer", "expires_in": 60, "expires_at": time() + 1000, "scope": " ".join(ALL_SCOPES), }, }, options={ "weather_areas": { "Home avg": { "lat_ne": 32.2345678, "lon_ne": -117.1234567, "lat_sw": 32.1234567, "lon_sw": -117.2345678, "show_on_map": False, "area_name": "Home avg", "mode": "avg", }, "Home max": { "lat_ne": 32.2345678, "lon_ne": -117.1234567, "lat_sw": 32.1234567, "lon_sw": -117.2345678, "show_on_map": True, "area_name": "Home max", "mode": "max", }, } }, ) mock_entry.add_to_hass(hass) return mock_entry @contextmanager def selected_platforms(platforms=["camera", "climate", "light", "sensor"]): """Restrict loaded platforms to list given.""" with patch("homeassistant.components.netatmo.PLATFORMS", platforms), patch( "homeassistant.components.netatmo.api.ConfigEntryNetatmoAuth" ) as mock_auth, patch( "homeassistant.helpers.config_entry_oauth2_flow.async_get_config_entry_implementation", ), patch( "homeassistant.components.webhook.async_generate_url" ): mock_auth.return_value.post_request.side_effect = fake_post_request yield @pytest.fixture(name="entry") async def mock_entry_fixture(hass, config_entry): """Mock setup of all platforms.""" with selected_platforms(): await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() return config_entry @pytest.fixture(name="sensor_entry") async def mock_sensor_entry_fixture(hass, config_entry): """Mock setup of sensor platform.""" with patch("time.time", return_value=TEST_TIME), selected_platforms(["sensor"]): await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() yield config_entry @pytest.fixture(name="camera_entry") async def mock_camera_entry_fixture(hass, config_entry): """Mock setup of camera platform.""" with selected_platforms(["camera"]): await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() return config_entry @pytest.fixture(name="light_entry") async def mock_light_entry_fixture(hass, config_entry): """Mock setup of light platform.""" with selected_platforms(["light"]): await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() return config_entry @pytest.fixture(name="climate_entry") async def mock_climate_entry_fixture(hass, config_entry): """Mock setup of climate platform.""" with selected_platforms(["climate"]): await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() return config_entry @pytest.fixture(name="entry_error") async def mock_entry_error_fixture(hass, config_entry): """Mock erroneous setup of platforms.""" with patch( "homeassistant.components.netatmo.api.ConfigEntryNetatmoAuth" ) as mock_auth, patch( "homeassistant.helpers.config_entry_oauth2_flow.async_get_config_entry_implementation", ), patch( "homeassistant.components.webhook.async_generate_url" ): mock_auth.return_value.post_request.side_effect = fake_post_request_no_data await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() yield config_entry