1<?php 2 3namespace Sabre\VObject\Splitter; 4 5use Sabre\VObject; 6 7class ICalendarTest extends \PHPUnit_Framework_TestCase { 8 9 protected $version; 10 11 function setUp() { 12 $this->version = VObject\Version::VERSION; 13 } 14 15 function createStream($data) { 16 17 $stream = fopen('php://memory', 'r+'); 18 fwrite($stream, $data); 19 rewind($stream); 20 return $stream; 21 22 } 23 24 function testICalendarImportValidEvent() { 25 26 $data = <<<EOT 27BEGIN:VCALENDAR 28BEGIN:VEVENT 29UID:foo 30DTSTAMP:20140122T233226Z 31DTSTART:20140101T070000Z 32END:VEVENT 33END:VCALENDAR 34EOT; 35 $tempFile = $this->createStream($data); 36 37 $objects = new ICalendar($tempFile); 38 39 $return = ""; 40 while ($object = $objects->getNext()) { 41 $return .= $object->serialize(); 42 } 43 $this->assertEquals([], VObject\Reader::read($return)->validate()); 44 } 45 46 /** 47 * @expectedException Sabre\VObject\ParseException 48 */ 49 function testICalendarImportWrongType() { 50 51 $data = <<<EOT 52BEGIN:VCARD 53UID:foo1 54END:VCARD 55BEGIN:VCARD 56UID:foo2 57END:VCARD 58EOT; 59 $tempFile = $this->createStream($data); 60 61 $objects = new ICalendar($tempFile); 62 63 } 64 65 function testICalendarImportEndOfData() { 66 $data = <<<EOT 67BEGIN:VCALENDAR 68BEGIN:VEVENT 69UID:foo 70DTSTAMP:20140122T233226Z 71END:VEVENT 72END:VCALENDAR 73EOT; 74 $tempFile = $this->createStream($data); 75 76 $objects = new ICalendar($tempFile); 77 78 $return = ""; 79 while ($object = $objects->getNext()) { 80 $return .= $object->serialize(); 81 } 82 $this->assertNull($object = $objects->getNext()); 83 } 84 85 /** 86 * @expectedException Sabre\VObject\ParseException 87 */ 88 function testICalendarImportInvalidEvent() { 89 $data = <<<EOT 90EOT; 91 $tempFile = $this->createStream($data); 92 $objects = new ICalendar($tempFile); 93 94 } 95 96 function testICalendarImportMultipleValidEvents() { 97 98 $event[] = <<<EOT 99BEGIN:VEVENT 100UID:foo1 101DTSTAMP:20140122T233226Z 102DTSTART:20140101T050000Z 103END:VEVENT 104EOT; 105 106$event[] = <<<EOT 107BEGIN:VEVENT 108UID:foo2 109DTSTAMP:20140122T233226Z 110DTSTART:20140101T060000Z 111END:VEVENT 112EOT; 113 114 $data = <<<EOT 115BEGIN:VCALENDAR 116$event[0] 117$event[1] 118END:VCALENDAR 119 120EOT; 121 $tempFile = $this->createStream($data); 122 123 $objects = new ICalendar($tempFile); 124 125 $return = ""; 126 $i = 0; 127 while ($object = $objects->getNext()) { 128 129 $expected = <<<EOT 130BEGIN:VCALENDAR 131VERSION:2.0 132PRODID:-//Sabre//Sabre VObject $this->version//EN 133CALSCALE:GREGORIAN 134$event[$i] 135END:VCALENDAR 136 137EOT; 138 139 $return .= $object->serialize(); 140 $expected = str_replace("\n", "\r\n", $expected); 141 $this->assertEquals($expected, $object->serialize()); 142 $i++; 143 } 144 $this->assertEquals([], VObject\Reader::read($return)->validate()); 145 } 146 147 function testICalendarImportEventWithoutUID() { 148 149 $data = <<<EOT 150BEGIN:VCALENDAR 151VERSION:2.0 152PRODID:-//Sabre//Sabre VObject $this->version//EN 153CALSCALE:GREGORIAN 154BEGIN:VEVENT 155DTSTART:20140101T040000Z 156DTSTAMP:20140122T233226Z 157END:VEVENT 158END:VCALENDAR 159 160EOT; 161 $tempFile = $this->createStream($data); 162 163 $objects = new ICalendar($tempFile); 164 165 $return = ""; 166 while ($object = $objects->getNext()) { 167 $return .= $object->serialize(); 168 } 169 170 $messages = VObject\Reader::read($return)->validate(); 171 172 if ($messages) { 173 $messages = array_map( 174 function($item) { return $item['message']; }, 175 $messages 176 ); 177 $this->fail('Validation errors: ' . implode("\n", $messages)); 178 } else { 179 $this->assertEquals([], $messages); 180 } 181 } 182 183 function testICalendarImportMultipleVTIMEZONESAndMultipleValidEvents() { 184 185 $timezones = <<<EOT 186BEGIN:VTIMEZONE 187TZID:Europe/Berlin 188BEGIN:DAYLIGHT 189TZOFFSETFROM:+0100 190RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU 191DTSTART:19810329T020000 192TZNAME:MESZ 193TZOFFSETTO:+0200 194END:DAYLIGHT 195BEGIN:STANDARD 196TZOFFSETFROM:+0200 197RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU 198DTSTART:19961027T030000 199TZNAME:MEZ 200TZOFFSETTO:+0100 201END:STANDARD 202END:VTIMEZONE 203BEGIN:VTIMEZONE 204TZID:Europe/London 205BEGIN:DAYLIGHT 206TZOFFSETFROM:+0000 207RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU 208DTSTART:19810329T010000 209TZNAME:GMT+01:00 210TZOFFSETTO:+0100 211END:DAYLIGHT 212BEGIN:STANDARD 213TZOFFSETFROM:+0100 214RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU 215DTSTART:19961027T020000 216TZNAME:GMT 217TZOFFSETTO:+0000 218END:STANDARD 219END:VTIMEZONE 220EOT; 221 222 $event[] = <<<EOT 223BEGIN:VEVENT 224UID:foo1 225DTSTAMP:20140122T232710Z 226DTSTART:20140101T010000Z 227END:VEVENT 228EOT; 229 230 $event[] = <<<EOT 231BEGIN:VEVENT 232UID:foo2 233DTSTAMP:20140122T232710Z 234DTSTART:20140101T020000Z 235END:VEVENT 236EOT; 237 238 $event[] = <<<EOT 239BEGIN:VEVENT 240UID:foo3 241DTSTAMP:20140122T232710Z 242DTSTART:20140101T030000Z 243END:VEVENT 244EOT; 245 246 $data = <<<EOT 247BEGIN:VCALENDAR 248$timezones 249$event[0] 250$event[1] 251$event[2] 252END:VCALENDAR 253 254EOT; 255 $tempFile = $this->createStream($data); 256 257 $objects = new ICalendar($tempFile); 258 259 $return = ""; 260 $i = 0; 261 while ($object = $objects->getNext()) { 262 263 $expected = <<<EOT 264BEGIN:VCALENDAR 265VERSION:2.0 266PRODID:-//Sabre//Sabre VObject $this->version//EN 267CALSCALE:GREGORIAN 268$timezones 269$event[$i] 270END:VCALENDAR 271 272EOT; 273 $expected = str_replace("\n", "\r\n", $expected); 274 275 $this->assertEquals($expected, $object->serialize()); 276 $return .= $object->serialize(); 277 $i++; 278 279 } 280 281 $this->assertEquals([], VObject\Reader::read($return)->validate()); 282 } 283 284 function testICalendarImportWithOutVTIMEZONES() { 285 286 $data = <<<EOT 287BEGIN:VCALENDAR 288VERSION:2.0 289PRODID:-//Apple Inc.//Mac OS X 10.8//EN 290CALSCALE:GREGORIAN 291BEGIN:VEVENT 292CREATED:20120605T072109Z 293UID:D6716295-C10F-4B20-82F9-E1A3026C7DCF 294DTEND;VALUE=DATE:20120717 295TRANSP:TRANSPARENT 296SUMMARY:Start Vorbereitung 297DTSTART;VALUE=DATE:20120716 298DTSTAMP:20120605T072115Z 299SEQUENCE:2 300BEGIN:VALARM 301X-WR-ALARMUID:A99EDA6A-35EB-4446-B8BC-CDA3C60C627D 302UID:A99EDA6A-35EB-4446-B8BC-CDA3C60C627D 303TRIGGER:-PT15H 304X-APPLE-DEFAULT-ALARM:TRUE 305ATTACH;VALUE=URI:Basso 306ACTION:AUDIO 307END:VALARM 308END:VEVENT 309END:VCALENDAR 310 311EOT; 312 $tempFile = $this->createStream($data); 313 314 $objects = new ICalendar($tempFile); 315 316 $return = ""; 317 while ($object = $objects->getNext()) { 318 $return .= $object->serialize(); 319 } 320 321 $messages = VObject\Reader::read($return)->validate(); 322 $this->assertEquals([], $messages); 323 } 324 325} 326