parse(<<<'ICS' BEGIN:VCALENDAR VERSION:2.0 BEGIN:VEVENT UID:event-test SUMMARY:test DTSTART;TZID=Europe/Paris:20260613T100000 DTEND;TZID=Europe/Paris:20260613T110000 ORGANIZER;CN=Alex Martin:mailto:alex@example.test ATTENDEE;CN=Marie Durand:mailto:marie@example.test BEGIN:VALARM ACTION:DISPLAY TRIGGER:-PT1H DESCRIPTION:Rappel END:VALARM BEGIN:VALARM ACTION:EMAIL TRIGGER:-PT2H DESCRIPTION:Rappel email END:VALARM END:VEVENT END:VCALENDAR ICS); $this->assertCount(1, $events); $this->assertSame('event-test', $events[0]->uid); $this->assertSame('test', $events[0]->summary); $this->assertSame([ ['email' => 'alex@example.test', 'name' => 'Alex Martin'], ['email' => 'marie@example.test', 'name' => 'Marie Durand'], ], $events[0]->attendees); $this->assertSame('DISPLAY', $events[0]->alarms[0]->action); $this->assertSame(-60, $events[0]->alarms[0]->triggerMinutes); $this->assertSame('EMAIL', $events[0]->alarms[1]->action); } public function test_it_parses_an_attendee_invited_through_a_circle(): void { $events = (new ICalendarParser)->parse(<<<'ICS' BEGIN:VCALENDAR VERSION:2.0 BEGIN:VEVENT UID:circle-event SUMMARY:Circle test DTSTART;TZID=Europe/Paris:20260918T000000 DTEND;TZID=Europe/Paris:20260918T003000 ORGANIZER;CN=Camille Test:mailto:camille@example.test ATTENDEE;CN=EquipeTest;CUTYPE=GROUP:mailto:circle+team@example.test ATTENDEE;CN="Martin; Alex";CUTYPE=INDIVIDUAL;MEMBER="mailto:circle+team@example.test";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.1:mailto:alex@example.test END:VEVENT END:VCALENDAR ICS); $this->assertCount(1, $events); $this->assertSame([ ['email' => 'camille@example.test', 'name' => 'Camille Test'], ['email' => 'circle+team@example.test', 'name' => 'EquipeTest'], ['email' => 'alex@example.test', 'name' => 'Martin; Alex'], ], $events[0]->attendees); } }