"""Test the Prosegur Alarm config flow.""" from unittest.mock import patch import pytest from homeassistant import config_entries from homeassistant.components.prosegur.config_flow import CannotConnect, InvalidAuth from homeassistant.components.prosegur.const import DOMAIN from homeassistant.core import HomeAssistant from homeassistant.data_entry_flow import FlowResultType from tests.common import MockConfigEntry async def test_form(hass: HomeAssistant, mock_list_contracts) -> None: """Test we get the form.""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} ) assert result["type"] == "form" assert result["errors"] == {} with patch( "homeassistant.components.prosegur.config_flow.Installation.list", return_value=mock_list_contracts, ) as mock_retrieve, patch( "homeassistant.components.prosegur.async_setup_entry", return_value=True, ) as mock_setup_entry: result2 = await hass.config_entries.flow.async_configure( result["flow_id"], { "username": "test-username", "password": "test-password", "country": "PT", }, ) await hass.async_block_till_done() result3 = await hass.config_entries.flow.async_configure( result2["flow_id"], {"contract": "123"}, ) await hass.async_block_till_done() assert result3["type"] == "create_entry" assert result3["title"] == "Contract 123" assert result3["data"] == { "contract": "123", "username": "test-username", "password": "test-password", "country": "PT", } assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_retrieve.mock_calls) == 1 async def test_form_invalid_auth(hass: HomeAssistant) -> None: """Test we handle invalid auth.""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} ) with patch( "pyprosegur.installation.Installation.list", side_effect=ConnectionRefusedError, ): result2 = await hass.config_entries.flow.async_configure( result["flow_id"], { "username": "test-username", "password": "test-password", "country": "PT", }, ) assert result2["type"] == "form" assert result2["errors"] == {"base": "invalid_auth"} async def test_form_cannot_connect(hass: HomeAssistant) -> None: """Test we handle cannot connect error.""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} ) with patch( "homeassistant.components.prosegur.config_flow.Installation.list", side_effect=ConnectionError, ): result2 = await hass.config_entries.flow.async_configure( result["flow_id"], { "username": "test-username", "password": "test-password", "country": "PT", }, ) assert result2["type"] == "form" assert result2["errors"] == {"base": "cannot_connect"} async def test_form_unknown_exception(hass: HomeAssistant) -> None: """Test we handle unknown exceptions.""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} ) with patch( "pyprosegur.installation.Installation", side_effect=ValueError, ): result2 = await hass.config_entries.flow.async_configure( result["flow_id"], { "username": "test-username", "password": "test-password", "country": "PT", }, ) assert result2["type"] == "form" assert result2["errors"] == {"base": "unknown"} async def test_reauth_flow(hass: HomeAssistant, mock_list_contracts) -> None: """Test a reauthentication flow.""" entry = MockConfigEntry( domain=DOMAIN, unique_id="12345", data={ "username": "test-username", "password": "test-password", "country": "PT", }, ) entry.add_to_hass(hass) result = await hass.config_entries.flow.async_init( DOMAIN, context={ "source": config_entries.SOURCE_REAUTH, "unique_id": entry.unique_id, "entry_id": entry.entry_id, }, data=entry.data, ) assert result["step_id"] == "reauth_confirm" assert result["type"] == FlowResultType.FORM assert result["errors"] == {} with patch( "homeassistant.components.prosegur.config_flow.Installation.list", return_value=mock_list_contracts, ) as mock_installation, patch( "homeassistant.components.prosegur.async_setup_entry", return_value=True, ) as mock_setup_entry: result2 = await hass.config_entries.flow.async_configure( result["flow_id"], { "username": "test-username", "password": "new_password", }, ) await hass.async_block_till_done() assert result2["type"] == FlowResultType.ABORT assert result2["reason"] == "reauth_successful" assert entry.data == { "country": "PT", "username": "test-username", "password": "new_password", } assert len(mock_installation.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1 @pytest.mark.parametrize( ("exception", "base_error"), [ (CannotConnect, "cannot_connect"), (InvalidAuth, "invalid_auth"), (Exception, "unknown"), ], ) async def test_reauth_flow_error(hass: HomeAssistant, exception, base_error) -> None: """Test a reauthentication flow with errors.""" entry = MockConfigEntry( domain=DOMAIN, unique_id="12345", data={ "username": "test-username", "password": "test-password", "country": "PT", }, ) entry.add_to_hass(hass) result = await hass.config_entries.flow.async_init( DOMAIN, context={ "source": config_entries.SOURCE_REAUTH, "unique_id": entry.unique_id, "entry_id": entry.entry_id, }, data=entry.data, ) with patch( "homeassistant.components.prosegur.config_flow.Installation.list", side_effect=exception, ): result2 = await hass.config_entries.flow.async_configure( result["flow_id"], { "username": "test-username", "password": "new_password", }, ) await hass.async_block_till_done() assert result2["type"] == FlowResultType.FORM assert result2["errors"]["base"] == base_error