Tars/tests/Core/Home/Calendar/CalendarServiceTest.php

80 lines
3.0 KiB
PHP

<?php
namespace App\Tests\Core\Home\Calendar;
use App\Core\Home\Calendar\CalendarEvent;
use App\Core\Home\Calendar\CalendarInterface;
use App\Core\Home\Calendar\CalendarService;
use PHPUnit\Framework\TestCase;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class CalendarServiceTest extends TestCase
{
private CalendarService $calendarService;
private HttpClientInterface $httpClient;
protected function setUp(): void
{
$this->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
);
}
}