diff --git a/.coveragerc b/.coveragerc index 64d9c8e9b76..c0425c1bb81 100644 --- a/.coveragerc +++ b/.coveragerc @@ -29,10 +29,8 @@ omit = homeassistant/components/ads/* homeassistant/components/aemet/weather_update_coordinator.py homeassistant/components/aftership/* - homeassistant/components/agent_dvr/__init__.py homeassistant/components/agent_dvr/alarm_control_panel.py homeassistant/components/agent_dvr/camera.py - homeassistant/components/agent_dvr/const.py homeassistant/components/agent_dvr/helpers.py homeassistant/components/airnow/__init__.py homeassistant/components/airnow/sensor.py diff --git a/homeassistant/components/agent_dvr/config_flow.py b/homeassistant/components/agent_dvr/config_flow.py index a21e6855337..7dd3c7d5bc3 100644 --- a/homeassistant/components/agent_dvr/config_flow.py +++ b/homeassistant/components/agent_dvr/config_flow.py @@ -33,9 +33,7 @@ class AgentFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): try: await agent_client.update() - except AgentConnectionError: - pass - except AgentError: + except (AgentConnectionError, AgentError): pass await agent_client.close() diff --git a/tests/components/agent_dvr/__init__.py b/tests/components/agent_dvr/__init__.py index ec35b521a17..3f2fc82101a 100644 --- a/tests/components/agent_dvr/__init__.py +++ b/tests/components/agent_dvr/__init__.py @@ -7,6 +7,23 @@ from homeassistant.core import HomeAssistant from tests.common import MockConfigEntry, load_fixture from tests.test_util.aiohttp import AiohttpClientMocker +CONF_DATA = { + CONF_HOST: "example.local", + CONF_PORT: 8090, + SERVER_URL: "http://example.local:8090/", +} + + +def create_entry(hass: HomeAssistant): + """Add config entry in Home Assistant.""" + entry = MockConfigEntry( + domain=DOMAIN, + unique_id="c0715bba-c2d0-48ef-9e3e-bc81c9ea4447", + data=CONF_DATA, + ) + entry.add_to_hass(hass) + return entry + async def init_integration( hass: HomeAssistant, @@ -25,17 +42,7 @@ async def init_integration( text=load_fixture("agent_dvr/objects.json"), headers={"Content-Type": CONTENT_TYPE_JSON}, ) - entry = MockConfigEntry( - domain=DOMAIN, - unique_id="c0715bba-c2d0-48ef-9e3e-bc81c9ea4447", - data={ - CONF_HOST: "example.local", - CONF_PORT: 8090, - SERVER_URL: "http://example.local:8090/", - }, - ) - - entry.add_to_hass(hass) + entry = create_entry(hass) if not skip_setup: await hass.config_entries.async_setup(entry.entry_id) diff --git a/tests/components/agent_dvr/test_config_flow.py b/tests/components/agent_dvr/test_config_flow.py index 3e11aae054a..01cb31b3f19 100644 --- a/tests/components/agent_dvr/test_config_flow.py +++ b/tests/components/agent_dvr/test_config_flow.py @@ -38,7 +38,9 @@ async def test_user_device_exists_abort( assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT -async def test_connection_error(hass: HomeAssistant, aioclient_mock) -> None: +async def test_connection_error( + hass: HomeAssistant, aioclient_mock: AiohttpClientMocker +) -> None: """Test we show user form on Agent connection error.""" aioclient_mock.get("http://example.local:8090/command.cgi?cmd=getStatus", text="") @@ -49,13 +51,13 @@ async def test_connection_error(hass: HomeAssistant, aioclient_mock) -> None: data={CONF_HOST: "example.local", CONF_PORT: 8090}, ) - assert result["errors"] == {"base": "cannot_connect"} + assert result["errors"]["base"] == "cannot_connect" assert result["step_id"] == "user" assert result["type"] == data_entry_flow.RESULT_TYPE_FORM async def test_full_user_flow_implementation( - hass: HomeAssistant, aioclient_mock + hass: HomeAssistant, aioclient_mock: AiohttpClientMocker ) -> None: """Test the full manual user flow from start to finish.""" aioclient_mock.get( diff --git a/tests/components/agent_dvr/test_init.py b/tests/components/agent_dvr/test_init.py new file mode 100644 index 00000000000..27b3652a446 --- /dev/null +++ b/tests/components/agent_dvr/test_init.py @@ -0,0 +1,56 @@ +"""Test Agent DVR integration.""" +from unittest.mock import AsyncMock, patch + +from agent import AgentError + +from homeassistant.components.agent_dvr.const import DOMAIN +from homeassistant.config_entries import ConfigEntryState +from homeassistant.core import HomeAssistant + +from . import CONF_DATA, create_entry + +from tests.components.agent_dvr import init_integration +from tests.test_util.aiohttp import AiohttpClientMocker + + +async def _create_mocked_agent(available: bool = True): + mocked_agent = AsyncMock() + mocked_agent.is_available = available + return mocked_agent + + +def _patch_init_agent(mocked_agent): + return patch( + "homeassistant.components.agent_dvr.Agent", + return_value=mocked_agent, + ) + + +async def test_setup_config_and_unload( + hass: HomeAssistant, aioclient_mock: AiohttpClientMocker +): + """Test setup and unload.""" + entry = await init_integration(hass, aioclient_mock) + assert entry.state == ConfigEntryState.LOADED + assert len(hass.config_entries.async_entries(DOMAIN)) == 1 + assert entry.data == CONF_DATA + + assert await hass.config_entries.async_unload(entry.entry_id) + await hass.async_block_till_done() + + assert entry.state is ConfigEntryState.NOT_LOADED + assert not hass.data.get(DOMAIN) + + +async def test_async_setup_entry_not_ready(hass: HomeAssistant): + """Test that it throws ConfigEntryNotReady when exception occurs during setup.""" + entry = create_entry(hass) + with patch( + "homeassistant.components.agent_dvr.Agent.update", + side_effect=AgentError, + ): + await hass.config_entries.async_setup(entry.entry_id) + assert entry.state == ConfigEntryState.SETUP_RETRY + with _patch_init_agent(await _create_mocked_agent(available=False)): + await hass.config_entries.async_reload(entry.entry_id) + assert entry.state == ConfigEntryState.SETUP_RETRY