88 lines
3.0 KiB
PHP
88 lines
3.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
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 DateTime;
|
|
|
|
use function md5;
|
|
|
|
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,
|
|
);
|
|
}
|
|
}
|