core/tests/components/opower/test_init.py

117 lines
3.5 KiB
Python

"""Tests for the Opower integration."""
from unittest.mock import AsyncMock
from opower.exceptions import ApiException, CannotConnect, InvalidAuth
import pytest
from homeassistant.components.opower.const import DOMAIN
from homeassistant.components.recorder import Recorder
from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry
async def test_setup_unload_entry(
recorder_mock: Recorder,
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_opower_api: AsyncMock,
) -> None:
"""Test successful setup and unload of a config entry."""
await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
assert mock_config_entry.state is ConfigEntryState.LOADED
mock_opower_api.async_login.assert_awaited_once()
mock_opower_api.async_get_forecast.assert_awaited_once()
mock_opower_api.async_get_accounts.assert_awaited_once()
assert await hass.config_entries.async_unload(mock_config_entry.entry_id)
await hass.async_block_till_done()
assert mock_config_entry.state is ConfigEntryState.NOT_LOADED
assert not hass.data.get(DOMAIN)
@pytest.mark.parametrize(
("login_side_effect", "expected_state"),
[
(
CannotConnect(),
ConfigEntryState.SETUP_RETRY,
),
(
InvalidAuth(),
ConfigEntryState.SETUP_ERROR,
),
],
)
async def test_login_error(
recorder_mock: Recorder,
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_opower_api: AsyncMock,
login_side_effect: Exception,
expected_state: ConfigEntryState,
) -> None:
"""Test for login error."""
mock_opower_api.async_login.side_effect = login_side_effect
assert not await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
assert mock_config_entry.state is expected_state
async def test_get_forecast_error(
recorder_mock: Recorder,
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_opower_api: AsyncMock,
) -> None:
"""Test for API error when getting forecast."""
mock_opower_api.async_get_forecast.side_effect = ApiException(
message="forecast error", url=""
)
assert not await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY
async def test_get_accounts_error(
recorder_mock: Recorder,
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_opower_api: AsyncMock,
) -> None:
"""Test for API error when getting accounts."""
mock_opower_api.async_get_accounts.side_effect = ApiException(
message="accounts error", url=""
)
assert not await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY
async def test_get_cost_reads_error(
recorder_mock: Recorder,
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_opower_api: AsyncMock,
) -> None:
"""Test for API error when getting cost reads."""
mock_opower_api.async_get_cost_reads.side_effect = ApiException(
message="cost reads error", url=""
)
assert not await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY