169 lines
5.5 KiB
Python
169 lines
5.5 KiB
Python
"""Tests for the habitica component."""
|
|
|
|
from collections.abc import Generator
|
|
from unittest.mock import AsyncMock, patch
|
|
|
|
from habiticalib import (
|
|
BadRequestError,
|
|
HabiticaCastSkillResponse,
|
|
HabiticaContentResponse,
|
|
HabiticaErrorResponse,
|
|
HabiticaGroupMembersResponse,
|
|
HabiticaLoginResponse,
|
|
HabiticaQuestResponse,
|
|
HabiticaResponse,
|
|
HabiticaScoreResponse,
|
|
HabiticaSleepResponse,
|
|
HabiticaTaskOrderResponse,
|
|
HabiticaTaskResponse,
|
|
HabiticaTasksResponse,
|
|
HabiticaUserAnonymizedResponse,
|
|
HabiticaUserResponse,
|
|
NotAuthorizedError,
|
|
NotFoundError,
|
|
TaskFilter,
|
|
TooManyRequestsError,
|
|
)
|
|
import pytest
|
|
|
|
from homeassistant.components.habitica.const import CONF_API_USER, DEFAULT_URL, DOMAIN
|
|
from homeassistant.const import CONF_API_KEY, CONF_URL
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from tests.common import MockConfigEntry, load_fixture
|
|
|
|
ERROR_RESPONSE = HabiticaErrorResponse(success=False, error="error", message="reason")
|
|
ERROR_NOT_AUTHORIZED = NotAuthorizedError(error=ERROR_RESPONSE, headers={})
|
|
ERROR_NOT_FOUND = NotFoundError(error=ERROR_RESPONSE, headers={})
|
|
ERROR_BAD_REQUEST = BadRequestError(error=ERROR_RESPONSE, headers={})
|
|
ERROR_TOO_MANY_REQUESTS = TooManyRequestsError(
|
|
error=ERROR_RESPONSE, headers={"retry-after": 5}
|
|
)
|
|
|
|
|
|
@pytest.fixture(name="config_entry")
|
|
def mock_config_entry() -> MockConfigEntry:
|
|
"""Mock Habitica configuration entry."""
|
|
return MockConfigEntry(
|
|
domain=DOMAIN,
|
|
title="test-user",
|
|
data={
|
|
CONF_URL: DEFAULT_URL,
|
|
CONF_API_USER: "a380546a-94be-4b8e-8a0b-23e0d5c03303",
|
|
CONF_API_KEY: "cd0e5985-17de-4b4f-849e-5d506c5e4382",
|
|
},
|
|
unique_id="a380546a-94be-4b8e-8a0b-23e0d5c03303",
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
async def set_tz(hass: HomeAssistant) -> None:
|
|
"""Fixture to set timezone."""
|
|
await hass.config.async_set_time_zone("Europe/Berlin")
|
|
|
|
|
|
def mock_get_tasks(task_type: TaskFilter | None = None) -> HabiticaTasksResponse:
|
|
"""Load tasks fixtures."""
|
|
|
|
if task_type is TaskFilter.COMPLETED_TODOS:
|
|
return HabiticaTasksResponse.from_json(
|
|
load_fixture("completed_todos.json", DOMAIN)
|
|
)
|
|
return HabiticaTasksResponse.from_json(load_fixture("tasks.json", DOMAIN))
|
|
|
|
|
|
@pytest.fixture(name="habitica")
|
|
async def mock_habiticalib() -> Generator[AsyncMock]:
|
|
"""Mock habiticalib."""
|
|
|
|
with (
|
|
patch(
|
|
"homeassistant.components.habitica.Habitica", autospec=True
|
|
) as mock_client,
|
|
patch(
|
|
"homeassistant.components.habitica.config_flow.Habitica", new=mock_client
|
|
),
|
|
):
|
|
client = mock_client.return_value
|
|
|
|
client.login.return_value = HabiticaLoginResponse.from_json(
|
|
load_fixture("login.json", DOMAIN)
|
|
)
|
|
|
|
client.get_user.return_value = HabiticaUserResponse.from_json(
|
|
load_fixture("user.json", DOMAIN)
|
|
)
|
|
|
|
client.cast_skill.return_value = HabiticaCastSkillResponse.from_json(
|
|
load_fixture("cast_skill_response.json", DOMAIN)
|
|
)
|
|
client.toggle_sleep.return_value = HabiticaSleepResponse(
|
|
success=True, data=True
|
|
)
|
|
client.update_score.return_value = HabiticaUserResponse.from_json(
|
|
load_fixture("score_with_drop.json", DOMAIN)
|
|
)
|
|
client.get_group_members.return_value = HabiticaGroupMembersResponse.from_json(
|
|
load_fixture("party_members.json", DOMAIN)
|
|
)
|
|
for func in (
|
|
"leave_quest",
|
|
"reject_quest",
|
|
"cancel_quest",
|
|
"abort_quest",
|
|
"start_quest",
|
|
"accept_quest",
|
|
):
|
|
getattr(client, func).return_value = HabiticaQuestResponse.from_json(
|
|
load_fixture("party_quest.json", DOMAIN)
|
|
)
|
|
client.get_content.return_value = HabiticaContentResponse.from_json(
|
|
load_fixture("content.json", DOMAIN)
|
|
)
|
|
client.get_tasks.side_effect = mock_get_tasks
|
|
client.update_score.return_value = HabiticaScoreResponse.from_json(
|
|
load_fixture("score_with_drop.json", DOMAIN)
|
|
)
|
|
client.update_task.return_value = HabiticaTaskResponse.from_json(
|
|
load_fixture("task.json", DOMAIN)
|
|
)
|
|
client.create_task.return_value = HabiticaTaskResponse.from_json(
|
|
load_fixture("task.json", DOMAIN)
|
|
)
|
|
client.delete_task.return_value = HabiticaResponse.from_dict(
|
|
{"data": {}, "success": True}
|
|
)
|
|
client.delete_completed_todos.return_value = HabiticaResponse.from_dict(
|
|
{"data": {}, "success": True}
|
|
)
|
|
client.reorder_task.return_value = HabiticaTaskOrderResponse.from_dict(
|
|
{"data": [], "success": True}
|
|
)
|
|
client.get_user_anonymized.return_value = (
|
|
HabiticaUserAnonymizedResponse.from_json(
|
|
load_fixture("anonymized.json", DOMAIN)
|
|
)
|
|
)
|
|
client.habitipy.return_value = {
|
|
"tasks": {
|
|
"user": {
|
|
"post": AsyncMock(
|
|
return_value={
|
|
"text": "Use API from Home Assistant",
|
|
"type": "todo",
|
|
}
|
|
)
|
|
}
|
|
}
|
|
}
|
|
yield client
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_setup_entry() -> Generator[AsyncMock]:
|
|
"""Override async_setup_entry."""
|
|
with patch(
|
|
"homeassistant.components.habitica.async_setup_entry", return_value=True
|
|
) as mock_setup_entry:
|
|
yield mock_setup_entry
|