From 0628546a0e53e96f4e8694e337c6bf50a824b3d4 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 24 Jan 2024 17:50:06 -1000 Subject: [PATCH] Add basic tests for powerview scenes (#108818) --- .../hunterdouglas_powerview/__init__.py | 2 + .../hunterdouglas_powerview/conftest.py | 47 +++++++++++++++++++ .../fixtures/scenes.json | 25 ++++++++++ .../test_config_flow.py | 6 ++- .../hunterdouglas_powerview/test_scene.py | 36 ++++++++++++++ 5 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 tests/components/hunterdouglas_powerview/conftest.py create mode 100644 tests/components/hunterdouglas_powerview/fixtures/scenes.json create mode 100644 tests/components/hunterdouglas_powerview/test_scene.py diff --git a/tests/components/hunterdouglas_powerview/__init__.py b/tests/components/hunterdouglas_powerview/__init__.py index 034d845b110..1cab5f9071e 100644 --- a/tests/components/hunterdouglas_powerview/__init__.py +++ b/tests/components/hunterdouglas_powerview/__init__.py @@ -1 +1,3 @@ """Tests for the Hunter Douglas PowerView integration.""" + +MOCK_MAC = "AA::BB::CC::DD::EE::FF" diff --git a/tests/components/hunterdouglas_powerview/conftest.py b/tests/components/hunterdouglas_powerview/conftest.py new file mode 100644 index 00000000000..e4e56abd56c --- /dev/null +++ b/tests/components/hunterdouglas_powerview/conftest.py @@ -0,0 +1,47 @@ +"""Tests for the Hunter Douglas PowerView integration.""" +import json +from unittest.mock import patch + +import pytest + +from tests.common import load_fixture + + +@pytest.fixture(scope="session") +def powerview_userdata(): + """Return the userdata fixture.""" + return json.loads(load_fixture("hunterdouglas_powerview/userdata.json")) + + +@pytest.fixture(scope="session") +def powerview_fwversion(): + """Return the fwversion fixture.""" + return json.loads(load_fixture("hunterdouglas_powerview/fwversion.json")) + + +@pytest.fixture(scope="session") +def powerview_scenes(): + """Return the scenes fixture.""" + return json.loads(load_fixture("hunterdouglas_powerview/scenes.json")) + + +@pytest.fixture +def mock_powerview_v2_hub(powerview_userdata, powerview_fwversion, powerview_scenes): + """Mock a Powerview v2 hub.""" + with patch( + "homeassistant.components.hunterdouglas_powerview.UserData.get_resources", + return_value=powerview_userdata, + ), patch( + "homeassistant.components.hunterdouglas_powerview.Rooms.get_resources", + return_value={"roomData": []}, + ), patch( + "homeassistant.components.hunterdouglas_powerview.Scenes.get_resources", + return_value=powerview_scenes, + ), patch( + "homeassistant.components.hunterdouglas_powerview.Shades.get_resources", + return_value={"shadeData": []}, + ), patch( + "homeassistant.components.hunterdouglas_powerview.ApiEntryPoint", + return_value=powerview_fwversion, + ): + yield diff --git a/tests/components/hunterdouglas_powerview/fixtures/scenes.json b/tests/components/hunterdouglas_powerview/fixtures/scenes.json new file mode 100644 index 00000000000..7a9f7d9e8eb --- /dev/null +++ b/tests/components/hunterdouglas_powerview/fixtures/scenes.json @@ -0,0 +1,25 @@ +{ + "sceneIds": [46274, 21015], + "sceneData": [ + { + "roomId": 12538, + "name": "one", + "colorId": 12, + "iconId": 0, + "networkNumber": 250, + "id": 46274, + "order": 0, + "hkAssist": false + }, + { + "roomId": 12538, + "name": "two", + "colorId": 14, + "iconId": 0, + "networkNumber": 231, + "id": 21015, + "order": 1, + "hkAssist": false + } + ] +} diff --git a/tests/components/hunterdouglas_powerview/test_config_flow.py b/tests/components/hunterdouglas_powerview/test_config_flow.py index f39b4c1f68e..0511e7bf821 100644 --- a/tests/components/hunterdouglas_powerview/test_config_flow.py +++ b/tests/components/hunterdouglas_powerview/test_config_flow.py @@ -1,4 +1,4 @@ -"""Test the Logitech Harmony Hub config flow.""" +"""Test the Hunter Douglas Powerview config flow.""" import asyncio from ipaddress import ip_address import json @@ -11,6 +11,8 @@ from homeassistant.components import dhcp, zeroconf from homeassistant.components.hunterdouglas_powerview.const import DOMAIN from homeassistant.core import HomeAssistant +from . import MOCK_MAC + from tests.common import MockConfigEntry, load_fixture ZEROCONF_HOST = "1.2.3.4" @@ -20,7 +22,7 @@ HOMEKIT_DISCOVERY_INFO = zeroconf.ZeroconfServiceInfo( hostname="mock_hostname", name="Hunter Douglas Powerview Hub._hap._tcp.local.", port=None, - properties={zeroconf.ATTR_PROPERTIES_ID: "AA::BB::CC::DD::EE::FF"}, + properties={zeroconf.ATTR_PROPERTIES_ID: MOCK_MAC}, type="mock_type", ) diff --git a/tests/components/hunterdouglas_powerview/test_scene.py b/tests/components/hunterdouglas_powerview/test_scene.py new file mode 100644 index 00000000000..b4dd4491a72 --- /dev/null +++ b/tests/components/hunterdouglas_powerview/test_scene.py @@ -0,0 +1,36 @@ +"""Test the Hunter Douglas Powerview scene platform.""" +from unittest.mock import patch + +from homeassistant.components.hunterdouglas_powerview.const import DOMAIN +from homeassistant.components.scene import DOMAIN as SCENE_DOMAIN, SERVICE_TURN_ON +from homeassistant.const import STATE_UNKNOWN +from homeassistant.core import HomeAssistant + +from . import MOCK_MAC + +from tests.common import MockConfigEntry + + +async def test_scenes(hass: HomeAssistant, mock_powerview_v2_hub: None) -> None: + """Test the scenes.""" + entry = MockConfigEntry(domain=DOMAIN, data={"host": "1.2.3.4"}, unique_id=MOCK_MAC) + entry.add_to_hass(hass) + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + assert len(hass.states.async_all()) == 2 + assert hass.states.get("scene.alexanderhd_one").state == STATE_UNKNOWN + assert hass.states.get("scene.alexanderhd_two").state == STATE_UNKNOWN + + with patch( + "homeassistant.components.hunterdouglas_powerview.scene.PvScene.activate" + ) as mock_activate: + await hass.services.async_call( + SCENE_DOMAIN, + SERVICE_TURN_ON, + {"entity_id": "scene.alexanderhd_one"}, + blocking=True, + ) + await hass.async_block_till_done() + + mock_activate.assert_called_once()