"""Test the LetPot integration initialization and setup.""" from unittest.mock import MagicMock from letpot.exceptions import LetPotAuthenticationException, LetPotConnectionException import pytest from homeassistant.config_entries import ConfigEntryState from homeassistant.core import HomeAssistant from . import setup_integration from tests.common import MockConfigEntry @pytest.mark.freeze_time("2025-01-31 00:00:00") async def test_load_unload_config_entry( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_client: MagicMock, mock_device_client: MagicMock, ) -> None: """Test config entry loading/unloading.""" await setup_integration(hass, mock_config_entry) assert mock_config_entry.state is ConfigEntryState.LOADED mock_client.refresh_token.assert_not_called() # Didn't refresh valid token mock_client.get_devices.assert_called_once() mock_device_client.subscribe.assert_called_once() mock_device_client.get_current_status.assert_called_once() 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 mock_device_client.disconnect.assert_called_once() @pytest.mark.freeze_time("2025-02-15 00:00:00") async def test_refresh_authentication_on_load( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_client: MagicMock, mock_device_client: MagicMock, ) -> None: """Test expired access token refreshed when needed to load config entry.""" await setup_integration(hass, mock_config_entry) assert mock_config_entry.state is ConfigEntryState.LOADED mock_client.refresh_token.assert_called_once() # Check loading continued as expected after refreshing token mock_client.get_devices.assert_called_once() mock_device_client.subscribe.assert_called_once() mock_device_client.get_current_status.assert_called_once() @pytest.mark.freeze_time("2025-03-01 00:00:00") async def test_refresh_token_error_aborts( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_client: MagicMock, ) -> None: """Test expired refresh token aborting config entry loading.""" mock_client.refresh_token.side_effect = LetPotAuthenticationException await setup_integration(hass, mock_config_entry) assert mock_config_entry.state is ConfigEntryState.SETUP_ERROR mock_client.refresh_token.assert_called_once() mock_client.get_devices.assert_not_called() @pytest.mark.parametrize( ("exception", "config_entry_state"), [ (LetPotAuthenticationException, ConfigEntryState.SETUP_ERROR), (LetPotConnectionException, ConfigEntryState.SETUP_RETRY), ], ) async def test_get_devices_exceptions( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_client: MagicMock, mock_device_client: MagicMock, exception: Exception, config_entry_state: ConfigEntryState, ) -> None: """Test config entry errors if an exception is raised when getting devices.""" mock_client.get_devices.side_effect = exception await setup_integration(hass, mock_config_entry) assert mock_config_entry.state is config_entry_state mock_client.get_devices.assert_called_once() mock_device_client.subscribe.assert_not_called()