"""Test the Goodwe config flow.""" from unittest.mock import AsyncMock, patch from goodwe import InverterError from homeassistant.components.goodwe.const import ( CONF_MODEL_FAMILY, DEFAULT_NAME, DOMAIN, ) from homeassistant.config_entries import SOURCE_USER from homeassistant.const import CONF_HOST from homeassistant.core import HomeAssistant from homeassistant.data_entry_flow import FlowResultType from tests.common import MockConfigEntry TEST_HOST = "1.2.3.4" TEST_SERIAL = "123456789" def mock_inverter(): """Get a mock object of the inverter.""" goodwe_inverter = AsyncMock() goodwe_inverter.serial_number = TEST_SERIAL return goodwe_inverter async def test_manual_setup(hass: HomeAssistant) -> None: """Test manually setting up.""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] == FlowResultType.FORM assert result["step_id"] == "user" assert not result["errors"] with patch( "homeassistant.components.goodwe.config_flow.connect", return_value=mock_inverter(), ), patch( "homeassistant.components.goodwe.async_setup_entry", return_value=True ) as mock_setup_entry: result = await hass.config_entries.flow.async_configure( result["flow_id"], {CONF_HOST: TEST_HOST} ) await hass.async_block_till_done() assert result["type"] == FlowResultType.CREATE_ENTRY assert result["title"] == DEFAULT_NAME assert result["data"] == { CONF_HOST: TEST_HOST, CONF_MODEL_FAMILY: "AsyncMock", } assert len(mock_setup_entry.mock_calls) == 1 async def test_manual_setup_already_exists(hass: HomeAssistant) -> None: """Test manually setting up and the device already exists.""" entry = MockConfigEntry( domain=DOMAIN, data={CONF_HOST: TEST_HOST}, unique_id=TEST_SERIAL ) entry.add_to_hass(hass) result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] == FlowResultType.FORM assert result["step_id"] == "user" assert not result["errors"] with patch( "homeassistant.components.goodwe.config_flow.connect", return_value=mock_inverter(), ), patch("homeassistant.components.goodwe.async_setup_entry", return_value=True): result = await hass.config_entries.flow.async_configure( result["flow_id"], {CONF_HOST: TEST_HOST} ) await hass.async_block_till_done() assert result["type"] == FlowResultType.ABORT assert result["reason"] == "already_configured" async def test_manual_setup_device_offline(hass: HomeAssistant) -> None: """Test manually setting up, device offline.""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] == FlowResultType.FORM assert result["step_id"] == "user" assert not result["errors"] with patch( "homeassistant.components.goodwe.config_flow.connect", side_effect=InverterError, ): result = await hass.config_entries.flow.async_configure( result["flow_id"], {CONF_HOST: TEST_HOST} ) await hass.async_block_till_done() assert result["type"] == FlowResultType.FORM assert result["errors"] == {CONF_HOST: "connection_error"}