diff --git a/homeassistant/components/aladdin_connect/cover.py b/homeassistant/components/aladdin_connect/cover.py index 5837920560c718ba70880785f4ef35f66913ebd3..2cf526e5626b11879939e941eeaa70cba67e1cd2 100644 --- a/homeassistant/components/aladdin_connect/cover.py +++ b/homeassistant/components/aladdin_connect/cover.py @@ -4,7 +4,7 @@ from __future__ import annotations from datetime import timedelta from typing import Any -from AIOAladdinConnect import AladdinConnectClient +from AIOAladdinConnect import AladdinConnectClient, session_manager from homeassistant.components.cover import CoverDeviceClass, CoverEntity from homeassistant.config_entries import ConfigEntry @@ -46,7 +46,7 @@ class AladdinDevice(CoverEntity): ) -> None: """Initialize the Aladdin Connect cover.""" self._acc = acc - + self._entry_id = entry.entry_id self._device_id = device["device_id"] self._number = device["door_number"] self._name = device["name"] @@ -85,7 +85,18 @@ class AladdinDevice(CoverEntity): async def async_update(self) -> None: """Update status of cover.""" - await self._acc.get_doors(self._serial) + try: + await self._acc.get_doors(self._serial) + self._attr_available = True + + except session_manager.ConnectionError: + self._attr_available = False + + except session_manager.InvalidPasswordError: + self._attr_available = False + await self.hass.async_create_task( + self.hass.config_entries.async_reload(self._entry_id) + ) @property def is_closed(self) -> bool | None: diff --git a/tests/components/aladdin_connect/test_cover.py b/tests/components/aladdin_connect/test_cover.py index e63b50607c4feaf6649b07b64dc10fa101f85659..eb617b959a5c116e017a329f9642d92b8c94cf0a 100644 --- a/tests/components/aladdin_connect/test_cover.py +++ b/tests/components/aladdin_connect/test_cover.py @@ -1,6 +1,8 @@ """Test the Aladdin Connect Cover.""" from unittest.mock import AsyncMock, MagicMock, patch +from AIOAladdinConnect import session_manager + from homeassistant.components.aladdin_connect.const import DOMAIN from homeassistant.components.aladdin_connect.cover import SCAN_INTERVAL from homeassistant.components.cover import DOMAIN as COVER_DOMAIN @@ -13,6 +15,7 @@ from homeassistant.const import ( STATE_CLOSING, STATE_OPEN, STATE_OPENING, + STATE_UNAVAILABLE, STATE_UNKNOWN, ) from homeassistant.core import HomeAssistant @@ -97,8 +100,10 @@ async def test_cover_operation( assert await async_setup_component(hass, "homeassistant", {}) await hass.async_block_till_done() + mock_aladdinconnect_api.async_get_door_status = AsyncMock(return_value=STATE_OPEN) mock_aladdinconnect_api.get_door_status.return_value = STATE_OPEN + with patch( "homeassistant.components.aladdin_connect.AladdinConnectClient", return_value=mock_aladdinconnect_api, @@ -116,27 +121,22 @@ async def test_cover_operation( {ATTR_ENTITY_ID: "cover.home"}, blocking=True, ) - await hass.async_block_till_done() assert hass.states.get("cover.home").state == STATE_OPEN mock_aladdinconnect_api.async_get_door_status = AsyncMock(return_value=STATE_CLOSED) mock_aladdinconnect_api.get_door_status.return_value = STATE_CLOSED - with patch( - "homeassistant.components.aladdin_connect.AladdinConnectClient", - return_value=mock_aladdinconnect_api, - ): - await hass.services.async_call( - COVER_DOMAIN, - SERVICE_CLOSE_COVER, - {ATTR_ENTITY_ID: "cover.home"}, - blocking=True, - ) - await hass.async_block_till_done() - async_fire_time_changed( - hass, - utcnow() + SCAN_INTERVAL, - ) - await hass.async_block_till_done() + + await hass.services.async_call( + COVER_DOMAIN, + SERVICE_CLOSE_COVER, + {ATTR_ENTITY_ID: "cover.home"}, + blocking=True, + ) + async_fire_time_changed( + hass, + utcnow() + SCAN_INTERVAL, + ) + await hass.async_block_till_done() assert hass.states.get("cover.home").state == STATE_CLOSED @@ -145,15 +145,11 @@ async def test_cover_operation( ) mock_aladdinconnect_api.get_door_status.return_value = STATE_CLOSING - with patch( - "homeassistant.components.aladdin_connect.AladdinConnectClient", - return_value=mock_aladdinconnect_api, - ): - async_fire_time_changed( - hass, - utcnow() + SCAN_INTERVAL, - ) - await hass.async_block_till_done() + async_fire_time_changed( + hass, + utcnow() + SCAN_INTERVAL, + ) + await hass.async_block_till_done() assert hass.states.get("cover.home").state == STATE_CLOSING mock_aladdinconnect_api.async_get_door_status = AsyncMock( @@ -161,34 +157,47 @@ async def test_cover_operation( ) mock_aladdinconnect_api.get_door_status.return_value = STATE_OPENING - with patch( - "homeassistant.components.aladdin_connect.AladdinConnectClient", - return_value=mock_aladdinconnect_api, - ): - async_fire_time_changed( - hass, - utcnow() + SCAN_INTERVAL, - ) - await hass.async_block_till_done() + async_fire_time_changed( + hass, + utcnow() + SCAN_INTERVAL, + ) + await hass.async_block_till_done() assert hass.states.get("cover.home").state == STATE_OPENING mock_aladdinconnect_api.async_get_door_status = AsyncMock(return_value=None) mock_aladdinconnect_api.get_door_status.return_value = None - with patch( - "homeassistant.components.aladdin_connect.AladdinConnectClient", - return_value=mock_aladdinconnect_api, - ): - await hass.services.async_call( - COVER_DOMAIN, - SERVICE_CLOSE_COVER, - {ATTR_ENTITY_ID: "cover.home"}, - blocking=True, - ) - await hass.async_block_till_done() - async_fire_time_changed( - hass, - utcnow() + SCAN_INTERVAL, - ) - await hass.async_block_till_done() + + await hass.services.async_call( + COVER_DOMAIN, + SERVICE_CLOSE_COVER, + {ATTR_ENTITY_ID: "cover.home"}, + blocking=True, + ) + async_fire_time_changed( + hass, + utcnow() + SCAN_INTERVAL, + ) + await hass.async_block_till_done() assert hass.states.get("cover.home").state == STATE_UNKNOWN + + mock_aladdinconnect_api.get_doors.side_effect = session_manager.ConnectionError + + async_fire_time_changed( + hass, + utcnow() + SCAN_INTERVAL, + ) + await hass.async_block_till_done() + + assert hass.states.get("cover.home").state == STATE_UNAVAILABLE + + mock_aladdinconnect_api.get_doors.side_effect = session_manager.InvalidPasswordError + mock_aladdinconnect_api.login.return_value = False + mock_aladdinconnect_api.login.side_effect = session_manager.InvalidPasswordError + + async_fire_time_changed( + hass, + utcnow() + SCAN_INTERVAL, + ) + await hass.async_block_till_done() + assert hass.states.get("cover.home").state == STATE_UNAVAILABLE