Fix habitica entry unload clean up (#46798)

* Fix habitica entry unload clean up

* Fix service remove

* Add entry setup and unload test

* Fix config flow tests

* Assert service
pull/46836/head
Martin Hjelmare 2021-02-20 20:59:59 +01:00 committed by GitHub
parent fe4cf611f7
commit 43a5852561
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 52 additions and 17 deletions

View File

@ -169,6 +169,6 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry):
if unload_ok: if unload_ok:
hass.data[DOMAIN].pop(entry.entry_id) hass.data[DOMAIN].pop(entry.entry_id)
if len(hass.config_entries.async_entries) == 1: if len(hass.config_entries.async_entries(DOMAIN)) == 1:
hass.components.webhook.async_unregister(SERVICE_API_CALL) hass.services.async_remove(DOMAIN, SERVICE_API_CALL)
return unload_ok return unload_ok

View File

@ -1,11 +1,10 @@
"""Test the habitica config flow.""" """Test the habitica config flow."""
from asyncio import Future
from unittest.mock import AsyncMock, MagicMock, patch from unittest.mock import AsyncMock, MagicMock, patch
from aiohttp import ClientResponseError
from homeassistant import config_entries, setup from homeassistant import config_entries, setup
from homeassistant.components.habitica.config_flow import InvalidAuth
from homeassistant.components.habitica.const import DEFAULT_URL, DOMAIN from homeassistant.components.habitica.const import DEFAULT_URL, DOMAIN
from homeassistant.const import HTTP_OK
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -19,12 +18,8 @@ async def test_form(hass):
assert result["type"] == "form" assert result["type"] == "form"
assert result["errors"] == {} assert result["errors"] == {}
request_mock = MagicMock()
type(request_mock).status_code = HTTP_OK
mock_obj = MagicMock() mock_obj = MagicMock()
mock_obj.user.get.return_value = Future() mock_obj.user.get = AsyncMock()
mock_obj.user.get.return_value.set_result(None)
with patch( with patch(
"homeassistant.components.habitica.config_flow.HabitipyAsync", "homeassistant.components.habitica.config_flow.HabitipyAsync",
@ -58,9 +53,12 @@ async def test_form_invalid_credentials(hass):
DOMAIN, context={"source": config_entries.SOURCE_USER} DOMAIN, context={"source": config_entries.SOURCE_USER}
) )
mock_obj = MagicMock()
mock_obj.user.get = AsyncMock(side_effect=ClientResponseError(MagicMock(), ()))
with patch( with patch(
"habitipy.aio.HabitipyAsync", "homeassistant.components.habitica.config_flow.HabitipyAsync",
side_effect=InvalidAuth, return_value=mock_obj,
): ):
result2 = await hass.config_entries.flow.async_configure( result2 = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
@ -81,9 +79,12 @@ async def test_form_unexpected_exception(hass):
DOMAIN, context={"source": config_entries.SOURCE_USER} DOMAIN, context={"source": config_entries.SOURCE_USER}
) )
mock_obj = MagicMock()
mock_obj.user.get = AsyncMock(side_effect=Exception)
with patch( with patch(
"homeassistant.components.habitica.config_flow.HabitipyAsync", "homeassistant.components.habitica.config_flow.HabitipyAsync",
side_effect=Exception, return_value=mock_obj,
): ):
result2 = await hass.config_entries.flow.async_configure( result2 = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
@ -98,7 +99,7 @@ async def test_form_unexpected_exception(hass):
assert result2["errors"] == {"base": "unknown"} assert result2["errors"] == {"base": "unknown"}
async def test_manual_flow_config_exist(hass, aioclient_mock): async def test_manual_flow_config_exist(hass):
"""Test config flow discovers only already configured config.""" """Test config flow discovers only already configured config."""
MockConfigEntry( MockConfigEntry(
domain=DOMAIN, domain=DOMAIN,
@ -114,9 +115,7 @@ async def test_manual_flow_config_exist(hass, aioclient_mock):
assert result["step_id"] == "user" assert result["step_id"] == "user"
mock_obj = MagicMock() mock_obj = MagicMock()
mock_obj.user.get.side_effect = AsyncMock( mock_obj.user.get = AsyncMock(return_value={"api_user": "test-api-user"})
return_value={"api_user": "test-api-user"}
)
with patch( with patch(
"homeassistant.components.habitica.config_flow.HabitipyAsync", "homeassistant.components.habitica.config_flow.HabitipyAsync",

View File

@ -0,0 +1,36 @@
"""Test the habitica init module."""
from homeassistant.components.habitica.const import (
DEFAULT_URL,
DOMAIN,
SERVICE_API_CALL,
)
from tests.common import MockConfigEntry
async def test_entry_setup_unload(hass, aioclient_mock):
"""Test integration setup and unload."""
entry = MockConfigEntry(
domain=DOMAIN,
unique_id="test-api-user",
data={
"api_user": "test-api-user",
"api_key": "test-api-key",
"url": DEFAULT_URL,
},
)
entry.add_to_hass(hass)
aioclient_mock.get(
"https://habitica.com/api/v3/user",
json={"data": {"api_user": "test-api-user", "profile": {"name": "test_user"}}},
)
assert await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert hass.services.has_service(DOMAIN, SERVICE_API_CALL)
assert await hass.config_entries.async_unload(entry.entry_id)
assert not hass.services.has_service(DOMAIN, SERVICE_API_CALL)