$syncrotonEvent = new Syncroton_Model_Event($xml->Collections->Collection->Commands->Change[0]->ApplicationData);
$serverId = $controller->createEntry($syncrotonFolder->serverId, $syncrotonEvent);
-
+
$syncrotonEvent = $controller->getEntry(new Syncroton_Model_SyncCollection(array('collectionId' => $syncrotonFolder->serverId)), $serverId);
$this->assertEquals(0, $syncrotonEvent->allDayEvent, 'alldayEvent');
$this->assertNotEmpty($syncrotonEvent->attendees, 'Events attendees not found in default calendar');
}
- public function testUpdateEntriesIPhone()
+ public function testUpdateEntriesIPhone($syncrotonFolder = null)
{
- // create event
- $syncrotonFolder = $this->testCreateFolder();
- $syncrotonFolder2 = $this->testCreateFolder();
-
- //make $syncrotonFolder2 the default
- Tinebase_Core::getPreference('Calendar')->setValue(Calendar_Preference::DEFAULTCALENDAR, $syncrotonFolder2->serverId);
-
+ // ensure folder is default
+ $syncrotonFolder = $syncrotonFolder ? $syncrotonFolder : $this->testCreateFolder();
+ Tinebase_Core::getPreference('Calendar')->setValue(Calendar_Preference::DEFAULTCALENDAR, $syncrotonFolder->serverId);
+
+ // create event with external attendee in default calendar
+ $xml = new SimpleXMLElement(file_get_contents(__DIR__ . '/files/event_with_attendee.xml'));
+ $syncrotonEvent = new Syncroton_Model_Event($xml->Collections->Collection->Commands->Change[0]->ApplicationData);
$controller = Syncroton_Data_Factory::factory($this->_class, $this->_getDevice(Syncroton_Model_Device::TYPE_IPHONE), Tinebase_DateTime::now());
- list($serverId, $syncrotonEvent) = $this->testCreateEntry($syncrotonFolder);
+ $serverId = $controller->createEntry($syncrotonFolder->serverId, $syncrotonEvent);
- // update event
+ // assert external attendee is present
$syncrotonEventtoUpdate = $controller->getEntry(new Syncroton_Model_SyncCollection(array('collectionId' => $syncrotonFolder->serverId)), $serverId);
+ $this->assertEquals(2, count($syncrotonEventtoUpdate->attendees), 'event: ' . var_export($syncrotonEventtoUpdate->attendees, TRUE));
+
+ // update event in non default folder
$syncrotonEventtoUpdate->exceptions[0]->subject = 'update';
$syncrotonEventtoUpdate->exceptions[0]->startTime->addHour(1);
$syncrotonEventtoUpdate->exceptions[0]->endTime->addHour(1);
-
$syncTimestamp = Calendar_Controller_Event::getInstance()->get($serverId)->last_modified_time;
$controller = Syncroton_Data_Factory::factory($this->_class, $this->_getDevice(Syncroton_Model_Device::TYPE_IPHONE), $syncTimestamp);
$serverId = $controller->updateEntry($syncrotonFolder->serverId, $serverId, $syncrotonEventtoUpdate);
- // assert update
+ // assert update in default folder
$updatedSyncrotonEvent = $controller->getEntry(new Syncroton_Model_SyncCollection(array('collectionId' => $syncrotonFolder->serverId)), $serverId);
$this->assertEquals('update', $updatedSyncrotonEvent->exceptions[0]->subject);
- $this->assertNotEquals($syncrotonEvent->exceptions[0]->startTime->toString(), $updatedSyncrotonEvent->exceptions[0]->startTime->toString());
- $this->assertEquals($syncrotonEventtoUpdate->exceptions[0]->startTime->toString(), $updatedSyncrotonEvent->exceptions[0]->startTime->toString());
+ $this->assertEquals('2012-11-25 15:00:00', $updatedSyncrotonEvent->exceptions[0]->startTime->toString());
+ $this->assertEquals(2, count($updatedSyncrotonEvent->attendees), 'event: ' . var_export($updatedSyncrotonEvent->attendees, TRUE));
- // assert attendee are preserved
- $updatedEvent = Calendar_Controller_MSEventFacade::getInstance()->get($serverId);
- $this->assertNotEmpty($updatedEvent, 'attendee must be preserved during update');
+ return array($serverId, $updatedSyncrotonEvent);
}
/**
*/
public function testUpdateEntriesIPhoneNonDefaultFolder()
{
- // create event in folder1
+ // create event in default folder
$syncrotonFolder = $this->testCreateFolder();
- $controller = Syncroton_Data_Factory::factory($this->_class, $this->_getDevice(Syncroton_Model_Device::TYPE_IPHONE), Tinebase_DateTime::now());
- list($serverId, $syncrotonEvent) = $this->testCreateEntry($syncrotonFolder);
+ list($serverId, $syncrotonEvent) = $this->testUpdateEntriesIPhone($syncrotonFolder);
// create new default folder2
$syncrotonFolder2 = $this->testCreateFolder();
Tinebase_Core::getPreference('Calendar')->setValue(Calendar_Preference::DEFAULTCALENDAR, $syncrotonFolder2->serverId);
- // load event in non default folder2
+ // load event in non default folder
+ $controller = Syncroton_Data_Factory::factory($this->_class, $this->_getDevice(Syncroton_Model_Device::TYPE_IPHONE), Tinebase_DateTime::now());
$syncrotonEventtoUpdate = $controller->getEntry(new Syncroton_Model_SyncCollection(array('collectionId' => $syncrotonFolder->serverId)), $serverId);
$this->assertEmpty($syncrotonEventtoUpdate->attendees, 'attendee in non default folders must be removed for ios');
// update event in non default folder
- $syncrotonEventtoUpdate->exceptions[0]->subject = 'update';
+ $syncrotonEventtoUpdate->exceptions[0]->subject = 'update2';
$syncrotonEventtoUpdate->exceptions[0]->startTime->addHour(1);
$syncrotonEventtoUpdate->exceptions[0]->endTime->addHour(1);
$controller = Syncroton_Data_Factory::factory($this->_class, $this->_getDevice(Syncroton_Model_Device::TYPE_IPHONE), $syncTimestamp);
$serverId = $controller->updateEntry($syncrotonFolder->serverId, $serverId, $syncrotonEventtoUpdate);
- // assert update from non default folder
+ // assert update from default folder
$updatedSyncrotonEvent = $controller->getEntry(new Syncroton_Model_SyncCollection(array('collectionId' => $syncrotonFolder2->serverId)), $serverId);
- $this->assertEquals('update', $updatedSyncrotonEvent->exceptions[0]->subject);
+ $this->assertEquals('update2', $updatedSyncrotonEvent->exceptions[0]->subject);
$this->assertNotEquals($syncrotonEvent->exceptions[0]->startTime->toString(), $updatedSyncrotonEvent->exceptions[0]->startTime->toString());
$this->assertEquals($syncrotonEventtoUpdate->exceptions[0]->startTime->toString(), $updatedSyncrotonEvent->exceptions[0]->startTime->toString());
+ $this->assertEquals(2, count($updatedSyncrotonEvent->attendees), 'event: ' . var_export($updatedSyncrotonEvent->attendees, TRUE));
+ }
+
+ public function testCreateUpdateGroupEvents()
+ {
+ $syncrotonFolder = $this->testCreateFolder();
+ Tinebase_Core::getPreference('Calendar')->setValue(Calendar_Preference::DEFAULTCALENDAR, $syncrotonFolder->serverId);
+
+ $defaultUserGroup = Tinebase_Group::getInstance()->getDefaultGroup();
+ $defaultUserGroupMembers = Tinebase_Group::getInstance()->getGroupMembers($defaultUserGroup->getId());
+
+ // create event with default user group (without explicit groupmembers)
+ $xml = new SimpleXMLElement(str_replace(array(
+ 'usersgroupid',
+ ), $defaultUserGroup->getId(), file_get_contents(__DIR__ . '/files/event_with_group_attendee.xml')));
+ $syncrotonEvent = new Syncroton_Model_Event($xml->Collections->Collection->Commands->Change[0]->ApplicationData);
+ $controller = Syncroton_Data_Factory::factory($this->_class, $this->_getDevice(Syncroton_Model_Device::TYPE_IPHONE), Tinebase_DateTime::now());
+ $serverId = $controller->createEntry($syncrotonFolder->serverId, $syncrotonEvent);
+
+ // assert created group & groupmembers
+ $syncrotonEventtoUpdate = $controller->getEntry(new Syncroton_Model_SyncCollection(array('collectionId' => $syncrotonFolder->serverId)), $serverId);
+ $this->assertCount(count($defaultUserGroupMembers) + 1, $syncrotonEventtoUpdate->attendees, 'groupmembers not resolved');
+ $this->assertCount(count($defaultUserGroupMembers) + 1, $syncrotonEventtoUpdate->exceptions[0]->attendees, 'groupmembers not resolved');
+
+ // update event
+ $syncrotonEventtoUpdate->exceptions[0]->subject = 'update';
+ $syncTimestamp = Calendar_Controller_Event::getInstance()->get($serverId)->last_modified_time;
+ $controller = Syncroton_Data_Factory::factory($this->_class, $this->_getDevice(Syncroton_Model_Device::TYPE_IPHONE), $syncTimestamp);
+ $serverId = $controller->updateEntry($syncrotonFolder->serverId, $serverId, $syncrotonEventtoUpdate);
- // assert attendee are preserved
- $this->assertNotEmpty($updatedSyncrotonEvent->attendees, 'attendee must be preserved during update');
+ // assert updated group & groupmembers
+ $updatedSyncrotonEvent = $controller->getEntry(new Syncroton_Model_SyncCollection(array('collectionId' => $syncrotonFolder->serverId)), $serverId);
+ $this->assertCount(count($defaultUserGroupMembers) + 1, $updatedSyncrotonEvent->attendees, 'groupmembers not resolved');
+ $this->assertCount(count($defaultUserGroupMembers) + 1, $updatedSyncrotonEvent->exceptions[0]->attendees, 'groupmembers not resolved');
}
}
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?><!DOCTYPE AirSync PUBLIC "-//AIRSYNC//DTD AirSync//EN" "http://www.microsoft.com/">
+<Sync xmlns="uri:AirSync" xmlns:Calendar="uri:Calendar">
+ <Collections>
+ <Collection>
+ <Class>Calendar</Class>
+ <SyncKey>9</SyncKey>
+ <CollectionId>41</CollectionId>
+ <DeletesAsMoves/>
+ <GetChanges/>
+ <WindowSize>50</WindowSize>
+ <Options><FilterType>5</FilterType></Options>
+ <Commands>
+ <Change>
+ <ServerId>6de7cb687964dc6eea109cd81750177979362217</ServerId>
+ <ApplicationData>
+ <Calendar:Timezone>xP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAFAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAFAAIAAAAAAAAAxP///w==</Calendar:Timezone>
+ <Calendar:AllDayEvent>0</Calendar:AllDayEvent>
+ <Calendar:BusyStatus>2</Calendar:BusyStatus>
+ <Calendar:DtStamp>20121125T150537Z</Calendar:DtStamp>
+ <Calendar:EndTime>20121123T160000Z</Calendar:EndTime>
+ <Calendar:Sensitivity>2</Calendar:Sensitivity>
+ <Calendar:Subject>Repeat</Calendar:Subject>
+ <Calendar:StartTime>20121123T130000Z</Calendar:StartTime>
+ <Calendar:UID>6de7cb687964dc6eea109cd81750177979362217</Calendar:UID>
+ <Calendar:MeetingStatus>1</Calendar:MeetingStatus>
+ <Calendar:Attendees>
+ <Calendar:Attendee>
+ <Calendar:Name>Users</Calendar:Name>
+ <Calendar:Email>usersgroupid</Calendar:Email>
+ </Calendar:Attendee>
+ </Calendar:Attendees>
+ <Calendar:Recurrence>
+ <Calendar:Type>0</Calendar:Type><Calendar:Interval>1</Calendar:Interval><Calendar:Until>20121128T225959Z</Calendar:Until>
+ </Calendar:Recurrence>
+ <Calendar:Exceptions>
+ <Calendar:Exception>
+ <Calendar:Deleted>0</Calendar:Deleted>
+ <Calendar:ExceptionStartTime>20121125T130000Z</Calendar:ExceptionStartTime>
+ <Calendar:StartTime>20121125T140000Z</Calendar:StartTime>
+ <Calendar:EndTime>20121125T170000Z</Calendar:EndTime>
+ <Calendar:Subject>Repeat mal anders</Calendar:Subject>
+ <Calendar:BusyStatus>2</Calendar:BusyStatus>
+ <Calendar:AllDayEvent>0</Calendar:AllDayEvent>
+ <Calendar:Attendees>
+ <Calendar:Attendee>
+ <Calendar:Name>Users</Calendar:Name>
+ <Calendar:Email>usersgroupid</Calendar:Email>
+ </Calendar:Attendee>
+ </Calendar:Attendees>
+ </Calendar:Exception>
+ <Calendar:Exception>
+ <Calendar:Deleted>1</Calendar:Deleted><Calendar:ExceptionStartTime>20121124T130000Z</Calendar:ExceptionStartTime></Calendar:Exception>
+ </Calendar:Exceptions>
+ <Calendar:Reminder>15</Calendar:Reminder>
+ <Body xmlns="uri:AirSyncBase"><Type>1</Type><Data>Hello</Data></Body>
+ </ApplicationData>
+ </Change>
+ </Commands>
+ </Collection>
+ </Collections>
+</Sync>
\ No newline at end of file
*
* @return \Sabre\DAV\INode[]
*/
- function getChildren()
+ public function getChildren()
{
$children = array();
if ($this->_hasPersonalFolders) {
$children[] = $this->getChild(
- $this->_useIdAsName ? Tinebase_Core::getUser()->contact_id : $this->_useLoginAsFolderName() ? Tinebase_Core::getUser()->accountLoginName : Tinebase_Core::getUser()->accountDisplayName
+ $this->_useIdAsName ?
+ Tinebase_Core::getUser()->contact_id :
+ ($this->_useLoginAsFolderName() ?
+ Tinebase_Core::getUser()->accountLoginName :
+ Tinebase_Core::getUser()->accountDisplayName)
);
$otherUsers = Tinebase_Container::getInstance()->getOtherUsers(Tinebase_Core::getUser(), $this->_getApplicationName(), array(
foreach ($otherUsers as $user) {
if ($user->contact_id && $user->visibility === Tinebase_Model_User::VISIBILITY_DISPLAYED) {
try {
- $folderId = $this->_useIdAsName ? $user->contact_id : $this->_useLoginAsFolderName() ? $user->accountLoginName : $user->accountDisplayName;
+ $folderId = $this->_useIdAsName ?
+ $user->contact_id :
+ ($this->_useLoginAsFolderName() ? $user->accountLoginName : $user->accountDisplayName);
$children[] = $this->getChild($folderId);
} catch (\Sabre\DAV\Exception\NotFound $sdavenf) {
$user = $this->_getUser(Tinebase_Helper::array_value(1, $this->_getPathParts()));
$contact = Addressbook_Controller_Contact::getInstance()->get($user->contact_id);
} catch (Tinebase_Exception_NotFound $tenf) {
- continue;
+ continue 2;
}
$response[$property] = $contact->n_fileas;
protected function _getUser($_id)
{
- $classCacheId = ($this->_useIdAsName ? 'contact_id' : $this->_useLoginAsFolderName() ? 'accountLoginName' : 'accountDisplayName') . $_id;
+ $classCacheId = ($this->_useIdAsName ? 'contact_id' : ($this->_useLoginAsFolderName() ? 'accountLoginName' : 'accountDisplayName')) . $_id;
if (isset(self::$_classCache[__FUNCTION__][$classCacheId])) {
return self::$_classCache[__FUNCTION__][$classCacheId];