httpClient = $this->createMock(HttpClientInterface::class); $this->calendarService = new CalendarService($this->httpClient); } public function testGetEventsFromMultipleCalendars(): void { // Create mock calendar providers $calendar1 = $this->createMock(CalendarInterface::class); $calendar1->method('getName')->willReturn('Calendar 1'); $calendar1->method('getEvents')->willReturn([ $this->createEvent('Event 1', '2023-01-01 10:00', '2023-01-01 11:00', 'Calendar 1'), $this->createEvent('Event 2', '2023-01-02 15:00', '2023-01-02 16:00', 'Calendar 1'), ]); $calendar2 = $this->createMock(CalendarInterface::class); $calendar2->method('getName')->willReturn('Calendar 2'); $calendar2->method('getEvents')->willReturn([ $this->createEvent('Event 3', '2023-01-01 12:00', '2023-01-01 13:00', 'Calendar 2'), $this->createEvent('Event 4', '2023-01-03 09:00', '2023-01-03 10:00', 'Calendar 2'), ]); // Add calendar providers to service $this->calendarService->addCalendar($calendar1); $this->calendarService->addCalendar($calendar2); // Test getting all events $from = new DateTime('2023-01-01'); $to = new DateTime('2023-01-03'); $events = $this->calendarService->getEvents($from, $to); // Assertions $this->assertCount(4, $events); // Check if events are sorted by start date $this->assertEquals('Event 1', $events[0]->getTitle()); $this->assertEquals('Event 3', $events[1]->getTitle()); $this->assertEquals('Event 2', $events[2]->getTitle()); $this->assertEquals('Event 4', $events[3]->getTitle()); // Test getting events grouped by calendar $groupedEvents = $this->calendarService->getEventsGroupedByCalendar($from, $to); $this->assertCount(2, $groupedEvents); $this->assertArrayHasKey('Calendar 1', $groupedEvents); $this->assertArrayHasKey('Calendar 2', $groupedEvents); $this->assertCount(2, $groupedEvents['Calendar 1']); $this->assertCount(2, $groupedEvents['Calendar 2']); } private function createEvent(string $title, string $start, string $end, string $calendarName): CalendarEvent { return new CalendarEvent( md5($title.$start), $title, new DateTime($start), new DateTime($end), 'Description', 'Location', $calendarName, ); } }