From 2af4d2152ba24d293d9941ece788140f6668bd96 Mon Sep 17 00:00:00 2001 From: mkmer Date: Wed, 15 Feb 2023 10:01:20 -0500 Subject: [PATCH] Honeywell disable detergent level by default (#88040) * Disable fill by default * Fix tests * use TANK_FILL.get * Remove None from attribute get add reload to sensor test * Typing fix iteration error --- homeassistant/components/whirlpool/sensor.py | 6 ++-- tests/components/whirlpool/conftest.py | 23 +++++++++++++--- tests/components/whirlpool/test_sensor.py | 29 +++++++++++++++----- 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/whirlpool/sensor.py b/homeassistant/components/whirlpool/sensor.py index b026dd0ce32..9c26a0319f7 100644 --- a/homeassistant/components/whirlpool/sensor.py +++ b/homeassistant/components/whirlpool/sensor.py @@ -119,11 +119,12 @@ SENSORS: tuple[WhirlpoolSensorEntityDescription, ...] = ( key="DispenseLevel", name="Detergent Level", translation_key="whirlpool_tank", + entity_registry_enabled_default=False, device_class=SensorDeviceClass.ENUM, options=list(TANK_FILL.values()), - value_fn=lambda WasherDryer: TANK_FILL[ + value_fn=lambda WasherDryer: TANK_FILL.get( WasherDryer.get_attribute("WashCavity_OpStatusBulkDispense1Level") - ], + ), ), ) @@ -265,6 +266,7 @@ class WasherDryerTimeClass(RestoreSensor): async def async_will_remove_from_hass(self) -> None: """Close Whrilpool Appliance sockets before removing.""" + self._wd.unregister_attr_callback(self.update_from_latest_data) await self._wd.disconnect() @property diff --git a/tests/components/whirlpool/conftest.py b/tests/components/whirlpool/conftest.py index 71530e3337f..7ab7f013dd5 100644 --- a/tests/components/whirlpool/conftest.py +++ b/tests/components/whirlpool/conftest.py @@ -49,6 +49,21 @@ def fixture_mock_appliances_manager_api(): yield mock_appliances_manager +@pytest.fixture(name="mock_appliances_manager_laundry_api") +def fixture_mock_appliances_manager_laundry_api(): + """Set up AppliancesManager fixture.""" + with mock.patch( + "homeassistant.components.whirlpool.AppliancesManager" + ) as mock_appliances_manager: + mock_appliances_manager.return_value.fetch_appliances = AsyncMock() + mock_appliances_manager.return_value.aircons = None + mock_appliances_manager.return_value.washer_dryers = [ + {"SAID": MOCK_SAID3, "NAME": "washer"}, + {"SAID": MOCK_SAID4, "NAME": "dryer"}, + ] + yield mock_appliances_manager + + @pytest.fixture(name="mock_backend_selector_api") def fixture_mock_backend_selector_api(): """Set up BackendSelector fixture.""" @@ -115,8 +130,6 @@ def side_effect_function(*args, **kwargs): return "0" if args[0] == "WashCavity_OpStatusBulkDispense1Level": return "3" - if args[0] == "Cavity_TimeStatusEstTimeRemaining": - return "4000" def get_sensor_mock(said): @@ -141,13 +154,13 @@ def get_sensor_mock(said): @pytest.fixture(name="mock_sensor1_api", autouse=False) -def fixture_mock_sensor1_api(mock_auth_api, mock_appliances_manager_api): +def fixture_mock_sensor1_api(mock_auth_api, mock_appliances_manager_laundry_api): """Set up sensor API fixture.""" return get_sensor_mock(MOCK_SAID3) @pytest.fixture(name="mock_sensor2_api", autouse=False) -def fixture_mock_sensor2_api(mock_auth_api, mock_appliances_manager_api): +def fixture_mock_sensor2_api(mock_auth_api, mock_appliances_manager_laundry_api): """Set up sensor API fixture.""" return get_sensor_mock(MOCK_SAID4) @@ -161,5 +174,7 @@ def fixture_mock_sensor_api_instances(mock_sensor1_api, mock_sensor2_api): mock_sensor_api.side_effect = [ mock_sensor1_api, mock_sensor2_api, + mock_sensor1_api, + mock_sensor2_api, ] yield mock_sensor_api diff --git a/tests/components/whirlpool/test_sensor.py b/tests/components/whirlpool/test_sensor.py index b8801bd4fd5..eef13c08dc9 100644 --- a/tests/components/whirlpool/test_sensor.py +++ b/tests/components/whirlpool/test_sensor.py @@ -17,7 +17,7 @@ async def update_sensor_state( hass: HomeAssistant, entity_id: str, mock_sensor_api_instance: MagicMock, -): +) -> None: """Simulate an update trigger from the API.""" for call in mock_sensor_api_instance.register_attr_callback.call_args_list: @@ -44,7 +44,7 @@ async def test_dryer_sensor_values( hass: HomeAssistant, mock_sensor_api_instances: MagicMock, mock_sensor2_api: MagicMock, -): +) -> None: """Test the sensor value callbacks.""" hass.state = CoreState.not_running thetimestamp: datetime = datetime(2022, 11, 29, 00, 00, 00, 00, timezone.utc) @@ -108,7 +108,7 @@ async def test_washer_sensor_values( hass: HomeAssistant, mock_sensor_api_instances: MagicMock, mock_sensor1_api: MagicMock, -): +) -> None: """Test the sensor value callbacks.""" hass.state = CoreState.not_running thetimestamp: datetime = datetime(2022, 11, 29, 00, 00, 00, 00, timezone.utc) @@ -147,6 +147,21 @@ async def test_washer_sensor_values( assert state.state == thetimestamp.isoformat() state_id = f"{entity_id.split('_')[0]}_detergent_level" + registry = entity_registry.async_get(hass) + entry = registry.async_get(state_id) + assert entry + assert entry.disabled + assert entry.disabled_by is entity_registry.RegistryEntryDisabler.INTEGRATION + + update_entry = registry.async_update_entity(entry.entity_id, disabled_by=None) + await hass.async_block_till_done() + + assert update_entry != entry + assert update_entry.disabled is False + state = hass.states.get(state_id) + assert state is None + + await hass.config_entries.async_reload(entry.config_entry_id) state = hass.states.get(state_id) assert state is not None assert state.state == "50" @@ -253,7 +268,7 @@ async def test_washer_sensor_values( async def test_restore_state( hass: HomeAssistant, mock_sensor_api_instances: MagicMock, -): +) -> None: """Test sensor restore state.""" # Home assistant is not running yet hass.state = CoreState.not_running @@ -288,7 +303,7 @@ async def test_callback( hass: HomeAssistant, mock_sensor_api_instances: MagicMock, mock_sensor1_api: MagicMock, -): +) -> None: """Test callback timestamp callback function.""" hass.state = CoreState.not_running thetimestamp: datetime = datetime(2022, 11, 29, 00, 00, 00, 00, timezone.utc) @@ -314,9 +329,9 @@ async def test_callback( # restore from cache state = hass.states.get("sensor.washer_end_time") assert state.state == thetimestamp.isoformat() - callback = mock_sensor1_api.register_attr_callback.call_args_list[2][0][0] + callback = mock_sensor1_api.register_attr_callback.call_args_list[1][0][0] callback() - # await hass.async_block_till_done() + state = hass.states.get("sensor.washer_end_time") assert state.state == thetimestamp.isoformat() mock_sensor1_api.get_machine_state.return_value = MachineState.RunningMainCycle