Files
core/tests/components/openrgb/conftest.py
Felipe Santos 18c63e3b8f Introduce the OpenRGB integration (#153373)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Manu <4445816+tr4nt0r@users.noreply.github.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-10-14 19:03:58 +02:00

124 lines
3.5 KiB
Python

"""Fixtures for OpenRGB integration tests."""
from collections.abc import Generator
import importlib
from types import SimpleNamespace
from typing import Any
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from homeassistant.components.openrgb.const import DOMAIN
from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT
from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry, load_json_object_fixture
def _process_openrgb_dump(dump: Any) -> Any:
"""Reconstruct OpenRGB objects from dump."""
if isinstance(dump, dict):
# Reconstruct Enums
if "__enum__" in dump:
module_name, class_name = dump["__enum__"].rsplit(".", 1)
return getattr(importlib.import_module(module_name), class_name)(
dump["value"]
)
return SimpleNamespace(**{k: _process_openrgb_dump(v) for k, v in dump.items()})
if isinstance(dump, list):
return [_process_openrgb_dump(item) for item in dump]
return dump
@pytest.fixture
def mock_config_entry() -> MockConfigEntry:
"""Return the default mocked config entry."""
return MockConfigEntry(
domain=DOMAIN,
title="Test Computer",
data={
CONF_NAME: "Test Computer",
CONF_HOST: "127.0.0.1",
CONF_PORT: 6742,
},
entry_id="01J0EXAMPLE0CONFIGENTRY00",
)
@pytest.fixture
def mock_setup_entry() -> Generator[AsyncMock]:
"""Mock setting up a config entry."""
with patch(
"homeassistant.components.openrgb.async_setup_entry", return_value=True
) as mock_setup:
yield mock_setup
@pytest.fixture
def mock_openrgb_device() -> MagicMock:
"""Return a mocked OpenRGB device."""
# Restore object from dump
device_obj = _process_openrgb_dump(
load_json_object_fixture("device_ene_dram.json", DOMAIN)
)
# Create mock from object
device = MagicMock(spec=device_obj)
device.configure_mock(**vars(device_obj))
# Methods
device.set_color = MagicMock()
device.set_mode = MagicMock()
return device
@pytest.fixture
def mock_openrgb_client(mock_openrgb_device: MagicMock) -> Generator[MagicMock]:
"""Return a mocked OpenRGB client."""
with (
patch(
"homeassistant.components.openrgb.coordinator.OpenRGBClient",
autospec=True,
) as client_mock,
patch(
"homeassistant.components.openrgb.config_flow.OpenRGBClient",
new=client_mock,
),
# Patch Debouncer to remove delays in tests
patch(
"homeassistant.components.openrgb.coordinator.Debouncer",
return_value=None,
),
):
client = client_mock.return_value
# Attributes
client.protocol_version = 4
client.devices = [mock_openrgb_device]
# Methods
client.update = MagicMock()
client.connect = MagicMock()
client.disconnect = MagicMock()
# Store the class mock so tests can set side_effect
client.client_class_mock = client_mock
yield client
@pytest.fixture
async def init_integration(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_openrgb_client: MagicMock,
) -> MockConfigEntry:
"""Set up the OpenRGB integration for testing."""
mock_config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
return mock_config_entry