easyappointments/vendor/jsvrcek/ics/tests/CalendarExportTest.php

433 lines
17 KiB
PHP
Executable File

<?php
namespace Jsvrcek\ICS\Tests;
use Jsvrcek\ICS\Model\CalendarAlarm;
use Jsvrcek\ICS\Model\Description\Conference;
use Jsvrcek\ICS\Model\Recurrence\DataType\Weekday;
use Jsvrcek\ICS\Model\Recurrence\DataType\WeekdayNum;
use Jsvrcek\ICS\Model\Recurrence\DataType\Frequency;
use Jsvrcek\ICS\Model\Recurrence\RecurrenceRule;
use Jsvrcek\ICS\Model\Relationship\Organizer;
use Jsvrcek\ICS\Utility\Formatter;
use Jsvrcek\ICS\CalendarStream;
use Jsvrcek\ICS\Model\Relationship\Attendee;
use Jsvrcek\ICS\CalendarExport;
use Jsvrcek\ICS\Model\Calendar;
use Jsvrcek\ICS\Model\CalendarEvent;
use PHPUnit\Framework\TestCase;
class CalendarExportTest extends TestCase
{
/**
* @covers Jsvrcek\ICS\CalendarExport::getStream
*/
public function testGetStream()
{
$timezone = new \DateTimeZone('Antarctica/McMurdo');
$organizer = new Organizer(new Formatter());
$organizer->setValue('sue@example.com')
->setName('Sue Jones')
->setSentBy('mary@example.com')
->setLanguage('en');
$attendee = new Attendee(new Formatter());
$attendee->setName('Jane Smith')
->setCalendarUserType('INDIVIDUAL')
->setParticipationStatus('ACCEPTED')
->setRole('REQ-PARTICIPANT')
->setSentBy('joe@example')
->addCalendarMember('list@example.com')
->setValue('jane-smith@example.com');
$conference1 = new Conference('tel:+1-412-555-0123,,,654321');
$conference2 = new Conference(
'https://chat.example.com/audio?id=123456',
[
'feature' => ['AUDIO', 'VIDEO'],
'label' => 'Attendee dial-in'
]
);
$conference3 = new Conference(
'xmpp:chat-123@conference.example.com',
[
'feature' => 'CHAT',
'label' => 'Chat Room',
'language' => 'en:Germany'
]
);
$conferenceDetails = [
$conference1,
$conference2
];
$event = new CalendarEvent();
$event->setUid('lLKjd89283oja89282lkjd8@example.com')
->setStart(new \DateTime('4 October 2013 12:00:00', $timezone))
->setEnd(new \DateTime('4 October 2013 22:00:00', $timezone))
->setSummary('Poker night at the South Pole')
->addAttendee($attendee)
->setOrganizer($organizer)
->setSequence(3)
->setTransp('TRANSPARENT')
->setColor('red')
->setTimestamp(new \DateTime('1 September 2013', $timezone))
->setConferences($conferenceDetails)
->addConference($conference3);
$rrule = new RecurrenceRule(new Formatter());
$rrule->setFrequency(new Frequency(Frequency::MONTHLY))
->setInterval(2)
->setCount(40)
->addByDay(new WeekdayNum(Weekday::SATURDAY, 1))
->addByDay(new WeekdayNum(Weekday::SATURDAY, 2))
->addByDay(new WeekdayNum(Weekday::SATURDAY, 3))
->addByDay(new WeekdayNum(Weekday::SATURDAY, 4))
->addByDay(new WeekdayNum(Weekday::FRIDAY, 1));
$event->setRecurrenceRule($rrule);
//add an alarms to this event
$alarmAudio = new CalendarAlarm();
$alarmAudio->setAction("audio");
$alarmAudio->setTrigger($event->getStart());
$alarmAudio->addAttachment("FMTTYPE=audio/basic:ftp://example.com/pub/sounds/bell-01.aud");
$event->addAlarm($alarmAudio);
$alarmDisplay = new CalendarAlarm();
$alarmDisplay->setAction("display");
$alarmDisplay->setTrigger($event->getStart());
$alarmDisplay->setRepeat(3);
$alarmDisplay->setDuration(new \DateInterval('PT15M'));
$alarmDisplay->setDescription("DESCRIPTION");
$event->addAlarm($alarmDisplay);
$alarmEmail = new CalendarAlarm();
$alarmEmail->setAction('email');
$alarmEmail->setTrigger($event->getStart());
$alarmEmail->addAttendee($attendee);
$alarmEmail->setSummary("EMAIL SUBJECT");
$alarmEmail->setDescription("EMAIL BODY");
$alarmEmail->addAttachment("FMTTYPE=application/msword:http://example.com/agenda.docx");
$alarmEmail->addAttachment("FMTTYPE=application/pdf:http://example.com/agenda.pdf");
$event->addAlarm($alarmEmail);
//test exception dates
$eventTwo = new CalendarEvent();
$eventTwo->setUid('eventtwo@example.com')
->setStart(new \DateTime('2 October 2013', $timezone))
->setSummary('Every Wednesday event')
->addCustomProperty('FOO', 'bar')
->addCustomProperty('BAR', 'baz')
->setTimestamp(new \DateTime('1 September 2013', $timezone));
$rrule = new RecurrenceRule(new Formatter());
$rrule->setFrequency(new Frequency(Frequency::WEEKLY));
$eventTwo->setRecurrenceRule($rrule);
//add exception dates to the event recurrence
$eventTwo->addExceptionDate(new \DateTime('16 October 2013', $timezone))
->addExceptionDate(new \DateTime('30 October 2013', $timezone));
$cal = new Calendar();
$cal->setProdId('-//Jsvrcek//ICS//EN')
->setTimezone($timezone)
->addEvent($event)
->addEvent($eventTwo);
//create second calendar using batch event provider
$timezone = new \DateTimeZone('Arctic/Longyearbyen');
$calTwo = new Calendar();
$calTwo->setProdId('-//Jsvrcek//ICS//EN2')
->setColor('green')
->setTimezone($timezone);
$calTwo->setEventsProvider(function ($start) use ($timezone) {
$eventOne = new CalendarEvent();
$eventOne->setUid('asdfasdf@example.com')
->setStart(new \DateTime('2016-01-01 01:01:01', $timezone))
->setEnd(new \DateTime('2016-01-02 01:01:01', $timezone))
->setSummary('A long day')
->setTimestamp(new \DateTime('1 September 2013', $timezone));
$eventTwo = new CalendarEvent();
$eventTwo->setUid('asdfasdf@example.com')
->setStart(new \DateTime('2016-01-02 01:01:01', $timezone))
->setEnd(new \DateTime('2016-01-03 01:01:01', $timezone))
->setSummary('Another long day')
->setTimestamp(new \DateTime('1 September 2013', $timezone));
return ($start > 0) ? array() : array($eventOne, $eventTwo);
});
$ce = new CalendarExport(new CalendarStream(), new Formatter());
$ce->addCalendar($cal)
->addCalendar($calTwo);
$stream = $ce->getStream();
$expected = file_get_contents(__DIR__ . '/test-local.ics');
$this->assertEquals($expected, $stream);
}
public function testGetStreamUTC()
{
$timezone = new \DateTimeZone('Antarctica/McMurdo');
$organizer = new Organizer(new Formatter());
$organizer->setValue('sue@example.com')
->setName('Sue Jones')
->setSentBy('mary@example.com')
->setLanguage('en');
$attendee = new Attendee(new Formatter());
$attendee->setName('Jane Smith')
->setCalendarUserType('INDIVIDUAL')
->setParticipationStatus('ACCEPTED')
->setRole('REQ-PARTICIPANT')
->setSentBy('joe@example')
->addCalendarMember('list@example.com')
->setValue('jane-smith@example.com');
$event = new CalendarEvent();
$event->setUid('lLKjd89283oja89282lkjd8@example.com')
->setStart(new \DateTime('4 October 2013 12:00:00', $timezone))
->setEnd(new \DateTime('4 October 2013 22:00:00', $timezone))
->setSummary('Poker night at the South Pole')
->setStatus('CONFIRMED')
->addAttendee($attendee)
->setOrganizer($organizer)
->setSequence(3)
->setTransp('TRANSPARENT')
->setTimestamp(new \DateTime('1 September 2013', $timezone));
$rrule = new RecurrenceRule(new Formatter());
$rrule->setFrequency(new Frequency(Frequency::MONTHLY))
->setInterval(2)
->setCount(40)
->addByDay(new WeekdayNum(Weekday::SATURDAY, 1))
->addByDay(new WeekdayNum(Weekday::SATURDAY, 2))
->addByDay(new WeekdayNum(Weekday::SATURDAY, 3))
->addByDay(new WeekdayNum(Weekday::SATURDAY, 4))
->addByDay(new WeekdayNum(Weekday::FRIDAY, 1));
$event->setRecurrenceRule($rrule);
//add an alarms to this event
$alarmAudio = new CalendarAlarm();
$alarmAudio->setAction("audio");
$alarmAudio->setTrigger($event->getStart());
$alarmAudio->addAttachment("FMTTYPE=audio/basic:ftp://example.com/pub/sounds/bell-01.aud");
$event->addAlarm($alarmAudio);
$alarmDisplay = new CalendarAlarm();
$alarmDisplay->setAction("display");
$alarmDisplay->setTrigger($event->getStart());
$alarmDisplay->setRepeat(3);
$alarmDisplay->setDuration(new \DateInterval('PT15M'));
$alarmDisplay->setDescription("DESCRIPTION");
$event->addAlarm($alarmDisplay);
$alarmEmail = new CalendarAlarm();
$alarmEmail->setAction('email');
$alarmEmail->setTrigger($event->getStart());
$alarmEmail->addAttendee($attendee);
$alarmEmail->setSummary("EMAIL SUBJECT");
$alarmEmail->setDescription("EMAIL BODY");
$alarmEmail->addAttachment("FMTTYPE=application/msword:http://example.com/agenda.docx");
$alarmEmail->addAttachment("FMTTYPE=application/pdf:http://example.com/agenda.pdf");
$event->addAlarm($alarmEmail);
//test exception dates
$eventTwo = new CalendarEvent();
$eventTwo->setUid('eventtwo@example.com')
->setStart(new \DateTime('2 October 2013', $timezone))
->setSummary('Every Wednesday event')
->setTimestamp(new \DateTime('1 September 2013', $timezone));
$rrule = new RecurrenceRule(new Formatter());
$rrule->setFrequency(new Frequency(Frequency::WEEKLY));
$eventTwo->setRecurrenceRule($rrule);
//add exception dates to the event recurrence
$eventTwo->addExceptionDate(new \DateTime('16 October 2013', $timezone))
->addExceptionDate(new \DateTime('30 October 2013', $timezone));
$cal = new Calendar();
$cal->setProdId('-//Jsvrcek//ICS//EN')
->setTimezone($timezone)
->addEvent($event)
->addEvent($eventTwo);
//create second calendar using batch event provider
$timezone = new \DateTimeZone('Arctic/Longyearbyen');
$calTwo = new Calendar();
$calTwo->setProdId('-//Jsvrcek//ICS//EN2')
->setTimezone($timezone);
$calTwo->setEventsProvider(function ($start) use ($timezone) {
$eventOne = new CalendarEvent();
$eventOne->setUid('asdfasdf@example.com')
->setStart(new \DateTime('2016-01-01 01:01:01', $timezone))
->setEnd(new \DateTime('2016-01-02 01:01:01', $timezone))
->setSummary('A long day')
->setTimestamp(new \DateTime('1 September 2013', $timezone));
$eventTwo = new CalendarEvent();
$eventTwo->setUid('asdfasdf@example.com')
->setStart(new \DateTime('2016-01-02 01:01:01', $timezone))
->setEnd(new \DateTime('2016-01-03 01:01:01', $timezone))
->setSummary('Another long day')
->setTimestamp(new \DateTime('1 September 2013', $timezone));
return ($start > 0) ? array() : array($eventOne, $eventTwo);
});
$ce = new CalendarExport(new CalendarStream(), new Formatter());
$ce->addCalendar($cal)
->addCalendar($calTwo)
->setDateTimeFormat('utc');
$stream = $ce->getStream();
$expected = file_get_contents(__DIR__ . '/test-utc.ics');
$this->assertEquals($expected, $stream);
}
public function testGetStreamTZAndLocal()
{
$timezone = new \DateTimeZone('Antarctica/McMurdo');
$organizer = new Organizer(new Formatter());
$organizer->setValue('sue@example.com')
->setName('Sue Jones')
->setSentBy('mary@example.com')
->setLanguage('en');
$attendee = new Attendee(new Formatter());
$attendee->setName('Jane Smith')
->setCalendarUserType('INDIVIDUAL')
->setParticipationStatus('ACCEPTED')
->setRole('REQ-PARTICIPANT')
->setSentBy('joe@example')
->addCalendarMember('list@example.com')
->setValue('jane-smith@example.com');
$event = new CalendarEvent();
$event->setUid('lLKjd89283oja89282lkjd8@example.com')
->setStart(new \DateTime('4 October 2013 12:00:00', $timezone))
->setEnd(new \DateTime('4 October 2013 22:00:00', $timezone))
->setSummary('Poker night at the South Pole')
->addAttendee($attendee)
->setOrganizer($organizer)
->setSequence(3)
->setTransp('TRANSPARENT')
->setTimestamp(new \DateTime('1 September 2013', $timezone));
$rrule = new RecurrenceRule(new Formatter());
$rrule->setFrequency(new Frequency(Frequency::MONTHLY))
->setInterval(2)
->setCount(40)
->addByDay(new WeekdayNum(Weekday::SATURDAY, 1))
->addByDay(new WeekdayNum(Weekday::SATURDAY, 2))
->addByDay(new WeekdayNum(Weekday::SATURDAY, 3))
->addByDay(new WeekdayNum(Weekday::SATURDAY, 4))
->addByDay(new WeekdayNum(Weekday::FRIDAY, 1));
$event->setRecurrenceRule($rrule);
//add an alarms to this event
$alarmAudio = new CalendarAlarm();
$alarmAudio->setAction("audio");
$alarmAudio->setTrigger($event->getStart());
$alarmAudio->addAttachment("FMTTYPE=audio/basic:ftp://example.com/pub/sounds/bell-01.aud");
$event->addAlarm($alarmAudio);
$alarmDisplay = new CalendarAlarm();
$alarmDisplay->setAction("display");
$alarmDisplay->setTrigger($event->getStart());
$alarmDisplay->setRepeat(3);
$alarmDisplay->setDuration(new \DateInterval('PT15M'));
$alarmDisplay->setDescription("DESCRIPTION");
$event->addAlarm($alarmDisplay);
$alarmEmail = new CalendarAlarm();
$alarmEmail->setAction('email');
$alarmEmail->setTrigger($event->getStart());
$alarmEmail->addAttendee($attendee);
$alarmEmail->setSummary("EMAIL SUBJECT");
$alarmEmail->setDescription("EMAIL BODY");
$alarmEmail->addAttachment("FMTTYPE=application/msword:http://example.com/agenda.docx");
$alarmEmail->addAttachment("FMTTYPE=application/pdf:http://example.com/agenda.pdf");
$event->addAlarm($alarmEmail);
//test exception dates
$eventTwo = new CalendarEvent();
$eventTwo->setUid('eventtwo@example.com')
->setStart(new \DateTime('2 October 2013', $timezone))
->setSummary('Every Wednesday event')
->setTimestamp(new \DateTime('1 September 2013', $timezone));
$rrule = new RecurrenceRule(new Formatter());
$rrule->setFrequency(new Frequency(Frequency::WEEKLY));
$eventTwo->setRecurrenceRule($rrule);
//add exception dates to the event recurrence
$eventTwo->addExceptionDate(new \DateTime('16 October 2013', $timezone))
->addExceptionDate(new \DateTime('30 October 2013', $timezone));
$cal = new Calendar();
$cal->setProdId('-//Jsvrcek//ICS//EN')
->setTimezone($timezone)
->addEvent($event)
->addEvent($eventTwo);
//create second calendar using batch event provider
$timezone = new \DateTimeZone('Arctic/Longyearbyen');
$calTwo = new Calendar();
$calTwo->setProdId('-//Jsvrcek//ICS//EN2')
->setTimezone($timezone);
$calTwo->setEventsProvider(function ($start) use ($timezone) {
$eventOne = new CalendarEvent();
$eventOne->setUid('asdfasdf@example.com')
->setStart(new \DateTime('2016-01-01 01:01:01', $timezone))
->setEnd(new \DateTime('2016-01-02 01:01:01', $timezone))
->setSummary('A long day')
->setTimestamp(new \DateTime('1 September 2013', $timezone));
$eventTwo = new CalendarEvent();
$eventTwo->setUid('asdfasdf@example.com')
->setStart(new \DateTime('2016-01-02 01:01:01', $timezone))
->setEnd(new \DateTime('2016-01-03 01:01:01', $timezone))
->setSummary('Another long day')
->setTimestamp(new \DateTime('1 September 2013', $timezone));
return ($start > 0) ? array() : array($eventOne, $eventTwo);
});
$ce = new CalendarExport(new CalendarStream(), new Formatter());
$ce->addCalendar($cal)
->addCalendar($calTwo)
->setDateTimeFormat('local-tz');
$stream = $ce->getStream();
$expected = file_get_contents(__DIR__ . '/test-local-tz.ics');
$this->assertEquals($expected, $stream);
}
}