mirror of
https://github.com/home-assistant/core.git
synced 2025-07-16 17:57:11 +00:00
Fix habitica regression (#52097)
This commit is contained in:
parent
4c7934de46
commit
db2fda09b9
@ -19,6 +19,7 @@ from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
|||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
ATTR_ARGS,
|
ATTR_ARGS,
|
||||||
|
ATTR_DATA,
|
||||||
ATTR_PATH,
|
ATTR_PATH,
|
||||||
CONF_API_USER,
|
CONF_API_USER,
|
||||||
DEFAULT_URL,
|
DEFAULT_URL,
|
||||||
@ -111,7 +112,12 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
async def handle_api_call(call):
|
async def handle_api_call(call):
|
||||||
name = call.data[ATTR_NAME]
|
name = call.data[ATTR_NAME]
|
||||||
path = call.data[ATTR_PATH]
|
path = call.data[ATTR_PATH]
|
||||||
api = hass.data[DOMAIN].get(name)
|
entries = hass.config_entries.async_entries(DOMAIN)
|
||||||
|
api = None
|
||||||
|
for entry in entries:
|
||||||
|
if entry.data[CONF_NAME] == name:
|
||||||
|
api = hass.data[DOMAIN].get(entry.entry_id)
|
||||||
|
break
|
||||||
if api is None:
|
if api is None:
|
||||||
_LOGGER.error("API_CALL: User '%s' not configured", name)
|
_LOGGER.error("API_CALL: User '%s' not configured", name)
|
||||||
return
|
return
|
||||||
@ -126,7 +132,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
kwargs = call.data.get(ATTR_ARGS, {})
|
kwargs = call.data.get(ATTR_ARGS, {})
|
||||||
data = await api(**kwargs)
|
data = await api(**kwargs)
|
||||||
hass.bus.async_fire(
|
hass.bus.async_fire(
|
||||||
EVENT_API_CALL_SUCCESS, {"name": name, "path": path, "data": data}
|
EVENT_API_CALL_SUCCESS, {ATTR_NAME: name, ATTR_PATH: path, ATTR_DATA: data}
|
||||||
)
|
)
|
||||||
|
|
||||||
data = hass.data.setdefault(DOMAIN, {})
|
data = hass.data.setdefault(DOMAIN, {})
|
||||||
|
@ -7,7 +7,11 @@ CONF_API_USER = "api_user"
|
|||||||
DEFAULT_URL = "https://habitica.com"
|
DEFAULT_URL = "https://habitica.com"
|
||||||
DOMAIN = "habitica"
|
DOMAIN = "habitica"
|
||||||
|
|
||||||
|
# service constants
|
||||||
SERVICE_API_CALL = "api_call"
|
SERVICE_API_CALL = "api_call"
|
||||||
ATTR_PATH = CONF_PATH
|
ATTR_PATH = CONF_PATH
|
||||||
ATTR_ARGS = "args"
|
ATTR_ARGS = "args"
|
||||||
|
|
||||||
|
# event constants
|
||||||
EVENT_API_CALL_SUCCESS = f"{DOMAIN}_{SERVICE_API_CALL}_success"
|
EVENT_API_CALL_SUCCESS = f"{DOMAIN}_{SERVICE_API_CALL}_success"
|
||||||
|
ATTR_DATA = "data"
|
||||||
|
@ -1,15 +1,33 @@
|
|||||||
"""Test the habitica init module."""
|
"""Test the habitica module."""
|
||||||
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components.habitica.const import (
|
from homeassistant.components.habitica.const import (
|
||||||
|
ATTR_ARGS,
|
||||||
|
ATTR_DATA,
|
||||||
|
ATTR_PATH,
|
||||||
DEFAULT_URL,
|
DEFAULT_URL,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
|
EVENT_API_CALL_SUCCESS,
|
||||||
SERVICE_API_CALL,
|
SERVICE_API_CALL,
|
||||||
)
|
)
|
||||||
|
from homeassistant.components.habitica.sensor import TASKS_TYPES
|
||||||
|
from homeassistant.const import ATTR_NAME
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry, async_capture_events
|
||||||
|
|
||||||
|
TEST_API_CALL_ARGS = {"text": "Use API from Home Assistant", "type": "todo"}
|
||||||
|
TEST_USER_NAME = "test_user"
|
||||||
|
|
||||||
|
|
||||||
async def test_entry_setup_unload(hass, aioclient_mock):
|
@pytest.fixture
|
||||||
"""Test integration setup and unload."""
|
def capture_api_call_success(hass):
|
||||||
|
"""Capture api_call events."""
|
||||||
|
return async_capture_events(hass, EVENT_API_CALL_SUCCESS)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def habitica_entry(hass):
|
||||||
|
"""Test entry for the following tests."""
|
||||||
entry = MockConfigEntry(
|
entry = MockConfigEntry(
|
||||||
domain=DOMAIN,
|
domain=DOMAIN,
|
||||||
unique_id="test-api-user",
|
unique_id="test-api-user",
|
||||||
@ -20,17 +38,96 @@ async def test_entry_setup_unload(hass, aioclient_mock):
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
entry.add_to_hass(hass)
|
entry.add_to_hass(hass)
|
||||||
|
return entry
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def common_requests(aioclient_mock):
|
||||||
|
"""Register requests for the tests."""
|
||||||
aioclient_mock.get(
|
aioclient_mock.get(
|
||||||
"https://habitica.com/api/v3/user",
|
"https://habitica.com/api/v3/user",
|
||||||
json={"data": {"api_user": "test-api-user", "profile": {"name": "test_user"}}},
|
json={
|
||||||
|
"data": {
|
||||||
|
"api_user": "test-api-user",
|
||||||
|
"profile": {"name": TEST_USER_NAME},
|
||||||
|
"stats": {
|
||||||
|
"class": "test-class",
|
||||||
|
"con": 1,
|
||||||
|
"exp": 2,
|
||||||
|
"gp": 3,
|
||||||
|
"hp": 4,
|
||||||
|
"int": 5,
|
||||||
|
"lvl": 6,
|
||||||
|
"maxHealth": 7,
|
||||||
|
"maxMP": 8,
|
||||||
|
"mp": 9,
|
||||||
|
"per": 10,
|
||||||
|
"points": 11,
|
||||||
|
"str": 12,
|
||||||
|
"toNextLevel": 13,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
for n_tasks, task_type in enumerate(TASKS_TYPES.keys(), start=1):
|
||||||
|
aioclient_mock.get(
|
||||||
|
f"https://habitica.com/api/v3/tasks/user?type={task_type}",
|
||||||
|
json={
|
||||||
|
"data": [
|
||||||
|
{"text": f"this is a mock {task_type} #{task}", "id": f"{task}"}
|
||||||
|
for task in range(n_tasks)
|
||||||
|
]
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
aioclient_mock.post(
|
||||||
|
"https://habitica.com/api/v3/tasks/user",
|
||||||
|
status=201,
|
||||||
|
json={"data": TEST_API_CALL_ARGS},
|
||||||
)
|
)
|
||||||
|
|
||||||
assert await hass.config_entries.async_setup(entry.entry_id)
|
return aioclient_mock
|
||||||
|
|
||||||
|
|
||||||
|
async def test_entry_setup_unload(hass, habitica_entry, common_requests):
|
||||||
|
"""Test integration setup and unload."""
|
||||||
|
assert await hass.config_entries.async_setup(habitica_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert hass.services.has_service(DOMAIN, SERVICE_API_CALL)
|
assert hass.services.has_service(DOMAIN, SERVICE_API_CALL)
|
||||||
|
|
||||||
assert await hass.config_entries.async_unload(entry.entry_id)
|
assert await hass.config_entries.async_unload(habitica_entry.entry_id)
|
||||||
|
|
||||||
|
assert not hass.services.has_service(DOMAIN, SERVICE_API_CALL)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_service_call(
|
||||||
|
hass, habitica_entry, common_requests, capture_api_call_success
|
||||||
|
):
|
||||||
|
"""Test integration setup, service call and unload."""
|
||||||
|
|
||||||
|
assert await hass.config_entries.async_setup(habitica_entry.entry_id)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert hass.services.has_service(DOMAIN, SERVICE_API_CALL)
|
||||||
|
|
||||||
|
assert len(capture_api_call_success) == 0
|
||||||
|
|
||||||
|
TEST_SERVICE_DATA = {
|
||||||
|
ATTR_NAME: "test_user",
|
||||||
|
ATTR_PATH: ["tasks", "user", "post"],
|
||||||
|
ATTR_ARGS: TEST_API_CALL_ARGS,
|
||||||
|
}
|
||||||
|
assert await hass.services.async_call(
|
||||||
|
DOMAIN, SERVICE_API_CALL, TEST_SERVICE_DATA, blocking=True
|
||||||
|
)
|
||||||
|
|
||||||
|
assert len(capture_api_call_success) == 1
|
||||||
|
captured_data = capture_api_call_success[0].data
|
||||||
|
captured_data[ATTR_ARGS] = captured_data[ATTR_DATA]
|
||||||
|
del captured_data[ATTR_DATA]
|
||||||
|
assert captured_data == TEST_SERVICE_DATA
|
||||||
|
|
||||||
|
assert await hass.config_entries.async_unload(habitica_entry.entry_id)
|
||||||
|
|
||||||
assert not hass.services.has_service(DOMAIN, SERVICE_API_CALL)
|
assert not hass.services.has_service(DOMAIN, SERVICE_API_CALL)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user