mirror of
https://github.com/home-assistant/core.git
synced 2025-07-17 18:27:09 +00:00
Fix for Google Calendar API returning invalid RRULE:DATE rules (#103870)
This commit is contained in:
parent
80042aa108
commit
abb1328a67
@ -521,8 +521,13 @@ class GoogleCalendarEntity(
|
|||||||
def _get_calendar_event(event: Event) -> CalendarEvent:
|
def _get_calendar_event(event: Event) -> CalendarEvent:
|
||||||
"""Return a CalendarEvent from an API event."""
|
"""Return a CalendarEvent from an API event."""
|
||||||
rrule: str | None = None
|
rrule: str | None = None
|
||||||
if len(event.recurrence) == 1:
|
# Home Assistant expects a single RRULE: and all other rule types are unsupported or ignored
|
||||||
rrule = event.recurrence[0].lstrip(RRULE_PREFIX)
|
if (
|
||||||
|
len(event.recurrence) == 1
|
||||||
|
and (raw_rule := event.recurrence[0])
|
||||||
|
and raw_rule.startswith(RRULE_PREFIX)
|
||||||
|
):
|
||||||
|
rrule = raw_rule.removeprefix(RRULE_PREFIX)
|
||||||
return CalendarEvent(
|
return CalendarEvent(
|
||||||
uid=event.ical_uuid,
|
uid=event.ical_uuid,
|
||||||
recurrence_id=event.id if event.recurring_event_id else None,
|
recurrence_id=event.id if event.recurring_event_id else None,
|
||||||
|
@ -1299,3 +1299,51 @@ async def test_event_differs_timezone(
|
|||||||
"description": event["description"],
|
"description": event["description"],
|
||||||
"supported_features": 3,
|
"supported_features": 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def test_invalid_rrule_fix(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
hass_client: ClientSessionGenerator,
|
||||||
|
mock_events_list_items,
|
||||||
|
component_setup,
|
||||||
|
) -> None:
|
||||||
|
"""Test that an invalid RRULE returned from Google Calendar API is handled correctly end to end."""
|
||||||
|
week_from_today = dt_util.now().date() + datetime.timedelta(days=7)
|
||||||
|
end_event = week_from_today + datetime.timedelta(days=1)
|
||||||
|
event = {
|
||||||
|
**TEST_EVENT,
|
||||||
|
"start": {"date": week_from_today.isoformat()},
|
||||||
|
"end": {"date": end_event.isoformat()},
|
||||||
|
"recurrence": [
|
||||||
|
"RRULE:DATE;TZID=Europe/Warsaw:20230818T020000,20230915T020000,20231013T020000,20231110T010000,20231208T010000",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
mock_events_list_items([event])
|
||||||
|
|
||||||
|
assert await component_setup()
|
||||||
|
|
||||||
|
state = hass.states.get(TEST_ENTITY)
|
||||||
|
assert state.name == TEST_ENTITY_NAME
|
||||||
|
assert state.state == STATE_OFF
|
||||||
|
|
||||||
|
# Pick a date range that contains two instances of the event
|
||||||
|
web_client = await hass_client()
|
||||||
|
response = await web_client.get(
|
||||||
|
get_events_url(TEST_ENTITY, "2023-08-10T00:00:00Z", "2023-09-20T00:00:00Z")
|
||||||
|
)
|
||||||
|
assert response.status == HTTPStatus.OK
|
||||||
|
events = await response.json()
|
||||||
|
|
||||||
|
# Both instances are returned, however the RDATE rule is ignored by Home
|
||||||
|
# Assistant so they are just treateded as flattened events.
|
||||||
|
assert len(events) == 2
|
||||||
|
|
||||||
|
event = events[0]
|
||||||
|
assert event["uid"] == "cydrevtfuybguinhomj@google.com"
|
||||||
|
assert event["recurrence_id"] == "_c8rinwq863h45qnucyoi43ny8_20230818"
|
||||||
|
assert event["rrule"] is None
|
||||||
|
|
||||||
|
event = events[1]
|
||||||
|
assert event["uid"] == "cydrevtfuybguinhomj@google.com"
|
||||||
|
assert event["recurrence_id"] == "_c8rinwq863h45qnucyoi43ny8_20230915"
|
||||||
|
assert event["rrule"] is None
|
||||||
|
Loading…
x
Reference in New Issue
Block a user