1
0
mirror of https://github.com/home-assistant/core.git synced 2026-04-17 07:34:07 +01:00
Files
core/tests/components/myneomitis/test_config_flow.py
2026-02-23 17:14:30 +01:00

127 lines
4.0 KiB
Python

"""Test the configuration flow for MyNeomitis integration."""
from unittest.mock import AsyncMock
from aiohttp import ClientConnectionError, ClientError, ClientResponseError, RequestInfo
import pytest
from yarl import URL
from homeassistant.components.myneomitis.const import CONF_USER_ID, DOMAIN
from homeassistant.config_entries import SOURCE_USER
from homeassistant.const import CONF_EMAIL, CONF_PASSWORD
from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType
from tests.common import MockConfigEntry
TEST_EMAIL = "test@example.com"
TEST_PASSWORD = "password123"
def make_client_response_error(status: int) -> ClientResponseError:
"""Create a mock ClientResponseError with the given status code."""
request_info = RequestInfo(
url=URL("https://api.fake"),
method="POST",
headers={},
real_url=URL("https://api.fake"),
)
return ClientResponseError(
request_info=request_info,
history=(),
status=status,
message="error",
headers=None,
)
async def test_user_flow_success(
hass: HomeAssistant,
mock_pyaxenco_client: AsyncMock,
mock_setup_entry: AsyncMock,
) -> None:
"""Test successful user flow for MyNeomitis integration."""
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_USER}
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "user"
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
user_input={CONF_EMAIL: TEST_EMAIL, CONF_PASSWORD: TEST_PASSWORD},
)
assert result["type"] is FlowResultType.CREATE_ENTRY
assert result["title"] == f"MyNeomitis ({TEST_EMAIL})"
assert result["data"] == {
CONF_EMAIL: TEST_EMAIL,
CONF_PASSWORD: TEST_PASSWORD,
CONF_USER_ID: "user-123",
}
assert result["result"].unique_id == "user-123"
@pytest.mark.parametrize(
("side_effect", "expected_error"),
[
(ClientConnectionError(), "cannot_connect"),
(make_client_response_error(401), "invalid_auth"),
(make_client_response_error(403), "unknown"),
(make_client_response_error(500), "cannot_connect"),
(ClientError("Network error"), "unknown"),
(RuntimeError("boom"), "unknown"),
],
)
async def test_flow_errors(
hass: HomeAssistant,
mock_pyaxenco_client: AsyncMock,
mock_setup_entry: AsyncMock,
side_effect: Exception,
expected_error: str,
) -> None:
"""Test flow errors and recovery to CREATE_ENTRY."""
mock_pyaxenco_client.login.side_effect = side_effect
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_USER}
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "user"
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
user_input={CONF_EMAIL: TEST_EMAIL, CONF_PASSWORD: TEST_PASSWORD},
)
assert result["type"] is FlowResultType.FORM
assert result["errors"]["base"] == expected_error
mock_pyaxenco_client.login.side_effect = None
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
user_input={CONF_EMAIL: TEST_EMAIL, CONF_PASSWORD: TEST_PASSWORD},
)
assert result["type"] is FlowResultType.CREATE_ENTRY
async def test_abort_if_already_configured(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_pyaxenco_client: AsyncMock,
) -> None:
"""Test abort when an entry for the same user_id already exists."""
mock_config_entry.add_to_hass(hass)
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_USER}
)
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
user_input={CONF_EMAIL: TEST_EMAIL, CONF_PASSWORD: TEST_PASSWORD},
)
assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "already_configured"