"""Common tradfri test fixtures.""" from __future__ import annotations from collections.abc import Callable, Generator import json from typing import Any from unittest.mock import AsyncMock, MagicMock, patch import pytest from pytradfri.command import Command from pytradfri.const import ATTR_FIRMWARE_VERSION, ATTR_GATEWAY_ID from pytradfri.device import Device from pytradfri.gateway import Gateway from homeassistant.components.tradfri.const import DOMAIN from . import GATEWAY_ID, TRADFRI_PATH from .common import CommandStore from tests.common import load_fixture @pytest.fixture def mock_entry_setup() -> Generator[AsyncMock]: """Mock entry setup.""" with patch(f"{TRADFRI_PATH}.async_setup_entry") as mock_setup: mock_setup.return_value = True yield mock_setup @pytest.fixture(name="mock_gateway", autouse=True) def mock_gateway_fixture(command_store: CommandStore) -> Gateway: """Mock a Tradfri gateway.""" gateway = Gateway() command_store.register_response( gateway.get_gateway_info(), {ATTR_GATEWAY_ID: GATEWAY_ID, ATTR_FIRMWARE_VERSION: "1.2.1234"}, ) command_store.register_response( gateway.get_devices(), [], ) return gateway @pytest.fixture(name="command_store", autouse=True) def command_store_fixture() -> CommandStore: """Store commands and command responses for the API.""" return CommandStore([], {}) @pytest.fixture(name="mock_api") def mock_api_fixture( command_store: CommandStore, ) -> Callable[[Command | list[Command], float | None], Any | None]: """Mock api.""" async def api( command: Command | list[Command], timeout: float | None = None ) -> Any | None: """Mock api function.""" if isinstance(command, list): result = [] for cmd in command: command_store.sent_commands.append(cmd) result.append(command_store.process_command(cmd)) return result command_store.sent_commands.append(command) return command_store.process_command(command) return api @pytest.fixture(autouse=True) def mock_api_factory( mock_api: Callable[[Command | list[Command], float | None], Any | None], ) -> Generator[MagicMock]: """Mock pytradfri api factory.""" with patch(f"{TRADFRI_PATH}.APIFactory", autospec=True) as factory_class: factory = factory_class.return_value factory_class.init.return_value = factory factory.request = mock_api yield factory @pytest.fixture def device( command_store: CommandStore, mock_gateway: Gateway, request: pytest.FixtureRequest ) -> Device: """Return a device.""" device_response: dict[str, Any] = json.loads(request.getfixturevalue(request.param)) device = Device(device_response) command_store.register_device(mock_gateway, device.raw) return device @pytest.fixture(scope="package") def air_purifier() -> str: """Return an air purifier response.""" return load_fixture("air_purifier.json", DOMAIN) @pytest.fixture(scope="package") def blind() -> str: """Return a blind response.""" return load_fixture("blind.json", DOMAIN)