core/tests/components/todoist/test_calendar.py

110 lines
3.2 KiB
Python

"""Unit tests for the Todoist calendar platform."""
from datetime import datetime
from typing import Any
from unittest.mock import Mock, patch
import pytest
from homeassistant import setup
from homeassistant.components.todoist.calendar import DOMAIN, _parse_due_date
from homeassistant.components.todoist.types import DueDate
from homeassistant.const import CONF_TOKEN
from homeassistant.helpers import entity_registry
from homeassistant.util import dt
def test_parse_due_date_invalid():
"""Test None is returned if the due date can't be parsed."""
data: DueDate = {
"date": "invalid",
"is_recurring": False,
"lang": "en",
"string": "",
"timezone": None,
}
assert _parse_due_date(data, timezone_offset=-8) is None
def test_parse_due_date_with_no_time_data():
"""Test due date is parsed correctly when it has no time data."""
data: DueDate = {
"date": "2022-02-02",
"is_recurring": False,
"lang": "en",
"string": "Feb 2 2:00 PM",
"timezone": None,
}
actual = _parse_due_date(data, timezone_offset=-8)
assert datetime(2022, 2, 2, 8, 0, 0, tzinfo=dt.UTC) == actual
def test_parse_due_date_without_timezone_uses_offset():
"""Test due date uses user local timezone offset when it has no timezone."""
data: DueDate = {
"date": "2022-02-02T14:00:00",
"is_recurring": False,
"lang": "en",
"string": "Feb 2 2:00 PM",
"timezone": None,
}
actual = _parse_due_date(data, timezone_offset=-8)
assert datetime(2022, 2, 2, 22, 0, 0, tzinfo=dt.UTC) == actual
@pytest.fixture(name="state")
def mock_state() -> dict[str, Any]:
"""Mock the api state."""
return {
"collaborators": [],
"labels": [{"name": "label1", "id": 1}],
"projects": [{"id": 12345, "name": "Name"}],
}
@patch("homeassistant.components.todoist.calendar.TodoistAPI")
async def test_calendar_entity_unique_id(todoist_api, hass, state):
"""Test unique id is set to project id."""
api = Mock(state=state)
todoist_api.return_value = api
assert await setup.async_setup_component(
hass,
"calendar",
{
"calendar": {
"platform": DOMAIN,
CONF_TOKEN: "token",
}
},
)
await hass.async_block_till_done()
registry = entity_registry.async_get(hass)
entity = registry.async_get("calendar.name")
assert 12345 == entity.unique_id
@patch("homeassistant.components.todoist.calendar.TodoistAPI")
async def test_calendar_custom_project_unique_id(todoist_api, hass, state):
"""Test unique id is None for any custom projects."""
api = Mock(state=state)
todoist_api.return_value = api
assert await setup.async_setup_component(
hass,
"calendar",
{
"calendar": {
"platform": DOMAIN,
CONF_TOKEN: "token",
"custom_projects": [{"name": "All projects"}],
}
},
)
await hass.async_block_till_done()
registry = entity_registry.async_get(hass)
entity = registry.async_get("calendar.all_projects")
assert entity is None
state = hass.states.get("calendar.all_projects")
assert state.state == "off"