"""Tests for the Somfy config flow.""" import asyncio from unittest.mock import Mock, patch from pymfy.api.somfy_api import SomfyApi from homeassistant import data_entry_flow from homeassistant.components.somfy import config_flow, DOMAIN from homeassistant.components.somfy.config_flow import register_flow_implementation from tests.common import MockConfigEntry, mock_coro CLIENT_SECRET_VALUE = "5678" CLIENT_ID_VALUE = "1234" AUTH_URL = "http://somfy.com" async def test_abort_if_no_configuration(hass): """Check flow abort when no configuration.""" flow = config_flow.SomfyFlowHandler() flow.hass = hass result = await flow.async_step_user() assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result["reason"] == "missing_configuration" async def test_abort_if_existing_entry(hass): """Check flow abort when an entry already exist.""" flow = config_flow.SomfyFlowHandler() flow.hass = hass MockConfigEntry(domain=DOMAIN).add_to_hass(hass) result = await flow.async_step_import() assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result["reason"] == "already_setup" result = await flow.async_step_user() assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result["reason"] == "already_setup" async def test_full_flow(hass): """Check classic use case.""" hass.data[DOMAIN] = {} register_flow_implementation(hass, CLIENT_ID_VALUE, CLIENT_SECRET_VALUE) flow = config_flow.SomfyFlowHandler() flow.hass = hass hass.config.api = Mock(base_url="https://example.com") flow._get_authorization_url = Mock(return_value=mock_coro((AUTH_URL, "state"))) result = await flow.async_step_import() assert result["type"] == data_entry_flow.RESULT_TYPE_EXTERNAL_STEP assert result["url"] == AUTH_URL result = await flow.async_step_auth("my_super_code") assert result["type"] == data_entry_flow.RESULT_TYPE_EXTERNAL_STEP_DONE assert result["step_id"] == "creation" assert flow.code == "my_super_code" with patch.object( SomfyApi, "request_token", return_value={"access_token": "super_token"} ): result = await flow.async_step_creation() assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result["data"]["refresh_args"] == { "client_id": CLIENT_ID_VALUE, "client_secret": CLIENT_SECRET_VALUE, } assert result["title"] == "Somfy" assert result["data"]["token"] == {"access_token": "super_token"} async def test_abort_if_authorization_timeout(hass): """Check Somfy authorization timeout.""" flow = config_flow.SomfyFlowHandler() flow.hass = hass flow._get_authorization_url = Mock(side_effect=asyncio.TimeoutError) result = await flow.async_step_auth() assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result["reason"] == "authorize_url_timeout"