3 * Tine 2.0 - http://www.tine20.org
6 * @license http://www.gnu.org/licenses/agpl.html
7 * @copyright Copyright (c) 2011-2015 Metaways Infosystems GmbH (http://www.metaways.de)
8 * @author Lars Kneschke <l.kneschke@metaways.de>
12 * Test class for Calendar_Convert_Event_VCalendar_MacOSX
14 class Calendar_Convert_Event_VCalendar_MacOSXTest extends Calendar_TestCase
17 * @var array test objects
19 protected $objects = array();
22 * testBackslashInDescription
24 * @see 0009176: iCal adds another backslash to description field
26 public function testBackslashInDescription()
28 $event = new Calendar_Model_Event(array(
29 'summary' => 'CalDAV test',
30 'dtstart' => Tinebase_DateTime::now(),
31 'dtend' => Tinebase_DateTime::now()->addHour(1),
32 'description' => 'lalala \\\\',
33 'originator_tz' => 'Europe/Berlin',
34 'creation_time' => Tinebase_DateTime::now(),
35 'uid' => Tinebase_Record_Abstract::generateUID(),
39 $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_MACOSX);
40 $vevent = $converter->fromTine20Model($event)->serialize();
42 $convertedEvent = $converter->toTine20Model($vevent);
44 $this->assertEquals($event->description, $convertedEvent->description);
48 * test converting vcard from apple iCal to Calendar_Model_Event
50 public function testConvertToTine20Model()
52 $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/apple_caldendar_mavericks_organizer_only.ics', 'r');
54 $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_MACOSX, '10.9');
56 $event = $converter->toTine20Model($vcalendarStream);
58 // assert testuser is not attendee
59 $this->assertEquals(1, $event->attendee->count(), 'there sould only be one attendee');
60 $this->assertNotEquals($event->organizer, $event->attendee[0]->user_id, 'organizer should not attend');
63 $this->assertEquals(1, $event->alarms->count(), 'there should be exactly one alarm');
64 $this->assertFalse((bool)$event->alarms->getFirstRecord()->getOption('custom'), 'alarm should be duration alarm');
65 $this->assertEquals(15, $event->alarms->getFirstRecord()->minutes_before, 'alarm should be 15 min. before');
66 $this->assertEquals('2013-11-15 11:47:23', Calendar_Controller_Alarm::getAcknowledgeTime($event->alarms->getFirstRecord())->format(Tinebase_Record_Abstract::ISO8601LONG), 'ACKNOWLEDGED was not imported properly');
69 public function testConvertToTine20ModelXCalendarAccess()
71 $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_MACOSX, '10.10.2');
73 $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/apple_calendar_lion_access_private.ics', 'r');
74 $event = $converter->toTine20Model($vcalendarStream);
75 $this->assertEquals(Calendar_Model_Event::CLASS_PRIVATE, $event->class);
77 $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/apple_calendar_lion_access_attendee.ics', 'r');
78 $event = $converter->toTine20Model($vcalendarStream);
79 $this->assertEquals(Calendar_Model_Event::CLASS_PUBLIC, $event->class);
81 $iosPrivateIcs = dirname(__FILE__) . '/../../../Import/files/ios_private.ics';
82 $vcalendarStream = fopen($iosPrivateIcs, 'r');
83 $event = $converter->toTine20Model($vcalendarStream);
84 $this->assertEquals(Calendar_Model_Event::CLASS_PRIVATE, $event->class);
86 // try again with ios user agent
87 $iosUserAgent = 'iOS/8.2 (12D508) dataaccessd/1.0';
88 list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($iosUserAgent);
89 $converter = Calendar_Convert_Event_VCalendar_Factory::factory($backend, $version);
90 $vcalendarStream = fopen($iosPrivateIcs, 'r');
91 $event = $converter->toTine20Model($vcalendarStream);
92 $this->assertEquals(Calendar_Model_Event::CLASS_PRIVATE, $event->class);
96 * testConvertAllDayEventWithExdate
98 * - exdate is the base event
100 public function testConvertAllDayEventWithExdate()
102 $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_MACOSX, '10.10.2');
104 $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/apple_calendar_birthday.ics', 'r');
105 $updateEvent = $converter->toTine20Model($vcalendarStream);
106 $eventWithExdateOnBaseEvent = Calendar_Controller_MSEventFacade::getInstance()->create($updateEvent);
108 $this->assertEquals(1, count($eventWithExdateOnBaseEvent->exdate));
110 // refetch existing event here and pass it to converter
111 $eventWithExdateOnBaseEvent = Calendar_Controller_Event::getInstance()->get($eventWithExdateOnBaseEvent->getId());
113 $vcalendarStream2 = fopen(dirname(__FILE__) . '/../../../Import/files/apple_calendar_birthday2.ics', 'r');
114 $updateEvent2 = $converter->toTine20Model($vcalendarStream2, $eventWithExdateOnBaseEvent);
116 $this->assertEquals(1, count($updateEvent2->exdate), print_r($updateEvent2->toArray(), true));
117 $this->assertEquals('2015-04-27 22:00:00', $updateEvent2->rrule_until);
120 public function testConvertToTine20ModelYosemite()
122 $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_MACOSX, '10.10.4');
124 $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/apple_calendar_yosemite_attendee.ics', 'r');
125 $event = $converter->toTine20Model($vcalendarStream);
127 $this->assertCount(2, $event->attendee, 'CHAIR should be skipped, Attendee should be recognised');
130 public function testConvertToTine20ModelYosemiteRecurringAllDayWithUntil()
132 $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_MACOSX, '10.10.5');
134 $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/apple_calendar_10.10_birthday02-PUT-quit-old.ics', 'r');
135 $event = $converter->toTine20Model($vcalendarStream);
137 $this->assertEquals('FREQ=YEARLY;INTERVAL=1;UNTIL=2016-09-17 22:00:00', $event->rrule);
140 public function testConvertToTine20ModelYosemite()
142 $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_MACOSX, '10.10.4');
144 $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/apple_calendar_yosemite_attendee.ics', 'r');
145 $event = $converter->toTine20Model($vcalendarStream);
147 $this->assertCount(2, $event->attendee, 'CHAIR should be skipped, Attendee should be recognised');