xref: /plugin/davcal/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
1*a1a3b679SAndreas Boehler<?php
2*a1a3b679SAndreas Boehler
3*a1a3b679SAndreas Boehlernamespace Sabre\CalDAV\Backend;
4*a1a3b679SAndreas Boehler
5*a1a3b679SAndreas Boehleruse Sabre\CalDAV;
6*a1a3b679SAndreas Boehleruse Sabre\DAV;
7*a1a3b679SAndreas Boehleruse Sabre\DAV\PropPatch;
8*a1a3b679SAndreas Boehler
9*a1a3b679SAndreas Boehlerabstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
10*a1a3b679SAndreas Boehler
11*a1a3b679SAndreas Boehler    protected $pdo;
12*a1a3b679SAndreas Boehler
13*a1a3b679SAndreas Boehler    function testConstruct() {
14*a1a3b679SAndreas Boehler
15*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
16*a1a3b679SAndreas Boehler        $this->assertTrue($backend instanceof PDO);
17*a1a3b679SAndreas Boehler
18*a1a3b679SAndreas Boehler    }
19*a1a3b679SAndreas Boehler
20*a1a3b679SAndreas Boehler    /**
21*a1a3b679SAndreas Boehler     * @depends testConstruct
22*a1a3b679SAndreas Boehler     */
23*a1a3b679SAndreas Boehler    function testGetCalendarsForUserNoCalendars() {
24*a1a3b679SAndreas Boehler
25*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
26*a1a3b679SAndreas Boehler        $calendars = $backend->getCalendarsForUser('principals/user2');
27*a1a3b679SAndreas Boehler        $this->assertEquals(array(),$calendars);
28*a1a3b679SAndreas Boehler
29*a1a3b679SAndreas Boehler    }
30*a1a3b679SAndreas Boehler
31*a1a3b679SAndreas Boehler    /**
32*a1a3b679SAndreas Boehler     * @depends testConstruct
33*a1a3b679SAndreas Boehler     */
34*a1a3b679SAndreas Boehler    function testCreateCalendarAndFetch() {
35*a1a3b679SAndreas Boehler
36*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
37*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array(
38*a1a3b679SAndreas Boehler            '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new CalDAV\Xml\Property\SupportedCalendarComponentSet(array('VEVENT')),
39*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'Hello!',
40*a1a3b679SAndreas Boehler            '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp' => new CalDAV\Xml\Property\ScheduleCalendarTransp('transparent'),
41*a1a3b679SAndreas Boehler        ));
42*a1a3b679SAndreas Boehler        $calendars = $backend->getCalendarsForUser('principals/user2');
43*a1a3b679SAndreas Boehler
44*a1a3b679SAndreas Boehler        $elementCheck = array(
45*a1a3b679SAndreas Boehler            'id'                => $returnedId,
46*a1a3b679SAndreas Boehler            'uri'               => 'somerandomid',
47*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'Hello!',
48*a1a3b679SAndreas Boehler            '{urn:ietf:params:xml:ns:caldav}calendar-description' => '',
49*a1a3b679SAndreas Boehler            '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp' => new CalDAV\Xml\Property\ScheduleCalendarTransp('transparent'),
50*a1a3b679SAndreas Boehler        );
51*a1a3b679SAndreas Boehler
52*a1a3b679SAndreas Boehler        $this->assertInternalType('array',$calendars);
53*a1a3b679SAndreas Boehler        $this->assertEquals(1,count($calendars));
54*a1a3b679SAndreas Boehler
55*a1a3b679SAndreas Boehler        foreach($elementCheck as $name=>$value) {
56*a1a3b679SAndreas Boehler
57*a1a3b679SAndreas Boehler            $this->assertArrayHasKey($name, $calendars[0]);
58*a1a3b679SAndreas Boehler            $this->assertEquals($value,$calendars[0][$name]);
59*a1a3b679SAndreas Boehler
60*a1a3b679SAndreas Boehler        }
61*a1a3b679SAndreas Boehler
62*a1a3b679SAndreas Boehler    }
63*a1a3b679SAndreas Boehler
64*a1a3b679SAndreas Boehler    /**
65*a1a3b679SAndreas Boehler     * @depends testConstruct
66*a1a3b679SAndreas Boehler     */
67*a1a3b679SAndreas Boehler    function testUpdateCalendarAndFetch() {
68*a1a3b679SAndreas Boehler
69*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
70*a1a3b679SAndreas Boehler
71*a1a3b679SAndreas Boehler        //Creating a new calendar
72*a1a3b679SAndreas Boehler        $newId = $backend->createCalendar('principals/user2','somerandomid',array());
73*a1a3b679SAndreas Boehler
74*a1a3b679SAndreas Boehler        $propPatch = new PropPatch([
75*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'myCalendar',
76*a1a3b679SAndreas Boehler            '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp' => new CalDAV\Xml\Property\ScheduleCalendarTransp('transparent'),
77*a1a3b679SAndreas Boehler        ]);
78*a1a3b679SAndreas Boehler
79*a1a3b679SAndreas Boehler        // Updating the calendar
80*a1a3b679SAndreas Boehler        $backend->updateCalendar($newId, $propPatch);
81*a1a3b679SAndreas Boehler        $result = $propPatch->commit();
82*a1a3b679SAndreas Boehler
83*a1a3b679SAndreas Boehler        // Verifying the result of the update
84*a1a3b679SAndreas Boehler        $this->assertTrue($result);
85*a1a3b679SAndreas Boehler
86*a1a3b679SAndreas Boehler        // Fetching all calendars from this user
87*a1a3b679SAndreas Boehler        $calendars = $backend->getCalendarsForUser('principals/user2');
88*a1a3b679SAndreas Boehler
89*a1a3b679SAndreas Boehler        // Checking if all the information is still correct
90*a1a3b679SAndreas Boehler        $elementCheck = array(
91*a1a3b679SAndreas Boehler            'id'                => $newId,
92*a1a3b679SAndreas Boehler            'uri'               => 'somerandomid',
93*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'myCalendar',
94*a1a3b679SAndreas Boehler            '{urn:ietf:params:xml:ns:caldav}calendar-description' => '',
95*a1a3b679SAndreas Boehler            '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => '',
96*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}getctag' => 'http://sabre.io/ns/sync/2',
97*a1a3b679SAndreas Boehler            '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp' => new CalDAV\Xml\Property\ScheduleCalendarTransp('transparent'),
98*a1a3b679SAndreas Boehler        );
99*a1a3b679SAndreas Boehler
100*a1a3b679SAndreas Boehler        $this->assertInternalType('array',$calendars);
101*a1a3b679SAndreas Boehler        $this->assertEquals(1,count($calendars));
102*a1a3b679SAndreas Boehler
103*a1a3b679SAndreas Boehler        foreach($elementCheck as $name=>$value) {
104*a1a3b679SAndreas Boehler
105*a1a3b679SAndreas Boehler            $this->assertArrayHasKey($name, $calendars[0]);
106*a1a3b679SAndreas Boehler            $this->assertEquals($value,$calendars[0][$name]);
107*a1a3b679SAndreas Boehler
108*a1a3b679SAndreas Boehler        }
109*a1a3b679SAndreas Boehler
110*a1a3b679SAndreas Boehler    }
111*a1a3b679SAndreas Boehler
112*a1a3b679SAndreas Boehler    /**
113*a1a3b679SAndreas Boehler     * @depends testUpdateCalendarAndFetch
114*a1a3b679SAndreas Boehler     */
115*a1a3b679SAndreas Boehler    function testUpdateCalendarUnknownProperty() {
116*a1a3b679SAndreas Boehler
117*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
118*a1a3b679SAndreas Boehler
119*a1a3b679SAndreas Boehler        //Creating a new calendar
120*a1a3b679SAndreas Boehler        $newId = $backend->createCalendar('principals/user2','somerandomid',array());
121*a1a3b679SAndreas Boehler
122*a1a3b679SAndreas Boehler        $propPatch = new PropPatch([
123*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'myCalendar',
124*a1a3b679SAndreas Boehler            '{DAV:}yourmom'     => 'wittycomment',
125*a1a3b679SAndreas Boehler        ]);
126*a1a3b679SAndreas Boehler
127*a1a3b679SAndreas Boehler        // Updating the calendar
128*a1a3b679SAndreas Boehler        $backend->updateCalendar($newId, $propPatch);
129*a1a3b679SAndreas Boehler        $propPatch->commit();
130*a1a3b679SAndreas Boehler
131*a1a3b679SAndreas Boehler        // Verifying the result of the update
132*a1a3b679SAndreas Boehler        $this->assertEquals([
133*a1a3b679SAndreas Boehler            '{DAV:}yourmom' => 403,
134*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 424,
135*a1a3b679SAndreas Boehler        ], $propPatch->getResult());
136*a1a3b679SAndreas Boehler
137*a1a3b679SAndreas Boehler    }
138*a1a3b679SAndreas Boehler
139*a1a3b679SAndreas Boehler    /**
140*a1a3b679SAndreas Boehler     * @depends testCreateCalendarAndFetch
141*a1a3b679SAndreas Boehler     */
142*a1a3b679SAndreas Boehler    function testDeleteCalendar() {
143*a1a3b679SAndreas Boehler
144*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
145*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array(
146*a1a3b679SAndreas Boehler            '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new CalDAV\Xml\Property\SupportedCalendarComponentSet(array('VEVENT')),
147*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'Hello!',
148*a1a3b679SAndreas Boehler        ));
149*a1a3b679SAndreas Boehler
150*a1a3b679SAndreas Boehler        $backend->deleteCalendar($returnedId);
151*a1a3b679SAndreas Boehler
152*a1a3b679SAndreas Boehler        $calendars = $backend->getCalendarsForUser('principals/user2');
153*a1a3b679SAndreas Boehler        $this->assertEquals(array(),$calendars);
154*a1a3b679SAndreas Boehler
155*a1a3b679SAndreas Boehler    }
156*a1a3b679SAndreas Boehler
157*a1a3b679SAndreas Boehler    /**
158*a1a3b679SAndreas Boehler     * @depends testCreateCalendarAndFetch
159*a1a3b679SAndreas Boehler     * @expectedException \Sabre\DAV\Exception
160*a1a3b679SAndreas Boehler     */
161*a1a3b679SAndreas Boehler    function testCreateCalendarIncorrectComponentSet() {;
162*a1a3b679SAndreas Boehler
163*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
164*a1a3b679SAndreas Boehler
165*a1a3b679SAndreas Boehler        //Creating a new calendar
166*a1a3b679SAndreas Boehler        $newId = $backend->createCalendar('principals/user2','somerandomid',array(
167*a1a3b679SAndreas Boehler            '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => 'blabla',
168*a1a3b679SAndreas Boehler        ));
169*a1a3b679SAndreas Boehler
170*a1a3b679SAndreas Boehler    }
171*a1a3b679SAndreas Boehler
172*a1a3b679SAndreas Boehler    function testCreateCalendarObject() {
173*a1a3b679SAndreas Boehler
174*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
175*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
176*a1a3b679SAndreas Boehler
177*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
178*a1a3b679SAndreas Boehler
179*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'random-id', $object);
180*a1a3b679SAndreas Boehler
181*a1a3b679SAndreas Boehler        $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
182*a1a3b679SAndreas Boehler        $this->assertEquals(array(
183*a1a3b679SAndreas Boehler            'etag' => md5($object),
184*a1a3b679SAndreas Boehler            'size' => strlen($object),
185*a1a3b679SAndreas Boehler            'calendardata' => $object,
186*a1a3b679SAndreas Boehler            'firstoccurence' => strtotime('20120101'),
187*a1a3b679SAndreas Boehler            'lastoccurence' => strtotime('20120101')+(3600*24),
188*a1a3b679SAndreas Boehler            'componenttype' => 'VEVENT',
189*a1a3b679SAndreas Boehler        ), $result->fetch(\PDO::FETCH_ASSOC));
190*a1a3b679SAndreas Boehler
191*a1a3b679SAndreas Boehler    }
192*a1a3b679SAndreas Boehler    function testGetMultipleObjects() {
193*a1a3b679SAndreas Boehler
194*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
195*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
196*a1a3b679SAndreas Boehler
197*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
198*a1a3b679SAndreas Boehler
199*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'id-1', $object);
200*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'id-2', $object);
201*a1a3b679SAndreas Boehler
202*a1a3b679SAndreas Boehler        $check = [
203*a1a3b679SAndreas Boehler            [
204*a1a3b679SAndreas Boehler                'id' => 1,
205*a1a3b679SAndreas Boehler                'etag' => '"' . md5($object) . '"',
206*a1a3b679SAndreas Boehler                'uri' => 'id-1',
207*a1a3b679SAndreas Boehler                'size' => strlen($object),
208*a1a3b679SAndreas Boehler                'calendardata' => $object,
209*a1a3b679SAndreas Boehler                'lastmodified' => null,
210*a1a3b679SAndreas Boehler                'calendarid' => $returnedId,
211*a1a3b679SAndreas Boehler            ],
212*a1a3b679SAndreas Boehler            [
213*a1a3b679SAndreas Boehler                'id' => 2,
214*a1a3b679SAndreas Boehler                'etag' => '"' . md5($object) . '"',
215*a1a3b679SAndreas Boehler                'uri' => 'id-2',
216*a1a3b679SAndreas Boehler                'size' => strlen($object),
217*a1a3b679SAndreas Boehler                'calendardata' => $object,
218*a1a3b679SAndreas Boehler                'lastmodified' => null,
219*a1a3b679SAndreas Boehler                'calendarid' => $returnedId,
220*a1a3b679SAndreas Boehler            ],
221*a1a3b679SAndreas Boehler        ];
222*a1a3b679SAndreas Boehler
223*a1a3b679SAndreas Boehler        $result = $backend->getMultipleCalendarObjects($returnedId, [ 'id-1', 'id-2' ]);
224*a1a3b679SAndreas Boehler
225*a1a3b679SAndreas Boehler        foreach($check as $index => $props) {
226*a1a3b679SAndreas Boehler
227*a1a3b679SAndreas Boehler            foreach($props as $key=>$value) {
228*a1a3b679SAndreas Boehler
229*a1a3b679SAndreas Boehler                if ($key!=='lastmodified') {
230*a1a3b679SAndreas Boehler                    $this->assertEquals($value, $result[$index][$key]);
231*a1a3b679SAndreas Boehler                } else {
232*a1a3b679SAndreas Boehler                    $this->assertTrue(isset($result[$index][$key]));
233*a1a3b679SAndreas Boehler                }
234*a1a3b679SAndreas Boehler
235*a1a3b679SAndreas Boehler            }
236*a1a3b679SAndreas Boehler
237*a1a3b679SAndreas Boehler        }
238*a1a3b679SAndreas Boehler
239*a1a3b679SAndreas Boehler    }
240*a1a3b679SAndreas Boehler
241*a1a3b679SAndreas Boehler    /**
242*a1a3b679SAndreas Boehler     * @expectedException Sabre\DAV\Exception\BadRequest
243*a1a3b679SAndreas Boehler     * @depends testCreateCalendarObject
244*a1a3b679SAndreas Boehler     */
245*a1a3b679SAndreas Boehler    function testCreateCalendarObjectNoComponent() {
246*a1a3b679SAndreas Boehler
247*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
248*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
249*a1a3b679SAndreas Boehler
250*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nEND:VCALENDAR\r\n";
251*a1a3b679SAndreas Boehler
252*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'random-id', $object);
253*a1a3b679SAndreas Boehler
254*a1a3b679SAndreas Boehler    }
255*a1a3b679SAndreas Boehler
256*a1a3b679SAndreas Boehler    /**
257*a1a3b679SAndreas Boehler     * @depends testCreateCalendarObject
258*a1a3b679SAndreas Boehler     */
259*a1a3b679SAndreas Boehler    function testCreateCalendarObjectDuration() {
260*a1a3b679SAndreas Boehler
261*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
262*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
263*a1a3b679SAndreas Boehler
264*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nDURATION:P2D\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
265*a1a3b679SAndreas Boehler
266*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'random-id', $object);
267*a1a3b679SAndreas Boehler
268*a1a3b679SAndreas Boehler        $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
269*a1a3b679SAndreas Boehler        $this->assertEquals(array(
270*a1a3b679SAndreas Boehler            'etag' => md5($object),
271*a1a3b679SAndreas Boehler            'size' => strlen($object),
272*a1a3b679SAndreas Boehler            'calendardata' => $object,
273*a1a3b679SAndreas Boehler            'firstoccurence' => strtotime('20120101'),
274*a1a3b679SAndreas Boehler            'lastoccurence' => strtotime('20120101')+(3600*48),
275*a1a3b679SAndreas Boehler            'componenttype' => 'VEVENT',
276*a1a3b679SAndreas Boehler        ), $result->fetch(\PDO::FETCH_ASSOC));
277*a1a3b679SAndreas Boehler
278*a1a3b679SAndreas Boehler    }
279*a1a3b679SAndreas Boehler
280*a1a3b679SAndreas Boehler    /**
281*a1a3b679SAndreas Boehler     * @depends testCreateCalendarObject
282*a1a3b679SAndreas Boehler     */
283*a1a3b679SAndreas Boehler    function testCreateCalendarObjectNoDTEND() {
284*a1a3b679SAndreas Boehler
285*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
286*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
287*a1a3b679SAndreas Boehler
288*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE-TIME:20120101T100000Z\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
289*a1a3b679SAndreas Boehler
290*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'random-id', $object);
291*a1a3b679SAndreas Boehler
292*a1a3b679SAndreas Boehler        $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
293*a1a3b679SAndreas Boehler        $this->assertEquals(array(
294*a1a3b679SAndreas Boehler            'etag' => md5($object),
295*a1a3b679SAndreas Boehler            'size' => strlen($object),
296*a1a3b679SAndreas Boehler            'calendardata' => $object,
297*a1a3b679SAndreas Boehler            'firstoccurence' => strtotime('2012-01-01 10:00:00'),
298*a1a3b679SAndreas Boehler            'lastoccurence' => strtotime('2012-01-01 10:00:00'),
299*a1a3b679SAndreas Boehler            'componenttype' => 'VEVENT',
300*a1a3b679SAndreas Boehler        ), $result->fetch(\PDO::FETCH_ASSOC));
301*a1a3b679SAndreas Boehler
302*a1a3b679SAndreas Boehler    }
303*a1a3b679SAndreas Boehler
304*a1a3b679SAndreas Boehler    /**
305*a1a3b679SAndreas Boehler     * @depends testCreateCalendarObject
306*a1a3b679SAndreas Boehler     */
307*a1a3b679SAndreas Boehler    function testCreateCalendarObjectWithDTEND() {
308*a1a3b679SAndreas Boehler
309*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
310*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
311*a1a3b679SAndreas Boehler
312*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE-TIME:20120101T100000Z\r\nDTEND:20120101T110000Z\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
313*a1a3b679SAndreas Boehler
314*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'random-id', $object);
315*a1a3b679SAndreas Boehler
316*a1a3b679SAndreas Boehler        $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
317*a1a3b679SAndreas Boehler        $this->assertEquals(array(
318*a1a3b679SAndreas Boehler            'etag' => md5($object),
319*a1a3b679SAndreas Boehler            'size' => strlen($object),
320*a1a3b679SAndreas Boehler            'calendardata' => $object,
321*a1a3b679SAndreas Boehler            'firstoccurence' => strtotime('2012-01-01 10:00:00'),
322*a1a3b679SAndreas Boehler            'lastoccurence' => strtotime('2012-01-01 11:00:00'),
323*a1a3b679SAndreas Boehler            'componenttype' => 'VEVENT',
324*a1a3b679SAndreas Boehler        ), $result->fetch(\PDO::FETCH_ASSOC));
325*a1a3b679SAndreas Boehler
326*a1a3b679SAndreas Boehler    }
327*a1a3b679SAndreas Boehler
328*a1a3b679SAndreas Boehler    /**
329*a1a3b679SAndreas Boehler     * @depends testCreateCalendarObject
330*a1a3b679SAndreas Boehler     */
331*a1a3b679SAndreas Boehler    function testCreateCalendarObjectInfiniteReccurence() {
332*a1a3b679SAndreas Boehler
333*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
334*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
335*a1a3b679SAndreas Boehler
336*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE-TIME:20120101T100000Z\r\nRRULE:FREQ=DAILY\r\nUID:foo\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
337*a1a3b679SAndreas Boehler
338*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'random-id', $object);
339*a1a3b679SAndreas Boehler
340*a1a3b679SAndreas Boehler        $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
341*a1a3b679SAndreas Boehler        $this->assertEquals(array(
342*a1a3b679SAndreas Boehler            'etag' => md5($object),
343*a1a3b679SAndreas Boehler            'size' => strlen($object),
344*a1a3b679SAndreas Boehler            'calendardata' => $object,
345*a1a3b679SAndreas Boehler            'firstoccurence' => strtotime('2012-01-01 10:00:00'),
346*a1a3b679SAndreas Boehler            'lastoccurence' => strtotime(PDO::MAX_DATE),
347*a1a3b679SAndreas Boehler            'componenttype' => 'VEVENT',
348*a1a3b679SAndreas Boehler        ), $result->fetch(\PDO::FETCH_ASSOC));
349*a1a3b679SAndreas Boehler
350*a1a3b679SAndreas Boehler    }
351*a1a3b679SAndreas Boehler
352*a1a3b679SAndreas Boehler    /**
353*a1a3b679SAndreas Boehler     * @depends testCreateCalendarObject
354*a1a3b679SAndreas Boehler     */
355*a1a3b679SAndreas Boehler    function testCreateCalendarObjectEndingReccurence() {
356*a1a3b679SAndreas Boehler
357*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
358*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
359*a1a3b679SAndreas Boehler
360*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE-TIME:20120101T100000Z\r\nDTEND;VALUE=DATE-TIME:20120101T110000Z\r\nUID:foo\r\nRRULE:FREQ=DAILY;COUNT=1000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
361*a1a3b679SAndreas Boehler
362*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'random-id', $object);
363*a1a3b679SAndreas Boehler
364*a1a3b679SAndreas Boehler        $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
365*a1a3b679SAndreas Boehler        $this->assertEquals(array(
366*a1a3b679SAndreas Boehler            'etag' => md5($object),
367*a1a3b679SAndreas Boehler            'size' => strlen($object),
368*a1a3b679SAndreas Boehler            'calendardata' => $object,
369*a1a3b679SAndreas Boehler            'firstoccurence' => strtotime('2012-01-01 10:00:00'),
370*a1a3b679SAndreas Boehler            'lastoccurence' => strtotime('2012-01-01 11:00:00') + (3600 * 24 * 999),
371*a1a3b679SAndreas Boehler            'componenttype' => 'VEVENT',
372*a1a3b679SAndreas Boehler        ), $result->fetch(\PDO::FETCH_ASSOC));
373*a1a3b679SAndreas Boehler
374*a1a3b679SAndreas Boehler    }
375*a1a3b679SAndreas Boehler
376*a1a3b679SAndreas Boehler    /**
377*a1a3b679SAndreas Boehler     * @depends testCreateCalendarObject
378*a1a3b679SAndreas Boehler     */
379*a1a3b679SAndreas Boehler    function testCreateCalendarObjectTask() {
380*a1a3b679SAndreas Boehler
381*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
382*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
383*a1a3b679SAndreas Boehler
384*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nDUE;VALUE=DATE-TIME:20120101T100000Z\r\nEND:VTODO\r\nEND:VCALENDAR\r\n";
385*a1a3b679SAndreas Boehler
386*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'random-id', $object);
387*a1a3b679SAndreas Boehler
388*a1a3b679SAndreas Boehler        $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
389*a1a3b679SAndreas Boehler        $this->assertEquals(array(
390*a1a3b679SAndreas Boehler            'etag' => md5($object),
391*a1a3b679SAndreas Boehler            'size' => strlen($object),
392*a1a3b679SAndreas Boehler            'calendardata' => $object,
393*a1a3b679SAndreas Boehler            'firstoccurence' => null,
394*a1a3b679SAndreas Boehler            'lastoccurence' => null,
395*a1a3b679SAndreas Boehler            'componenttype' => 'VTODO',
396*a1a3b679SAndreas Boehler        ), $result->fetch(\PDO::FETCH_ASSOC));
397*a1a3b679SAndreas Boehler
398*a1a3b679SAndreas Boehler    }
399*a1a3b679SAndreas Boehler
400*a1a3b679SAndreas Boehler    /**
401*a1a3b679SAndreas Boehler     * @depends testCreateCalendarObject
402*a1a3b679SAndreas Boehler     */
403*a1a3b679SAndreas Boehler    function testGetCalendarObjects() {
404*a1a3b679SAndreas Boehler
405*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
406*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
407*a1a3b679SAndreas Boehler
408*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
409*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'random-id', $object);
410*a1a3b679SAndreas Boehler
411*a1a3b679SAndreas Boehler        $data = $backend->getCalendarObjects($returnedId,'random-id');
412*a1a3b679SAndreas Boehler
413*a1a3b679SAndreas Boehler        $this->assertEquals(1, count($data));
414*a1a3b679SAndreas Boehler        $data = $data[0];
415*a1a3b679SAndreas Boehler
416*a1a3b679SAndreas Boehler        $this->assertEquals($returnedId, $data['calendarid']);
417*a1a3b679SAndreas Boehler        $this->assertEquals('random-id', $data['uri']);
418*a1a3b679SAndreas Boehler        $this->assertEquals(strlen($object),$data['size']);
419*a1a3b679SAndreas Boehler
420*a1a3b679SAndreas Boehler
421*a1a3b679SAndreas Boehler    }
422*a1a3b679SAndreas Boehler    /**
423*a1a3b679SAndreas Boehler     * @depends testCreateCalendarObject
424*a1a3b679SAndreas Boehler     */
425*a1a3b679SAndreas Boehler    function testGetCalendarObjectByUID() {
426*a1a3b679SAndreas Boehler
427*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
428*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',[]);
429*a1a3b679SAndreas Boehler
430*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nUID:foo\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
431*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'random-id', $object);
432*a1a3b679SAndreas Boehler
433*a1a3b679SAndreas Boehler        $this->assertNull(
434*a1a3b679SAndreas Boehler            $backend->getCalendarObjectByUID('principals/user2', 'bar')
435*a1a3b679SAndreas Boehler        );
436*a1a3b679SAndreas Boehler        $this->assertEquals(
437*a1a3b679SAndreas Boehler            'somerandomid/random-id',
438*a1a3b679SAndreas Boehler            $backend->getCalendarObjectByUID('principals/user2', 'foo')
439*a1a3b679SAndreas Boehler        );
440*a1a3b679SAndreas Boehler
441*a1a3b679SAndreas Boehler    }
442*a1a3b679SAndreas Boehler
443*a1a3b679SAndreas Boehler    /**
444*a1a3b679SAndreas Boehler     * @depends testCreateCalendarObject
445*a1a3b679SAndreas Boehler     */
446*a1a3b679SAndreas Boehler    function testUpdateCalendarObject() {
447*a1a3b679SAndreas Boehler
448*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
449*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
450*a1a3b679SAndreas Boehler
451*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
452*a1a3b679SAndreas Boehler        $object2 = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20130101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
453*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'random-id', $object);
454*a1a3b679SAndreas Boehler        $backend->updateCalendarObject($returnedId, 'random-id', $object2);
455*a1a3b679SAndreas Boehler
456*a1a3b679SAndreas Boehler        $data = $backend->getCalendarObject($returnedId,'random-id');
457*a1a3b679SAndreas Boehler
458*a1a3b679SAndreas Boehler        $this->assertEquals($object2, $data['calendardata']);
459*a1a3b679SAndreas Boehler        $this->assertEquals($returnedId, $data['calendarid']);
460*a1a3b679SAndreas Boehler        $this->assertEquals('random-id', $data['uri']);
461*a1a3b679SAndreas Boehler
462*a1a3b679SAndreas Boehler
463*a1a3b679SAndreas Boehler    }
464*a1a3b679SAndreas Boehler
465*a1a3b679SAndreas Boehler    /**
466*a1a3b679SAndreas Boehler     * @depends testCreateCalendarObject
467*a1a3b679SAndreas Boehler     */
468*a1a3b679SAndreas Boehler    function testDeleteCalendarObject() {
469*a1a3b679SAndreas Boehler
470*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
471*a1a3b679SAndreas Boehler        $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
472*a1a3b679SAndreas Boehler
473*a1a3b679SAndreas Boehler        $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
474*a1a3b679SAndreas Boehler        $backend->createCalendarObject($returnedId, 'random-id', $object);
475*a1a3b679SAndreas Boehler        $backend->deleteCalendarObject($returnedId, 'random-id');
476*a1a3b679SAndreas Boehler
477*a1a3b679SAndreas Boehler        $data = $backend->getCalendarObject($returnedId,'random-id');
478*a1a3b679SAndreas Boehler        $this->assertNull($data);
479*a1a3b679SAndreas Boehler
480*a1a3b679SAndreas Boehler    }
481*a1a3b679SAndreas Boehler
482*a1a3b679SAndreas Boehler    function testCalendarQueryNoResult() {
483*a1a3b679SAndreas Boehler
484*a1a3b679SAndreas Boehler        $abstract = new PDO($this->pdo);
485*a1a3b679SAndreas Boehler        $filters = array(
486*a1a3b679SAndreas Boehler            'name' => 'VCALENDAR',
487*a1a3b679SAndreas Boehler            'comp-filters' => array(
488*a1a3b679SAndreas Boehler                array(
489*a1a3b679SAndreas Boehler                    'name' => 'VJOURNAL',
490*a1a3b679SAndreas Boehler                    'comp-filters' => array(),
491*a1a3b679SAndreas Boehler                    'prop-filters' => array(),
492*a1a3b679SAndreas Boehler                    'is-not-defined' => false,
493*a1a3b679SAndreas Boehler                    'time-range' => null,
494*a1a3b679SAndreas Boehler                ),
495*a1a3b679SAndreas Boehler            ),
496*a1a3b679SAndreas Boehler            'prop-filters' => array(),
497*a1a3b679SAndreas Boehler            'is-not-defined' => false,
498*a1a3b679SAndreas Boehler            'time-range' => null,
499*a1a3b679SAndreas Boehler        );
500*a1a3b679SAndreas Boehler
501*a1a3b679SAndreas Boehler        $this->assertEquals(array(
502*a1a3b679SAndreas Boehler        ), $abstract->calendarQuery(1, $filters));
503*a1a3b679SAndreas Boehler
504*a1a3b679SAndreas Boehler    }
505*a1a3b679SAndreas Boehler
506*a1a3b679SAndreas Boehler    function testCalendarQueryTodo() {
507*a1a3b679SAndreas Boehler
508*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
509*a1a3b679SAndreas Boehler        $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
510*a1a3b679SAndreas Boehler        $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
511*a1a3b679SAndreas Boehler
512*a1a3b679SAndreas Boehler        $filters = array(
513*a1a3b679SAndreas Boehler            'name' => 'VCALENDAR',
514*a1a3b679SAndreas Boehler            'comp-filters' => array(
515*a1a3b679SAndreas Boehler                array(
516*a1a3b679SAndreas Boehler                    'name' => 'VTODO',
517*a1a3b679SAndreas Boehler                    'comp-filters' => array(),
518*a1a3b679SAndreas Boehler                    'prop-filters' => array(),
519*a1a3b679SAndreas Boehler                    'is-not-defined' => false,
520*a1a3b679SAndreas Boehler                    'time-range' => null,
521*a1a3b679SAndreas Boehler                ),
522*a1a3b679SAndreas Boehler            ),
523*a1a3b679SAndreas Boehler            'prop-filters' => array(),
524*a1a3b679SAndreas Boehler            'is-not-defined' => false,
525*a1a3b679SAndreas Boehler            'time-range' => null,
526*a1a3b679SAndreas Boehler        );
527*a1a3b679SAndreas Boehler
528*a1a3b679SAndreas Boehler        $this->assertEquals(array(
529*a1a3b679SAndreas Boehler            "todo",
530*a1a3b679SAndreas Boehler        ), $backend->calendarQuery(1, $filters));
531*a1a3b679SAndreas Boehler
532*a1a3b679SAndreas Boehler    }
533*a1a3b679SAndreas Boehler    function testCalendarQueryTodoNotMatch() {
534*a1a3b679SAndreas Boehler
535*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
536*a1a3b679SAndreas Boehler        $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
537*a1a3b679SAndreas Boehler        $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
538*a1a3b679SAndreas Boehler
539*a1a3b679SAndreas Boehler        $filters = array(
540*a1a3b679SAndreas Boehler            'name' => 'VCALENDAR',
541*a1a3b679SAndreas Boehler            'comp-filters' => array(
542*a1a3b679SAndreas Boehler                array(
543*a1a3b679SAndreas Boehler                    'name' => 'VTODO',
544*a1a3b679SAndreas Boehler                    'comp-filters' => array(),
545*a1a3b679SAndreas Boehler                    'prop-filters' => array(
546*a1a3b679SAndreas Boehler                        array(
547*a1a3b679SAndreas Boehler                            'name' => 'summary',
548*a1a3b679SAndreas Boehler                            'text-match' => null,
549*a1a3b679SAndreas Boehler                            'time-range' => null,
550*a1a3b679SAndreas Boehler                            'param-filters' => array(),
551*a1a3b679SAndreas Boehler                            'is-not-defined' => false,
552*a1a3b679SAndreas Boehler                        ),
553*a1a3b679SAndreas Boehler                    ),
554*a1a3b679SAndreas Boehler                    'is-not-defined' => false,
555*a1a3b679SAndreas Boehler                    'time-range' => null,
556*a1a3b679SAndreas Boehler                ),
557*a1a3b679SAndreas Boehler            ),
558*a1a3b679SAndreas Boehler            'prop-filters' => array(),
559*a1a3b679SAndreas Boehler            'is-not-defined' => false,
560*a1a3b679SAndreas Boehler            'time-range' => null,
561*a1a3b679SAndreas Boehler        );
562*a1a3b679SAndreas Boehler
563*a1a3b679SAndreas Boehler        $this->assertEquals(array(
564*a1a3b679SAndreas Boehler        ), $backend->calendarQuery(1, $filters));
565*a1a3b679SAndreas Boehler
566*a1a3b679SAndreas Boehler    }
567*a1a3b679SAndreas Boehler
568*a1a3b679SAndreas Boehler    function testCalendarQueryNoFilter() {
569*a1a3b679SAndreas Boehler
570*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
571*a1a3b679SAndreas Boehler        $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
572*a1a3b679SAndreas Boehler        $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
573*a1a3b679SAndreas Boehler
574*a1a3b679SAndreas Boehler        $filters = array(
575*a1a3b679SAndreas Boehler            'name' => 'VCALENDAR',
576*a1a3b679SAndreas Boehler            'comp-filters' => array(),
577*a1a3b679SAndreas Boehler            'prop-filters' => array(),
578*a1a3b679SAndreas Boehler            'is-not-defined' => false,
579*a1a3b679SAndreas Boehler            'time-range' => null,
580*a1a3b679SAndreas Boehler        );
581*a1a3b679SAndreas Boehler
582*a1a3b679SAndreas Boehler        $result = $backend->calendarQuery(1, $filters);
583*a1a3b679SAndreas Boehler        $this->assertTrue(in_array('todo', $result));
584*a1a3b679SAndreas Boehler        $this->assertTrue(in_array('event', $result));
585*a1a3b679SAndreas Boehler
586*a1a3b679SAndreas Boehler    }
587*a1a3b679SAndreas Boehler
588*a1a3b679SAndreas Boehler    function testCalendarQueryTimeRange() {
589*a1a3b679SAndreas Boehler
590*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
591*a1a3b679SAndreas Boehler        $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
592*a1a3b679SAndreas Boehler        $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
593*a1a3b679SAndreas Boehler        $backend->createCalendarObject(1, "event2", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120103\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
594*a1a3b679SAndreas Boehler
595*a1a3b679SAndreas Boehler        $filters = array(
596*a1a3b679SAndreas Boehler            'name' => 'VCALENDAR',
597*a1a3b679SAndreas Boehler            'comp-filters' => array(
598*a1a3b679SAndreas Boehler                array(
599*a1a3b679SAndreas Boehler                    'name' => 'VEVENT',
600*a1a3b679SAndreas Boehler                    'comp-filters' => array(),
601*a1a3b679SAndreas Boehler                    'prop-filters' => array(),
602*a1a3b679SAndreas Boehler                    'is-not-defined' => false,
603*a1a3b679SAndreas Boehler                    'time-range' => array(
604*a1a3b679SAndreas Boehler                        'start' => new \DateTime('20120103'),
605*a1a3b679SAndreas Boehler                        'end'   => new \DateTime('20120104'),
606*a1a3b679SAndreas Boehler                    ),
607*a1a3b679SAndreas Boehler                ),
608*a1a3b679SAndreas Boehler            ),
609*a1a3b679SAndreas Boehler            'prop-filters' => array(),
610*a1a3b679SAndreas Boehler            'is-not-defined' => false,
611*a1a3b679SAndreas Boehler            'time-range' => null,
612*a1a3b679SAndreas Boehler        );
613*a1a3b679SAndreas Boehler
614*a1a3b679SAndreas Boehler        $this->assertEquals(array(
615*a1a3b679SAndreas Boehler            "event2",
616*a1a3b679SAndreas Boehler        ), $backend->calendarQuery(1, $filters));
617*a1a3b679SAndreas Boehler
618*a1a3b679SAndreas Boehler    }
619*a1a3b679SAndreas Boehler    function testCalendarQueryTimeRangeNoEnd() {
620*a1a3b679SAndreas Boehler
621*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
622*a1a3b679SAndreas Boehler        $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
623*a1a3b679SAndreas Boehler        $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
624*a1a3b679SAndreas Boehler        $backend->createCalendarObject(1, "event2", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120103\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
625*a1a3b679SAndreas Boehler
626*a1a3b679SAndreas Boehler        $filters = array(
627*a1a3b679SAndreas Boehler            'name' => 'VCALENDAR',
628*a1a3b679SAndreas Boehler            'comp-filters' => array(
629*a1a3b679SAndreas Boehler                array(
630*a1a3b679SAndreas Boehler                    'name' => 'VEVENT',
631*a1a3b679SAndreas Boehler                    'comp-filters' => array(),
632*a1a3b679SAndreas Boehler                    'prop-filters' => array(),
633*a1a3b679SAndreas Boehler                    'is-not-defined' => false,
634*a1a3b679SAndreas Boehler                    'time-range' => array(
635*a1a3b679SAndreas Boehler                        'start' => new \DateTime('20120102'),
636*a1a3b679SAndreas Boehler                        'end' => null,
637*a1a3b679SAndreas Boehler                    ),
638*a1a3b679SAndreas Boehler                ),
639*a1a3b679SAndreas Boehler            ),
640*a1a3b679SAndreas Boehler            'prop-filters' => array(),
641*a1a3b679SAndreas Boehler            'is-not-defined' => false,
642*a1a3b679SAndreas Boehler            'time-range' => null,
643*a1a3b679SAndreas Boehler        );
644*a1a3b679SAndreas Boehler
645*a1a3b679SAndreas Boehler        $this->assertEquals(array(
646*a1a3b679SAndreas Boehler            "event2",
647*a1a3b679SAndreas Boehler        ), $backend->calendarQuery(1, $filters));
648*a1a3b679SAndreas Boehler
649*a1a3b679SAndreas Boehler    }
650*a1a3b679SAndreas Boehler
651*a1a3b679SAndreas Boehler    function testGetChanges() {
652*a1a3b679SAndreas Boehler
653*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
654*a1a3b679SAndreas Boehler        $id = $backend->createCalendar(
655*a1a3b679SAndreas Boehler            'principals/user1',
656*a1a3b679SAndreas Boehler            'bla',
657*a1a3b679SAndreas Boehler            []
658*a1a3b679SAndreas Boehler        );
659*a1a3b679SAndreas Boehler        $result = $backend->getChangesForCalendar($id, null, 1);
660*a1a3b679SAndreas Boehler
661*a1a3b679SAndreas Boehler        $this->assertEquals([
662*a1a3b679SAndreas Boehler            'syncToken' => 1,
663*a1a3b679SAndreas Boehler            'modified' => [],
664*a1a3b679SAndreas Boehler            'deleted' => [],
665*a1a3b679SAndreas Boehler            'added' => [],
666*a1a3b679SAndreas Boehler        ], $result);
667*a1a3b679SAndreas Boehler
668*a1a3b679SAndreas Boehler        $currentToken = $result['syncToken'];
669*a1a3b679SAndreas Boehler
670*a1a3b679SAndreas Boehler        $dummyTodo = "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n";
671*a1a3b679SAndreas Boehler
672*a1a3b679SAndreas Boehler        $backend->createCalendarObject($id, "todo1.ics", $dummyTodo);
673*a1a3b679SAndreas Boehler        $backend->createCalendarObject($id, "todo2.ics", $dummyTodo);
674*a1a3b679SAndreas Boehler        $backend->createCalendarObject($id, "todo3.ics", $dummyTodo);
675*a1a3b679SAndreas Boehler        $backend->updateCalendarObject($id, "todo1.ics", $dummyTodo);
676*a1a3b679SAndreas Boehler        $backend->deleteCalendarObject($id, "todo2.ics");
677*a1a3b679SAndreas Boehler
678*a1a3b679SAndreas Boehler        $result = $backend->getChangesForCalendar($id, $currentToken, 1);
679*a1a3b679SAndreas Boehler
680*a1a3b679SAndreas Boehler        $this->assertEquals([
681*a1a3b679SAndreas Boehler            'syncToken' => 6,
682*a1a3b679SAndreas Boehler            'modified'  => ["todo1.ics"],
683*a1a3b679SAndreas Boehler            'deleted'   => ["todo2.ics"],
684*a1a3b679SAndreas Boehler            'added'     => ["todo3.ics"],
685*a1a3b679SAndreas Boehler        ], $result);
686*a1a3b679SAndreas Boehler
687*a1a3b679SAndreas Boehler        $result = $backend->getChangesForCalendar($id, null, 1);
688*a1a3b679SAndreas Boehler
689*a1a3b679SAndreas Boehler        $this->assertEquals([
690*a1a3b679SAndreas Boehler            'syncToken' => 6,
691*a1a3b679SAndreas Boehler            'modified' => [],
692*a1a3b679SAndreas Boehler            'deleted' => [],
693*a1a3b679SAndreas Boehler            'added' => ["todo1.ics", "todo3.ics"],
694*a1a3b679SAndreas Boehler        ], $result);
695*a1a3b679SAndreas Boehler    }
696*a1a3b679SAndreas Boehler
697*a1a3b679SAndreas Boehler    function testCreateSubscriptions() {
698*a1a3b679SAndreas Boehler
699*a1a3b679SAndreas Boehler        $props = [
700*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}source' => new \Sabre\DAV\Xml\Property\Href('http://example.org/cal.ics', false),
701*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'cal',
702*a1a3b679SAndreas Boehler            '{http://apple.com/ns/ical/}refreshrate' => 'P1W',
703*a1a3b679SAndreas Boehler            '{http://apple.com/ns/ical/}calendar-color' => '#FF00FFFF',
704*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}subscribed-strip-todos' => true,
705*a1a3b679SAndreas Boehler            //'{http://calendarserver.org/ns/}subscribed-strip-alarms' => true,
706*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}subscribed-strip-attachments' => true,
707*a1a3b679SAndreas Boehler        ];
708*a1a3b679SAndreas Boehler
709*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
710*a1a3b679SAndreas Boehler        $backend->createSubscription('principals/user1', 'sub1', $props);
711*a1a3b679SAndreas Boehler
712*a1a3b679SAndreas Boehler        $subs = $backend->getSubscriptionsForUser('principals/user1');
713*a1a3b679SAndreas Boehler
714*a1a3b679SAndreas Boehler        $expected = $props;
715*a1a3b679SAndreas Boehler        $expected['id'] = 1;
716*a1a3b679SAndreas Boehler        $expected['uri'] = 'sub1';
717*a1a3b679SAndreas Boehler        $expected['principaluri'] = 'principals/user1';
718*a1a3b679SAndreas Boehler
719*a1a3b679SAndreas Boehler        unset($expected['{http://calendarserver.org/ns/}source']);
720*a1a3b679SAndreas Boehler        $expected['source'] = 'http://example.org/cal.ics';
721*a1a3b679SAndreas Boehler
722*a1a3b679SAndreas Boehler        $this->assertEquals(1, count($subs));
723*a1a3b679SAndreas Boehler        foreach($expected as $k=>$v) {
724*a1a3b679SAndreas Boehler            $this->assertEquals($subs[0][$k], $expected[$k]);
725*a1a3b679SAndreas Boehler        }
726*a1a3b679SAndreas Boehler
727*a1a3b679SAndreas Boehler    }
728*a1a3b679SAndreas Boehler
729*a1a3b679SAndreas Boehler    /**
730*a1a3b679SAndreas Boehler     * @expectedException \Sabre\DAV\Exception\Forbidden
731*a1a3b679SAndreas Boehler     */
732*a1a3b679SAndreas Boehler    function testCreateSubscriptionFail() {
733*a1a3b679SAndreas Boehler
734*a1a3b679SAndreas Boehler        $props = [
735*a1a3b679SAndreas Boehler        ];
736*a1a3b679SAndreas Boehler
737*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
738*a1a3b679SAndreas Boehler        $backend->createSubscription('principals/user1', 'sub1', $props);
739*a1a3b679SAndreas Boehler
740*a1a3b679SAndreas Boehler    }
741*a1a3b679SAndreas Boehler
742*a1a3b679SAndreas Boehler    function testUpdateSubscriptions() {
743*a1a3b679SAndreas Boehler
744*a1a3b679SAndreas Boehler        $props = [
745*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}source' => new \Sabre\DAV\Xml\Property\Href('http://example.org/cal.ics', false),
746*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'cal',
747*a1a3b679SAndreas Boehler            '{http://apple.com/ns/ical/}refreshrate' => 'P1W',
748*a1a3b679SAndreas Boehler            '{http://apple.com/ns/ical/}calendar-color' => '#FF00FFFF',
749*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}subscribed-strip-todos' => true,
750*a1a3b679SAndreas Boehler            //'{http://calendarserver.org/ns/}subscribed-strip-alarms' => true,
751*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}subscribed-strip-attachments' => true,
752*a1a3b679SAndreas Boehler        ];
753*a1a3b679SAndreas Boehler
754*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
755*a1a3b679SAndreas Boehler        $backend->createSubscription('principals/user1', 'sub1', $props);
756*a1a3b679SAndreas Boehler
757*a1a3b679SAndreas Boehler        $newProps = [
758*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'new displayname',
759*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}source' => new \Sabre\DAV\Xml\Property\Href('http://example.org/cal2.ics', false),
760*a1a3b679SAndreas Boehler        ];
761*a1a3b679SAndreas Boehler
762*a1a3b679SAndreas Boehler        $propPatch = new DAV\PropPatch($newProps);
763*a1a3b679SAndreas Boehler        $backend->updateSubscription(1, $propPatch);
764*a1a3b679SAndreas Boehler        $result = $propPatch->commit();
765*a1a3b679SAndreas Boehler
766*a1a3b679SAndreas Boehler        $this->assertTrue($result);
767*a1a3b679SAndreas Boehler
768*a1a3b679SAndreas Boehler        $subs = $backend->getSubscriptionsForUser('principals/user1');
769*a1a3b679SAndreas Boehler
770*a1a3b679SAndreas Boehler        $expected = array_merge($props, $newProps);
771*a1a3b679SAndreas Boehler        $expected['id'] = 1;
772*a1a3b679SAndreas Boehler        $expected['uri'] = 'sub1';
773*a1a3b679SAndreas Boehler        $expected['principaluri'] = 'principals/user1';
774*a1a3b679SAndreas Boehler
775*a1a3b679SAndreas Boehler        unset($expected['{http://calendarserver.org/ns/}source']);
776*a1a3b679SAndreas Boehler        $expected['source'] = 'http://example.org/cal2.ics';
777*a1a3b679SAndreas Boehler
778*a1a3b679SAndreas Boehler        $this->assertEquals(1, count($subs));
779*a1a3b679SAndreas Boehler        foreach($expected as $k=>$v) {
780*a1a3b679SAndreas Boehler            $this->assertEquals($subs[0][$k], $expected[$k]);
781*a1a3b679SAndreas Boehler        }
782*a1a3b679SAndreas Boehler
783*a1a3b679SAndreas Boehler    }
784*a1a3b679SAndreas Boehler
785*a1a3b679SAndreas Boehler    function testUpdateSubscriptionsFail() {
786*a1a3b679SAndreas Boehler
787*a1a3b679SAndreas Boehler        $props = [
788*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}source' => new \Sabre\DAV\Xml\Property\Href('http://example.org/cal.ics', false),
789*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'cal',
790*a1a3b679SAndreas Boehler            '{http://apple.com/ns/ical/}refreshrate' => 'P1W',
791*a1a3b679SAndreas Boehler            '{http://apple.com/ns/ical/}calendar-color' => '#FF00FFFF',
792*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}subscribed-strip-todos' => true,
793*a1a3b679SAndreas Boehler            //'{http://calendarserver.org/ns/}subscribed-strip-alarms' => true,
794*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}subscribed-strip-attachments' => true,
795*a1a3b679SAndreas Boehler        ];
796*a1a3b679SAndreas Boehler
797*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
798*a1a3b679SAndreas Boehler        $backend->createSubscription('principals/user1', 'sub1', $props);
799*a1a3b679SAndreas Boehler
800*a1a3b679SAndreas Boehler        $propPatch = new DAV\PropPatch([
801*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'new displayname',
802*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}source' => new \Sabre\DAV\Xml\Property\Href('http://example.org/cal2.ics', false),
803*a1a3b679SAndreas Boehler            '{DAV:}unknown' => 'foo',
804*a1a3b679SAndreas Boehler        ]);
805*a1a3b679SAndreas Boehler
806*a1a3b679SAndreas Boehler        $backend->updateSubscription(1, $propPatch);
807*a1a3b679SAndreas Boehler        $propPatch->commit();
808*a1a3b679SAndreas Boehler
809*a1a3b679SAndreas Boehler        $this->assertEquals([
810*a1a3b679SAndreas Boehler            '{DAV:}unknown' => 403,
811*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 424,
812*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}source' => 424,
813*a1a3b679SAndreas Boehler        ], $propPatch->getResult());
814*a1a3b679SAndreas Boehler
815*a1a3b679SAndreas Boehler    }
816*a1a3b679SAndreas Boehler
817*a1a3b679SAndreas Boehler    function testDeleteSubscriptions() {
818*a1a3b679SAndreas Boehler
819*a1a3b679SAndreas Boehler        $props = [
820*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}source' => new \Sabre\DAV\Xml\Property\Href('http://example.org/cal.ics', false),
821*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'cal',
822*a1a3b679SAndreas Boehler            '{http://apple.com/ns/ical/}refreshrate' => 'P1W',
823*a1a3b679SAndreas Boehler            '{http://apple.com/ns/ical/}calendar-color' => '#FF00FFFF',
824*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}subscribed-strip-todos' => true,
825*a1a3b679SAndreas Boehler            //'{http://calendarserver.org/ns/}subscribed-strip-alarms' => true,
826*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}subscribed-strip-attachments' => true,
827*a1a3b679SAndreas Boehler        ];
828*a1a3b679SAndreas Boehler
829*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
830*a1a3b679SAndreas Boehler        $backend->createSubscription('principals/user1', 'sub1', $props);
831*a1a3b679SAndreas Boehler
832*a1a3b679SAndreas Boehler        $newProps = [
833*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'new displayname',
834*a1a3b679SAndreas Boehler            '{http://calendarserver.org/ns/}source' => new \Sabre\DAV\Xml\Property\Href('http://example.org/cal2.ics', false),
835*a1a3b679SAndreas Boehler        ];
836*a1a3b679SAndreas Boehler
837*a1a3b679SAndreas Boehler        $backend->deleteSubscription(1);
838*a1a3b679SAndreas Boehler
839*a1a3b679SAndreas Boehler        $subs = $backend->getSubscriptionsForUser('principals/user1');
840*a1a3b679SAndreas Boehler        $this->assertEquals(0, count($subs));
841*a1a3b679SAndreas Boehler    }
842*a1a3b679SAndreas Boehler
843*a1a3b679SAndreas Boehler    function testSchedulingMethods() {
844*a1a3b679SAndreas Boehler
845*a1a3b679SAndreas Boehler        $backend = new PDO($this->pdo);
846*a1a3b679SAndreas Boehler
847*a1a3b679SAndreas Boehler        $calData = "BEGIN:VCALENDAR\r\nEND:VCALENDAR\r\n";
848*a1a3b679SAndreas Boehler
849*a1a3b679SAndreas Boehler        $backend->createSchedulingObject(
850*a1a3b679SAndreas Boehler            'principals/user1',
851*a1a3b679SAndreas Boehler            'schedule1.ics',
852*a1a3b679SAndreas Boehler            $calData
853*a1a3b679SAndreas Boehler        );
854*a1a3b679SAndreas Boehler
855*a1a3b679SAndreas Boehler        $expected = [
856*a1a3b679SAndreas Boehler            'calendardata' => $calData,
857*a1a3b679SAndreas Boehler            'uri' => 'schedule1.ics',
858*a1a3b679SAndreas Boehler            'etag' => '"' . md5($calData) . '"',
859*a1a3b679SAndreas Boehler            'size' => strlen($calData)
860*a1a3b679SAndreas Boehler        ];
861*a1a3b679SAndreas Boehler
862*a1a3b679SAndreas Boehler        $result = $backend->getSchedulingObject('principals/user1', 'schedule1.ics');
863*a1a3b679SAndreas Boehler        foreach($expected as $k=>$v) {
864*a1a3b679SAndreas Boehler            $this->assertArrayHasKey($k, $result);
865*a1a3b679SAndreas Boehler            $this->assertEquals($v, $result[$k]);
866*a1a3b679SAndreas Boehler        }
867*a1a3b679SAndreas Boehler
868*a1a3b679SAndreas Boehler        $results = $backend->getSchedulingObjects('principals/user1');
869*a1a3b679SAndreas Boehler
870*a1a3b679SAndreas Boehler        $this->assertEquals(1, count($results));
871*a1a3b679SAndreas Boehler        $result = $results[0];
872*a1a3b679SAndreas Boehler        foreach($expected as $k=>$v) {
873*a1a3b679SAndreas Boehler            $this->assertEquals($v, $result[$k]);
874*a1a3b679SAndreas Boehler        }
875*a1a3b679SAndreas Boehler
876*a1a3b679SAndreas Boehler        $backend->deleteSchedulingObject('principals/user1', 'schedule1.ics');
877*a1a3b679SAndreas Boehler        $result = $backend->getSchedulingObject('principals/user1', 'schedule1.ics');
878*a1a3b679SAndreas Boehler
879*a1a3b679SAndreas Boehler        $this->assertNull($result);
880*a1a3b679SAndreas Boehler
881*a1a3b679SAndreas Boehler    }
882*a1a3b679SAndreas Boehler
883*a1a3b679SAndreas Boehler}
884