core/tests/components/androidtv_remote/test_init.py

107 lines
4.1 KiB
Python
Raw Normal View History

"""Tests for the Android TV Remote integration."""
from collections.abc import Callable
from unittest.mock import AsyncMock, MagicMock
from androidtvremote2 import CannotConnect, InvalidAuth
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import EVENT_HOMEASSISTANT_STOP
from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry
async def test_load_unload_config_entry(
hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_api: MagicMock
) -> None:
"""Test the Android TV Remote configuration entry loading/unloading."""
mock_config_entry.add_to_hass(hass)
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
assert mock_api.async_connect.call_count == 1
assert mock_api.keep_reconnecting.call_count == 1
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 mock_api.disconnect.call_count == 1
async def test_config_entry_not_ready(
hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_api: MagicMock
) -> None:
"""Test the Android TV Remote configuration entry not ready."""
mock_api.async_connect = AsyncMock(side_effect=CannotConnect())
mock_config_entry.add_to_hass(hass)
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
assert mock_api.async_connect.call_count == 1
assert mock_api.keep_reconnecting.call_count == 0
async def test_config_entry_reauth_at_setup(
hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_api: MagicMock
) -> None:
"""Test the Android TV Remote configuration entry needs reauth at setup."""
mock_api.async_connect = AsyncMock(side_effect=InvalidAuth())
mock_config_entry.add_to_hass(hass)
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_ERROR
assert any(mock_config_entry.async_get_active_flows(hass, {"reauth"}))
assert mock_api.async_connect.call_count == 1
assert mock_api.keep_reconnecting.call_count == 0
async def test_config_entry_reauth_while_reconnecting(
hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_api: MagicMock
) -> None:
"""Test the Android TV Remote configuration entry needs reauth while reconnecting."""
invalid_auth_callback: Callable | None = None
def mocked_keep_reconnecting(callback: Callable):
nonlocal invalid_auth_callback
invalid_auth_callback = callback
mock_api.keep_reconnecting.side_effect = mocked_keep_reconnecting
mock_config_entry.add_to_hass(hass)
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
assert not any(mock_config_entry.async_get_active_flows(hass, {"reauth"}))
assert mock_api.async_connect.call_count == 1
assert mock_api.keep_reconnecting.call_count == 1
assert invalid_auth_callback is not None
invalid_auth_callback()
await hass.async_block_till_done()
assert any(mock_config_entry.async_get_active_flows(hass, {"reauth"}))
async def test_disconnect_on_stop(
hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_api: MagicMock
) -> None:
"""Test we close the connection with the Android TV when Home Assistants stops."""
mock_config_entry.add_to_hass(hass)
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
assert mock_api.async_connect.call_count == 1
assert mock_api.keep_reconnecting.call_count == 1
hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP)
await hass.async_block_till_done()
assert mock_api.disconnect.call_count == 1