1
0
mirror of https://github.com/home-assistant/core.git synced 2026-05-22 00:10:16 +01:00
Files
core/tests/components/solaredge/test_init.py
T
2026-05-13 19:57:01 +02:00

187 lines
5.8 KiB
Python

"""Tests for the SolarEdge integration."""
from unittest.mock import AsyncMock, Mock, patch
from aiohttp import ClientError
import pytest
from homeassistant.components.recorder import Recorder
from homeassistant.components.solaredge.const import CONF_SITE_ID, DOMAIN
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import CONF_API_KEY, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant
from . import setup_integration
from .conftest import API_KEY, PASSWORD, SITE_ID, USERNAME
from tests.common import MockConfigEntry
@patch(
"homeassistant.config_entries.ConfigEntries.async_unload_platforms",
return_value=True,
)
async def test_setup_unload_api_key(
mock_unload_platforms: AsyncMock,
recorder_mock: Recorder,
hass: HomeAssistant,
solaredge_api: Mock,
) -> None:
"""Test successful setup and unload of a config entry with API key."""
entry = MockConfigEntry(
domain=DOMAIN,
data={CONF_SITE_ID: SITE_ID, CONF_API_KEY: API_KEY},
)
entry.add_to_hass(hass)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert entry.state is ConfigEntryState.LOADED
assert solaredge_api.get_details.await_count == 2
assert await hass.config_entries.async_unload(entry.entry_id)
await hass.async_block_till_done()
# Unloading should be attempted because sensors were set up.
mock_unload_platforms.assert_awaited_once()
assert entry.state is ConfigEntryState.NOT_LOADED
@patch(
"homeassistant.config_entries.ConfigEntries.async_unload_platforms",
return_value=True,
)
async def test_setup_unload_web_login(
mock_unload_platforms: AsyncMock,
recorder_mock: Recorder,
hass: HomeAssistant,
solaredge_web_api: AsyncMock,
) -> None:
"""Test successful setup and unload of a config entry with web login."""
entry = MockConfigEntry(
domain=DOMAIN,
data={
CONF_SITE_ID: SITE_ID,
CONF_USERNAME: USERNAME,
CONF_PASSWORD: PASSWORD,
},
)
entry.add_to_hass(hass)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert entry.state is ConfigEntryState.LOADED
solaredge_web_api.async_get_equipment.assert_awaited_once()
solaredge_web_api.async_get_energy_data.assert_awaited_once()
assert await hass.config_entries.async_unload(entry.entry_id)
await hass.async_block_till_done()
# Unloading should NOT be attempted because sensors were not set up.
mock_unload_platforms.assert_not_called()
assert entry.state is ConfigEntryState.NOT_LOADED
@patch(
"homeassistant.config_entries.ConfigEntries.async_unload_platforms",
return_value=True,
)
async def test_setup_unload_both(
mock_unload_platforms: AsyncMock,
recorder_mock: Recorder,
hass: HomeAssistant,
solaredge_api: Mock,
solaredge_web_api: AsyncMock,
) -> None:
"""Test successful setup and unload of a config entry with both auth methods."""
entry = MockConfigEntry(
domain=DOMAIN,
data={
CONF_SITE_ID: SITE_ID,
CONF_API_KEY: API_KEY,
CONF_USERNAME: USERNAME,
CONF_PASSWORD: PASSWORD,
},
)
entry.add_to_hass(hass)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert entry.state is ConfigEntryState.LOADED
assert solaredge_api.get_details.await_count == 2
solaredge_web_api.async_get_equipment.assert_awaited_once()
solaredge_web_api.async_get_energy_data.assert_awaited_once()
assert await hass.config_entries.async_unload(entry.entry_id)
await hass.async_block_till_done()
mock_unload_platforms.assert_awaited_once()
assert entry.state is ConfigEntryState.NOT_LOADED
async def test_api_key_config_not_ready(
recorder_mock: Recorder, hass: HomeAssistant, solaredge_api: Mock
) -> None:
"""Test for setup failure with API key."""
solaredge_api.get_details.side_effect = ClientError()
entry = MockConfigEntry(
domain=DOMAIN,
data={CONF_SITE_ID: SITE_ID, CONF_API_KEY: API_KEY},
)
entry.add_to_hass(hass)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert entry.state is ConfigEntryState.SETUP_RETRY
async def test_web_login_config_not_ready(
recorder_mock: Recorder, hass: HomeAssistant, solaredge_web_api: AsyncMock
) -> None:
"""Test for setup failure with web login."""
solaredge_web_api.async_get_equipment.side_effect = ClientError()
entry = MockConfigEntry(
domain=DOMAIN,
data={
CONF_SITE_ID: SITE_ID,
CONF_USERNAME: USERNAME,
CONF_PASSWORD: PASSWORD,
},
)
entry.add_to_hass(hass)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert entry.state is ConfigEntryState.SETUP_RETRY
@pytest.mark.parametrize(
("get_details_response", "expected_state"),
[
# Missing 'details' key → ConfigEntryNotReady → SETUP_RETRY
({}, ConfigEntryState.SETUP_RETRY),
# Site status is not 'active' → setup returns False → SETUP_ERROR
({"details": {"status": "Disabled"}}, ConfigEntryState.SETUP_ERROR),
],
ids=["missing_details_key", "site_not_active"],
)
async def test_setup_api_key_failure(
recorder_mock: Recorder,
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
solaredge_api: Mock,
get_details_response: dict,
expected_state: ConfigEntryState,
) -> None:
"""Test the API-key setup failure paths in async_setup_entry."""
solaredge_api.get_details.return_value = get_details_response
await setup_integration(hass, mock_config_entry)
assert mock_config_entry.state is expected_state