From 79a2fc5a0171ca8f6556af14d553a473cf34bd5b Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk <11290930+bouwew@users.noreply.github.com> Date: Wed, 24 Sep 2025 17:51:04 +0200 Subject: [PATCH] Snapshot testing for Plugwise Select platform (#152827) --- .../plugwise/snapshots/test_select.ambr | 509 ++++++++++++++++++ tests/components/plugwise/test_select.py | 49 +- 2 files changed, 540 insertions(+), 18 deletions(-) create mode 100644 tests/components/plugwise/snapshots/test_select.ambr diff --git a/tests/components/plugwise/snapshots/test_select.ambr b/tests/components/plugwise/snapshots/test_select.ambr new file mode 100644 index 000000000000..c83e56a34460 --- /dev/null +++ b/tests/components/plugwise/snapshots/test_select.ambr @@ -0,0 +1,509 @@ +# serializer version: 1 +# name: test_adam_2_select_entities[platforms0-True-m_adam_cooling][select.adam_gateway_mode-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'away', + 'full', + 'vacation', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.adam_gateway_mode', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Gateway mode', + 'platform': 'plugwise', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'gateway_mode', + 'unique_id': 'da224107914542988a88561b4452b0f6-select_gateway_mode', + 'unit_of_measurement': None, + }) +# --- +# name: test_adam_2_select_entities[platforms0-True-m_adam_cooling][select.adam_gateway_mode-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Adam Gateway mode', + 'options': list([ + 'away', + 'full', + 'vacation', + ]), + }), + 'context': , + 'entity_id': 'select.adam_gateway_mode', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'full', + }) +# --- +# name: test_adam_2_select_entities[platforms0-True-m_adam_cooling][select.adam_regulation_mode-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'bleeding_hot', + 'bleeding_cold', + 'off', + 'heating', + 'cooling', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.adam_regulation_mode', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Regulation mode', + 'platform': 'plugwise', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'regulation_mode', + 'unique_id': 'da224107914542988a88561b4452b0f6-select_regulation_mode', + 'unit_of_measurement': None, + }) +# --- +# name: test_adam_2_select_entities[platforms0-True-m_adam_cooling][select.adam_regulation_mode-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Adam Regulation mode', + 'options': list([ + 'bleeding_hot', + 'bleeding_cold', + 'off', + 'heating', + 'cooling', + ]), + }), + 'context': , + 'entity_id': 'select.adam_regulation_mode', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'cooling', + }) +# --- +# name: test_adam_2_select_entities[platforms0-True-m_adam_cooling][select.bathroom_thermostat_schedule-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'Badkamer', + 'Test', + 'Vakantie', + 'Weekschema', + 'off', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': None, + 'entity_id': 'select.bathroom_thermostat_schedule', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Thermostat schedule', + 'platform': 'plugwise', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'select_schedule', + 'unique_id': 'f871b8c4d63549319221e294e4f88074-select_schedule', + 'unit_of_measurement': None, + }) +# --- +# name: test_adam_2_select_entities[platforms0-True-m_adam_cooling][select.bathroom_thermostat_schedule-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Bathroom Thermostat schedule', + 'options': list([ + 'Badkamer', + 'Test', + 'Vakantie', + 'Weekschema', + 'off', + ]), + }), + 'context': , + 'entity_id': 'select.bathroom_thermostat_schedule', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'Badkamer', + }) +# --- +# name: test_adam_2_select_entities[platforms0-True-m_adam_cooling][select.living_room_thermostat_schedule-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'Badkamer', + 'Test', + 'Vakantie', + 'Weekschema', + 'off', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': None, + 'entity_id': 'select.living_room_thermostat_schedule', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Thermostat schedule', + 'platform': 'plugwise', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'select_schedule', + 'unique_id': 'f2bf9048bef64cc5b6d5110154e33c81-select_schedule', + 'unit_of_measurement': None, + }) +# --- +# name: test_adam_2_select_entities[platforms0-True-m_adam_cooling][select.living_room_thermostat_schedule-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Living room Thermostat schedule', + 'options': list([ + 'Badkamer', + 'Test', + 'Vakantie', + 'Weekschema', + 'off', + ]), + }), + 'context': , + 'entity_id': 'select.living_room_thermostat_schedule', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'off', + }) +# --- +# name: test_adam_select_entities[platforms0][select.badkamer_thermostat_schedule-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'CV Roan', + 'Bios Schema met Film Avond', + 'GF7 Woonkamer', + 'Badkamer Schema', + 'CV Jessie', + 'off', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': None, + 'entity_id': 'select.badkamer_thermostat_schedule', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Thermostat schedule', + 'platform': 'plugwise', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'select_schedule', + 'unique_id': '08963fec7c53423ca5680aa4cb502c63-select_schedule', + 'unit_of_measurement': None, + }) +# --- +# name: test_adam_select_entities[platforms0][select.badkamer_thermostat_schedule-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Badkamer Thermostat schedule', + 'options': list([ + 'CV Roan', + 'Bios Schema met Film Avond', + 'GF7 Woonkamer', + 'Badkamer Schema', + 'CV Jessie', + 'off', + ]), + }), + 'context': , + 'entity_id': 'select.badkamer_thermostat_schedule', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'Badkamer Schema', + }) +# --- +# name: test_adam_select_entities[platforms0][select.bios_thermostat_schedule-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'CV Roan', + 'Bios Schema met Film Avond', + 'GF7 Woonkamer', + 'Badkamer Schema', + 'CV Jessie', + 'off', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': None, + 'entity_id': 'select.bios_thermostat_schedule', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Thermostat schedule', + 'platform': 'plugwise', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'select_schedule', + 'unique_id': '12493538af164a409c6a1c79e38afe1c-select_schedule', + 'unit_of_measurement': None, + }) +# --- +# name: test_adam_select_entities[platforms0][select.bios_thermostat_schedule-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Bios Thermostat schedule', + 'options': list([ + 'CV Roan', + 'Bios Schema met Film Avond', + 'GF7 Woonkamer', + 'Badkamer Schema', + 'CV Jessie', + 'off', + ]), + }), + 'context': , + 'entity_id': 'select.bios_thermostat_schedule', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'off', + }) +# --- +# name: test_adam_select_entities[platforms0][select.jessie_thermostat_schedule-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'CV Roan', + 'Bios Schema met Film Avond', + 'GF7 Woonkamer', + 'Badkamer Schema', + 'CV Jessie', + 'off', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': None, + 'entity_id': 'select.jessie_thermostat_schedule', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Thermostat schedule', + 'platform': 'plugwise', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'select_schedule', + 'unique_id': '82fa13f017d240daa0d0ea1775420f24-select_schedule', + 'unit_of_measurement': None, + }) +# --- +# name: test_adam_select_entities[platforms0][select.jessie_thermostat_schedule-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Jessie Thermostat schedule', + 'options': list([ + 'CV Roan', + 'Bios Schema met Film Avond', + 'GF7 Woonkamer', + 'Badkamer Schema', + 'CV Jessie', + 'off', + ]), + }), + 'context': , + 'entity_id': 'select.jessie_thermostat_schedule', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'CV Jessie', + }) +# --- +# name: test_adam_select_entities[platforms0][select.woonkamer_thermostat_schedule-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'CV Roan', + 'Bios Schema met Film Avond', + 'GF7 Woonkamer', + 'Badkamer Schema', + 'CV Jessie', + 'off', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': None, + 'entity_id': 'select.woonkamer_thermostat_schedule', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Thermostat schedule', + 'platform': 'plugwise', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'select_schedule', + 'unique_id': 'c50f167537524366a5af7aa3942feb1e-select_schedule', + 'unit_of_measurement': None, + }) +# --- +# name: test_adam_select_entities[platforms0][select.woonkamer_thermostat_schedule-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Woonkamer Thermostat schedule', + 'options': list([ + 'CV Roan', + 'Bios Schema met Film Avond', + 'GF7 Woonkamer', + 'Badkamer Schema', + 'CV Jessie', + 'off', + ]), + }), + 'context': , + 'entity_id': 'select.woonkamer_thermostat_schedule', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'GF7 Woonkamer', + }) +# --- diff --git a/tests/components/plugwise/test_select.py b/tests/components/plugwise/test_select.py index f6c4205b756f..91ef44049fd1 100644 --- a/tests/components/plugwise/test_select.py +++ b/tests/components/plugwise/test_select.py @@ -3,6 +3,7 @@ from unittest.mock import MagicMock import pytest +from syrupy.assertion import SnapshotAssertion from homeassistant.components.select import ( ATTR_OPTION, @@ -12,18 +13,22 @@ from homeassistant.components.select import ( from homeassistant.const import ATTR_ENTITY_ID from homeassistant.core import HomeAssistant from homeassistant.exceptions import ServiceValidationError +from homeassistant.helpers import entity_registry as er -from tests.common import MockConfigEntry +from tests.common import MockConfigEntry, snapshot_platform +@pytest.mark.parametrize("platforms", [(SELECT_DOMAIN,)]) +@pytest.mark.usefixtures("entity_registry_enabled_by_default") async def test_adam_select_entities( - hass: HomeAssistant, mock_smile_adam: MagicMock, init_integration: MockConfigEntry + hass: HomeAssistant, + mock_smile_adam: MagicMock, + snapshot: SnapshotAssertion, + entity_registry: er.EntityRegistry, + setup_platform: MockConfigEntry, ) -> None: - """Test a thermostat Select.""" - - state = hass.states.get("select.woonkamer_thermostat_schedule") - assert state - assert state.state == "GF7 Woonkamer" + """Test Adam select snapshot.""" + await snapshot_platform(hass, entity_registry, snapshot, setup_platform.entry_id) async def test_adam_change_select_entity( @@ -50,6 +55,21 @@ async def test_adam_change_select_entity( ) +@pytest.mark.parametrize("chosen_env", ["m_adam_cooling"], indirect=True) +@pytest.mark.parametrize("cooling_present", [True], indirect=True) +@pytest.mark.parametrize("platforms", [(SELECT_DOMAIN,)]) +@pytest.mark.usefixtures("entity_registry_enabled_by_default") +async def test_adam_2_select_entities( + hass: HomeAssistant, + mock_smile_adam_heat_cool: MagicMock, + snapshot: SnapshotAssertion, + entity_registry: er.EntityRegistry, + setup_platform: MockConfigEntry, +) -> None: + """Test Adam with cooling select snapshot.""" + await snapshot_platform(hass, entity_registry, snapshot, setup_platform.entry_id) + + @pytest.mark.parametrize("chosen_env", ["m_adam_cooling"], indirect=True) @pytest.mark.parametrize("cooling_present", [True], indirect=True) async def test_adam_select_regulation_mode( @@ -57,17 +77,10 @@ async def test_adam_select_regulation_mode( mock_smile_adam_heat_cool: MagicMock, init_integration: MockConfigEntry, ) -> None: - """Test a regulation_mode select. + """Test changing the regulation_mode select. Also tests a change in climate _previous mode. """ - - state = hass.states.get("select.adam_gateway_mode") - assert state - assert state.state == "full" - state = hass.states.get("select.adam_regulation_mode") - assert state - assert state.state == "cooling" await hass.services.async_call( SELECT_DOMAIN, SERVICE_SELECT_OPTION, @@ -97,10 +110,10 @@ async def test_legacy_anna_select_entities( @pytest.mark.parametrize("chosen_env", ["anna_heatpump_heating"], indirect=True) @pytest.mark.parametrize("cooling_present", [True], indirect=True) -async def test_adam_select_unavailable_regulation_mode( +async def test_anna_select_unavailable_schedule_mode( hass: HomeAssistant, mock_smile_anna: MagicMock, init_integration: MockConfigEntry ) -> None: - """Test a regulation_mode non-available preset.""" + """Fail-test an Anna thermostat_schedule select option.""" with pytest.raises(ServiceValidationError, match="valid options"): await hass.services.async_call( @@ -108,7 +121,7 @@ async def test_adam_select_unavailable_regulation_mode( SERVICE_SELECT_OPTION, { ATTR_ENTITY_ID: "select.anna_thermostat_schedule", - ATTR_OPTION: "freezing", + ATTR_OPTION: "Winter", }, blocking=True, )