3 * Tine 2.0 - http://www.tine20.org
6 * @license http://www.gnu.org/licenses/agpl.html
7 * @copyright Copyright (c) 2011-2013 Metaways Infosystems GmbH (http://www.metaways.de)
8 * @author Lars Kneschke <l.kneschke@metaways.de>
14 require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestHelper.php';
17 * Test class for Calendar_Frontend_WebDAV_Container
19 class Calendar_Frontend_WebDAV_ContainerTest extends PHPUnit_Framework_TestCase
22 * @var array test objects
24 protected $objects = array();
27 * Runs the test methods of this class.
32 public static function main()
34 $suite = new PHPUnit_Framework_TestSuite('Tine 2.0 Calendar WebDAV Container Tests');
35 PHPUnit_TextUI_TestRunner::run($suite);
39 * Sets up the fixture.
40 * This method is called before a test is executed.
44 protected function setUp()
46 Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb());
48 $this->objects['initialContainer'] = Tinebase_Container::getInstance()->addContainer(new Tinebase_Model_Container(array(
49 'name' => Tinebase_Record_Abstract::generateUID(),
50 'type' => Tinebase_Model_Container::TYPE_PERSONAL,
52 'application_id' => Tinebase_Application::getInstance()->getApplicationByName('Calendar')->getId(),
55 Tinebase_Container::getInstance()->addGrants($this->objects['initialContainer'], Tinebase_Acl_Rights::ACCOUNT_TYPE_GROUP, Tinebase_Core::getUser()->accountPrimaryGroup, array(Tinebase_Model_Grants::GRANT_READ));
58 $_SERVER['HTTP_USER_AGENT'] = 'CalendarStore/5.0 (1127); iCal/5.0 (1535); Mac OS X/10.7.1 (11B26)';
60 // must be defined for Calendar/Frontend/WebDAV/Event.php
61 $_SERVER['REQUEST_URI'] = 'foobar';
65 * Tears down the fixture
66 * This method is called after a test is executed.
70 protected function tearDown()
72 Tinebase_TransactionManager::getInstance()->rollBack();
73 Calendar_Config::getInstance()->set(Calendar_Config::SKIP_DOUBLE_EVENTS, '');
77 * assert that name of folder is container name
79 public function testGetName()
81 $container = new Calendar_Frontend_WebDAV_Container($this->objects['initialContainer']);
83 $result = $container->getName();
85 $this->assertEquals($this->objects['initialContainer']->name, $result);
88 public function testGetOwner()
90 $container = new Calendar_Frontend_WebDAV_Container($this->objects['initialContainer']);
92 $result = $container->getOwner();
94 $this->assertEquals('principals/users/' . Tinebase_Core::getUser()->contact_id, $result);
97 public function testGetACL()
99 $container = new Calendar_Frontend_WebDAV_Container($this->objects['initialContainer']);
101 $result = $container->getACL();
105 $this->assertEquals(6, count($result));
108 public function testGetIdAsName()
110 $container = new Calendar_Frontend_WebDAV_Container($this->objects['initialContainer'], true);
112 $result = $container->getName();
114 $this->assertEquals($this->objects['initialContainer']->getId(), $result);
120 public function testGetProperties()
122 $this->testCreateFile();
124 $requestedProperties = array(
125 '{http://calendarserver.org/ns/}getctag',
129 $container = new Calendar_Frontend_WebDAV_Container($this->objects['initialContainer']);
131 $result = $container->getProperties($requestedProperties);
133 $this->assertTrue(! empty($result['{http://calendarserver.org/ns/}getctag']));
134 $this->assertEquals($result['{DAV:}resource-id'], 'urn:uuid:' . $this->objects['initialContainer']->getId());
138 * test updateProperties of calendar folder
140 public function testUpdateProperties()
142 $this->testCreateFile();
145 '{http://apple.com/ns/ical/}calendar-color' => '#123456FF',
146 '{DAV:}displayname' => 'testUpdateProperties',
147 '{http://calendarserver.org/ns/}invalidProperty' => null
150 $container = new Calendar_Frontend_WebDAV_Container($this->objects['initialContainer']);
152 $result = $container->updateProperties($mutations);
154 $updatedContainer = Tinebase_Container::getInstance()->get($this->objects['initialContainer']);
156 $this->assertEquals($result[200]["{http://apple.com/ns/ical/}calendar-color"], null);
157 $this->assertEquals($result[200]["{DAV:}displayname"], null);
158 $this->assertEquals($result[403]["{http://calendarserver.org/ns/}invalidProperty"], null);
159 $this->assertEquals($updatedContainer->color, substr($mutations['{http://apple.com/ns/ical/}calendar-color'], 0, 7));
160 $this->assertEquals($updatedContainer->name, $mutations['{DAV:}displayname']);
166 * @return Calendar_Frontend_WebDAV_Event
168 public function testCreateFile()
170 $vcalendarStream = $this->_getVCalendar(dirname(__FILE__) . '/../../Import/files/lightning.ics');
172 $container = new Calendar_Frontend_WebDAV_Container($this->objects['initialContainer']);
174 $id = Tinebase_Record_Abstract::generateUID();
176 $etag = $container->createFile("$id.ics", $vcalendarStream);
177 $event = new Calendar_Frontend_WebDAV_Event($this->objects['initialContainer'], "$id.ics");
178 $record = $event->getRecord();
180 $this->assertTrue($event instanceof Calendar_Frontend_WebDAV_Event);
181 $this->assertEquals($id, $record->getId(), 'ID mismatch');
190 public function testGetChildren($skipAssertions = true)
192 $event = $this->testCreateFile()->getRecord();
194 // reschedule to match period filter
195 $event->dtstart = Tinebase_DateTime::now();
196 $event->dtend = Tinebase_DateTime::now()->addMinute(30);
197 Calendar_Controller_MSEventFacade::getInstance()->update($event);
199 $container = new Calendar_Frontend_WebDAV_Container($this->objects['initialContainer']);
201 $children = $container->getChildren();
203 if (! $skipAssertions) {
204 $this->assertEquals(1, count($children));
205 $this->assertTrue($children[$event->getId()] instanceof Calendar_Frontend_WebDAV_Event);
211 public function testGetChildrenSkipDoubleEvents()
213 Calendar_Config::getInstance()->set(Calendar_Config::SKIP_DOUBLE_EVENTS, 'personal');
214 $children = $this->testGetChildren(true);
215 $this->assertEquals(0, count($children));
217 Calendar_Config::getInstance()->set(Calendar_Config::SKIP_DOUBLE_EVENTS, 'shared');
218 $children = $this->testGetChildren(true);
219 $this->assertEquals(2, count($children));
223 * test calendarQuery with start and end time set
225 * @param boolean $timeRangeEndSet
226 * @param boolean $removeOwnAttender
228 public function testCalendarQuery($timeRangeEndSet = true, $removeOwnAttender = false)
230 $event = $this->testCreateFile()->getRecord();
232 // reschedule to match period filter
233 $event->dtstart = Tinebase_DateTime::now();
234 $event->dtend = Tinebase_DateTime::now()->addMinute(30);
235 if ($removeOwnAttender) {
236 $event->attendee = new Tinebase_Record_RecordSet('Calendar_Model_Attender', array(
238 'user_id' => Tinebase_User::getInstance()->getUserByLoginName('sclever')->contact_id,
239 'user_type' => Calendar_Model_Attender::USERTYPE_USER,
240 'role' => Calendar_Model_Attender::ROLE_REQUIRED,
244 Calendar_Controller_MSEventFacade::getInstance()->update($event);
246 $container = new Calendar_Frontend_WebDAV_Container($this->objects['initialContainer']);
248 $timeRange = $timeRangeEndSet ? array(
249 'start' => Tinebase_DateTime::now()->subHour(1),
250 'end' => Tinebase_DateTime::now()->addHour(1)
252 'start' => Tinebase_DateTime::now()->subHour(1),
255 $urls = $container->calendarQuery(array(
256 'name' => 'VCALENDAR',
257 'comp-filters' => array(
260 'comp-filters' => array(),
261 'prop-filters' => array(),
262 'is-not-defined' => false,
263 'time-range' => $timeRange,
266 'prop-filters' => array(),
267 'is-not-defined' => false,
271 $this->assertContains($event->getId(), $urls);
275 * test calendarQuery with start time set only
277 public function testCalendarQueryNoEnd()
279 $this->testCalendarQuery(false);
283 * testCalendarQueryNotAttender
285 * @see 0009204: "Foreign" events won't sync/show up via CalDAV.
287 public function testCalendarQueryNotAttender()
289 $this->testCalendarQuery(true, true);
293 * test calendarQuery with start and end time set
295 * @param boolean $timeRangeEndSet
296 * @param boolean $removeOwnAttender
298 public function testCalendarQueryPropertyFilter()
300 $event1 = $this->testCreateFile()->getRecord();
301 $event2 = $this->testCreateFile()->getRecord();
303 // reschedule to match period filter
304 $event1->dtstart = Tinebase_DateTime::now();
305 $event1->dtend = Tinebase_DateTime::now()->addMinute(30);
306 Calendar_Controller_MSEventFacade::getInstance()->update($event1);
308 $event2->dtstart = Tinebase_DateTime::now();
309 $event2->dtend = Tinebase_DateTime::now()->addMinute(30);
310 Calendar_Controller_MSEventFacade::getInstance()->update($event2);
312 $container = new Calendar_Frontend_WebDAV_Container($this->objects['initialContainer']);
314 $urls = $container->calendarQuery(array(
315 'name' => 'VCALENDAR',
316 'comp-filters' => array(
319 'prop-filters' => array(
322 'text-match' => array(
323 'value' => $event1->getId()
328 'text-match' => array(
329 'value' => $event2->getId()
335 'prop-filters' => array(),
336 'is-not-defined' => false,
340 $this->assertContains($event1->getId(), $urls);
341 $this->assertContains($event2->getId(), $urls);
342 $this->assertEquals(2, count($urls));
345 * test Tinebase_WebDav_Container_Abstract::getCalendarVTimezone
347 public function testGetCalendarVTimezone()
349 $vTimezone = Tinebase_WebDav_Container_Abstract::getCalendarVTimezone('Calendar');
350 $this->assertContains('PRODID:-//tine20.org//Tine 2.0 Calendar', $vTimezone);
352 $vTimezone = Tinebase_WebDav_Container_Abstract::getCalendarVTimezone(Tinebase_Application::getInstance()->getApplicationByName('Calendar'));
353 $this->assertContains('PRODID:-//tine20.org//Tine 2.0 Calendar', $vTimezone);
357 * test Calendar_Frontend_WebDAV_Container::getShares
359 public function testGetShares()
361 $container = new Calendar_Frontend_WebDAV_Container($this->objects['initialContainer']);
363 $shares = $container->getShares();
365 $this->assertEquals(3, count($shares));
366 $this->assertEquals('urn:uuid:anyone', $shares[0]['href']);
367 $this->assertEquals('urn:uuid:' . Tinebase_Core::getUser()->contact_id, $shares[2]['href']);
371 * test Calendar_Frontend_WebDAV_Container::getShares for container user has no admin grant for
373 public function testGetSharesWithoutRights()
375 $jmcblack = Tinebase_Helper::array_value('jmcblack', Zend_Registry::get('personas'));
376 $jmcblacksCalId = Tinebase_Core::getPreference('Calendar')->getValueForUser(Calendar_Preference::DEFAULTCALENDAR, $jmcblack->getId());
377 $jmcblacksCal = Tinebase_Container::getInstance()->get($jmcblacksCalId);
379 $container = new Calendar_Frontend_WebDAV_Container($jmcblacksCal);
381 $shares = $container->getShares();
383 $this->assertEquals(1, count($shares));
384 $this->assertTrue((bool)$shares[0]['readOnly']);
388 * return vcalendar as string and replace organizers email address with emailaddess of current user
390 * @param string $_filename file to open
393 protected function _getVCalendar($_filename)
395 $vcalendar = file_get_contents($_filename);
397 $vcalendar = preg_replace('/l.kneschke@metaway\n s.de/', Tinebase_Core::getUser()->accountEmailAddress, $vcalendar);