"""Tests for the Nextcloud config flow.""" from unittest.mock import patch from nextcloudmonitor import ( NextcloudMonitorAuthorizationError, NextcloudMonitorConnectionError, NextcloudMonitorRequestError, ) import pytest from syrupy.assertion import SnapshotAssertion from homeassistant.components.nextcloud.const import DOMAIN from homeassistant.config_entries import SOURCE_USER from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from homeassistant.core import HomeAssistant from homeassistant.data_entry_flow import FlowResultType from .const import VALID_CONFIG from tests.common import MockConfigEntry pytestmark = pytest.mark.usefixtures("mock_setup_entry") async def test_user_create_entry( hass: HomeAssistant, snapshot: SnapshotAssertion ) -> None: """Test that the user step works.""" # start user flow result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] is FlowResultType.FORM assert result["step_id"] == "user" assert result["errors"] == {} # test NextcloudMonitorAuthorizationError with patch( "homeassistant.components.nextcloud.config_flow.NextcloudMonitor", side_effect=NextcloudMonitorAuthorizationError, ): result = await hass.config_entries.flow.async_configure( result["flow_id"], VALID_CONFIG, ) await hass.async_block_till_done() assert result["type"] is FlowResultType.FORM assert result["step_id"] == "user" assert result["errors"] == {"base": "invalid_auth"} # test NextcloudMonitorConnectionError with patch( "homeassistant.components.nextcloud.config_flow.NextcloudMonitor", side_effect=NextcloudMonitorConnectionError, ): result = await hass.config_entries.flow.async_configure( result["flow_id"], VALID_CONFIG, ) await hass.async_block_till_done() assert result["type"] is FlowResultType.FORM assert result["step_id"] == "user" assert result["errors"] == {"base": "connection_error"} # test NextcloudMonitorRequestError with patch( "homeassistant.components.nextcloud.config_flow.NextcloudMonitor", side_effect=NextcloudMonitorRequestError, ): result = await hass.config_entries.flow.async_configure( result["flow_id"], VALID_CONFIG, ) await hass.async_block_till_done() assert result["type"] is FlowResultType.FORM assert result["step_id"] == "user" assert result["errors"] == {"base": "connection_error"} # test success with patch( "homeassistant.components.nextcloud.config_flow.NextcloudMonitor", return_value=True, ): result = await hass.config_entries.flow.async_configure( result["flow_id"], VALID_CONFIG, ) await hass.async_block_till_done() assert result["type"] is FlowResultType.CREATE_ENTRY assert result["title"] == "https://my.nc_url.local" assert result["data"] == snapshot async def test_user_already_configured(hass: HomeAssistant) -> None: """Test that errors are shown when duplicates are added.""" entry = MockConfigEntry( domain=DOMAIN, title="https://my.nc_url.local", unique_id="nc_url", data=VALID_CONFIG, ) entry.add_to_hass(hass) result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] is FlowResultType.FORM assert result["step_id"] == "user" assert result["errors"] == {} with patch( "homeassistant.components.nextcloud.config_flow.NextcloudMonitor", return_value=True, ): result = await hass.config_entries.flow.async_configure( result["flow_id"], VALID_CONFIG, ) await hass.async_block_till_done() assert result["type"] is FlowResultType.ABORT assert result["reason"] == "already_configured" async def test_reauth(hass: HomeAssistant, snapshot: SnapshotAssertion) -> None: """Test that the re-auth flow works.""" entry = MockConfigEntry( domain=DOMAIN, title="https://my.nc_url.local", unique_id="nc_url", data=VALID_CONFIG, ) entry.add_to_hass(hass) # start reauth flow result = await entry.start_reauth_flow(hass) assert result["type"] is FlowResultType.FORM assert result["step_id"] == "reauth_confirm" # test NextcloudMonitorAuthorizationError with patch( "homeassistant.components.nextcloud.config_flow.NextcloudMonitor", side_effect=NextcloudMonitorAuthorizationError, ): result = await hass.config_entries.flow.async_configure( result["flow_id"], { CONF_USERNAME: "other_user", CONF_PASSWORD: "other_password", }, ) await hass.async_block_till_done() assert result["type"] is FlowResultType.FORM assert result["step_id"] == "reauth_confirm" assert result["errors"] == {"base": "invalid_auth"} # test NextcloudMonitorConnectionError with patch( "homeassistant.components.nextcloud.config_flow.NextcloudMonitor", side_effect=NextcloudMonitorConnectionError, ): result = await hass.config_entries.flow.async_configure( result["flow_id"], { CONF_USERNAME: "other_user", CONF_PASSWORD: "other_password", }, ) await hass.async_block_till_done() assert result["type"] is FlowResultType.FORM assert result["step_id"] == "reauth_confirm" assert result["errors"] == {"base": "connection_error"} # test NextcloudMonitorRequestError with patch( "homeassistant.components.nextcloud.config_flow.NextcloudMonitor", side_effect=NextcloudMonitorRequestError, ): result = await hass.config_entries.flow.async_configure( result["flow_id"], { CONF_USERNAME: "other_user", CONF_PASSWORD: "other_password", }, ) await hass.async_block_till_done() assert result["type"] is FlowResultType.FORM assert result["step_id"] == "reauth_confirm" assert result["errors"] == {"base": "connection_error"} # test success with patch( "homeassistant.components.nextcloud.config_flow.NextcloudMonitor", return_value=True, ): result = await hass.config_entries.flow.async_configure( result["flow_id"], { CONF_USERNAME: "other_user", CONF_PASSWORD: "other_password", }, ) await hass.async_block_till_done() assert result["type"] is FlowResultType.ABORT assert result["reason"] == "reauth_successful" assert entry.data == snapshot