Refactor fibaro connect (#106875)

* Refactor fibaro connect

* Remove obsolete test

* Add comment about ignored return value
This commit is contained in:
rappenze 2024-04-22 09:29:58 +02:00 committed by GitHub
parent aeaa1f84c0
commit de75f82235
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 9 additions and 53 deletions

View file

@ -108,26 +108,21 @@ class FibaroController:
# Device infos by fibaro device id
self._device_infos: dict[int, DeviceInfo] = {}
def connect(self) -> bool:
def connect(self) -> None:
"""Start the communication with the Fibaro controller."""
connected = self._client.connect()
# Return value doesn't need to be checked,
# it is only relevant when connecting without credentials
self._client.connect()
info = self._client.read_info()
self.hub_serial = info.serial_number
self.hub_name = info.hc_name
self.hub_model = info.platform
self.hub_software_version = info.current_version
if connected is False:
_LOGGER.error(
"Invalid login for Fibaro HC. Please check username and password"
)
return False
self._room_map = {room.fibaro_id: room for room in self._client.read_rooms()}
self._read_devices()
self._scenes = self._client.read_scenes()
return True
def connect_with_error_handling(self) -> None:
"""Translate connect errors to easily differentiate auth and connect failures.
@ -135,9 +130,7 @@ class FibaroController:
When there is a better error handling in the used library this can be improved.
"""
try:
connected = self.connect()
if not connected:
raise FibaroConnectFailed("Connect status is false")
self.connect()
except HTTPError as http_ex:
if http_ex.response.status_code == 403:
raise FibaroAuthFailed from http_ex
@ -382,7 +375,7 @@ class FibaroController:
pass
def _init_controller(data: Mapping[str, Any]) -> FibaroController:
def init_controller(data: Mapping[str, Any]) -> FibaroController:
"""Validate the user input allows us to connect to fibaro."""
controller = FibaroController(data)
controller.connect_with_error_handling()
@ -395,7 +388,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
The unique id of the config entry is the serial number of the home center.
"""
try:
controller = await hass.async_add_executor_job(_init_controller, entry.data)
controller = await hass.async_add_executor_job(init_controller, entry.data)
except FibaroConnectFailed as connect_ex:
raise ConfigEntryNotReady(
f"Could not connect to controller at {entry.data[CONF_URL]}"

View file

@ -13,7 +13,7 @@ from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResu
from homeassistant.const import CONF_PASSWORD, CONF_URL, CONF_USERNAME
from homeassistant.core import HomeAssistant
from . import FibaroAuthFailed, FibaroConnectFailed, FibaroController
from . import FibaroAuthFailed, FibaroConnectFailed, init_controller
from .const import CONF_IMPORT_PLUGINS, DOMAIN
_LOGGER = logging.getLogger(__name__)
@ -28,19 +28,12 @@ STEP_USER_DATA_SCHEMA = vol.Schema(
)
def _connect_to_fibaro(data: dict[str, Any]) -> FibaroController:
"""Validate the user input allows us to connect to fibaro."""
controller = FibaroController(data)
controller.connect_with_error_handling()
return controller
async def _validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str, Any]:
"""Validate the user input allows us to connect.
Data has the keys from STEP_USER_DATA_SCHEMA with values provided by the user.
"""
controller = await hass.async_add_executor_job(_connect_to_fibaro, data)
controller = await hass.async_add_executor_job(init_controller, data)
_LOGGER.debug(
"Successfully connected to fibaro home center %s with name %s",

View file

@ -89,36 +89,6 @@ async def test_config_flow_user_initiated_success(hass: HomeAssistant) -> None:
}
async def test_config_flow_user_initiated_connect_failure(
hass: HomeAssistant, mock_fibaro_client: Mock
) -> None:
"""Connect failure in flow manually initialized by the user."""
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "user"
assert result["errors"] == {}
mock_fibaro_client.connect.return_value = False
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
CONF_URL: TEST_URL,
CONF_USERNAME: TEST_USERNAME,
CONF_PASSWORD: TEST_PASSWORD,
},
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "user"
assert result["errors"] == {"base": "cannot_connect"}
await _recovery_after_failure_works(hass, mock_fibaro_client, result)
async def test_config_flow_user_initiated_auth_failure(
hass: HomeAssistant, mock_fibaro_client: Mock
) -> None: