]> git.mxchange.org Git - friendica-addons.git/blob - dav/SabreDAV/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php
Initial Release of the calendar plugin
[friendica-addons.git] / dav / SabreDAV / tests / Sabre / CalDAV / CalendarQueryValidatorTest.php
1 <?php
2
3 class Sabre_CalDAV_CalendarQueryValidatorTest extends PHPUnit_Framework_TestCase {
4
5     /**
6      * @dataProvider provider
7      */
8     function testValid($icalObject, $filters, $outcome) {
9
10         $validator = new Sabre_CalDAV_CalendarQueryValidator();
11
12         // Wrapping filter in a VCALENDAR component filter, as this is always
13         // there anyway.
14         $filters = array(
15             'name' => 'VCALENDAR',
16             'comp-filters' => array($filters),
17             'prop-filters' => array(),
18             'is-not-defined' => false,
19             'time-range' => null,
20         );
21
22         $vObject = Sabre_VObject_Reader::read($icalObject);
23
24         switch($outcome) {
25             case 0 :
26                 $this->assertFalse($validator->validate($vObject, $filters));
27                 break;
28             case 1 :
29                 $this->assertTrue($validator->validate($vObject, $filters));
30                 break;
31             case -1 :
32                 try {
33                     $validator->validate($vObject, $filters);
34                 } catch (Sabre_DAV_Exception $e) {
35                     // Success
36                 }
37                 break;
38
39         }
40
41     }
42
43     function provider() {
44
45         $blob1 = <<<yow
46 BEGIN:VCALENDAR
47 BEGIN:VEVENT
48 SUMMARY:hi
49 END:VEVENT
50 END:VCALENDAR
51 yow;
52
53         $blob2 = <<<yow
54 BEGIN:VCALENDAR
55 BEGIN:VEVENT
56 SUMMARY:hi
57 BEGIN:VALARM
58 ACTION:DISPLAY
59 END:VALARM
60 END:VEVENT
61 END:VCALENDAR
62 yow;
63
64         $blob3 = <<<yow
65 BEGIN:VCALENDAR
66 BEGIN:VEVENT
67 SUMMARY:hi
68 DTSTART;VALUE=DATE:20110704
69 END:VEVENT
70 END:VCALENDAR
71 yow;
72         $blob4 = <<<yow
73 BEGIN:VCARD
74 VERSION:3.0
75 FN:Evert
76 END:VCARD
77 yow;
78
79         $blob5 = <<<yow
80 BEGIN:VCALENDAR
81 BEGIN:VEVENT
82 DTSTART:20110101T120000Z
83 DTEND:20110102T120000Z
84 END:VEVENT
85 END:VCALENDAR
86 yow;
87
88         $blob6 = <<<yow
89 BEGIN:VCALENDAR
90 BEGIN:VEVENT
91 DTSTART:20110101T120000Z
92 DURATION:PT5H
93 END:VEVENT
94 END:VCALENDAR
95 yow;
96
97         $blob7 = <<<yow
98 BEGIN:VCALENDAR
99 BEGIN:VEVENT
100 DTSTART;VALUE=DATE:20110101
101 END:VEVENT
102 END:VCALENDAR
103 yow;
104
105         $blob8 = <<<yow
106 BEGIN:VCALENDAR
107 BEGIN:VEVENT
108 DTSTART:20110101T120000Z
109 END:VEVENT
110 END:VCALENDAR
111 yow;
112
113         $blob9 = <<<yow
114 BEGIN:VCALENDAR
115 BEGIN:VTODO
116 DTSTART:20110101T120000Z
117 DURATION:PT1H
118 END:VTODO
119 END:VCALENDAR
120 yow;
121         $blob10 = <<<yow
122 BEGIN:VCALENDAR
123 BEGIN:VTODO
124 DTSTART:20110101T120000Z
125 DUE:20110101T130000Z
126 END:VTODO
127 END:VCALENDAR
128 yow;
129         $blob11 = <<<yow
130 BEGIN:VCALENDAR
131 BEGIN:VTODO
132 DTSTART:20110101T120000Z
133 END:VTODO
134 END:VCALENDAR
135 yow;
136
137         $blob12 = <<<yow
138 BEGIN:VCALENDAR
139 BEGIN:VTODO
140 DUE:20110101T130000Z
141 END:VTODO
142 END:VCALENDAR
143 yow;
144
145         $blob13 = <<<yow
146 BEGIN:VCALENDAR
147 BEGIN:VTODO
148 COMPLETED:20110101T130000Z
149 CREATED:20110101T110000Z
150 END:VTODO
151 END:VCALENDAR
152 yow;
153
154         $blob14 = <<<yow
155 BEGIN:VCALENDAR
156 BEGIN:VTODO
157 COMPLETED:20110101T130000Z
158 END:VTODO
159 END:VCALENDAR
160 yow;
161
162         $blob15 = <<<yow
163 BEGIN:VCALENDAR
164 BEGIN:VTODO
165 CREATED:20110101T110000Z
166 END:VTODO
167 END:VCALENDAR
168 yow;
169
170
171         $blob16 = <<<yow
172 BEGIN:VCALENDAR
173 BEGIN:VTODO
174 END:VTODO
175 END:VCALENDAR
176 yow;
177
178         $blob17 = <<<yow
179 BEGIN:VCALENDAR
180 BEGIN:VJOURNAL
181 END:VJOURNAL
182 END:VCALENDAR
183 yow;
184
185         $blob18 = <<<yow
186 BEGIN:VCALENDAR
187 BEGIN:VJOURNAL
188 DTSTART:20110101T120000Z
189 END:VJOURNAL
190 END:VCALENDAR
191 yow;
192
193         $blob19 = <<<yow
194 BEGIN:VCALENDAR
195 BEGIN:VJOURNAL
196 DTSTART;VALUE=DATE:20110101
197 END:VJOURNAL
198 END:VCALENDAR
199 yow;
200
201         $blob20 = <<<yow
202 BEGIN:VCALENDAR
203 BEGIN:VFREEBUSY
204 END:VFREEBUSY
205 END:VCALENDAR
206 yow;
207
208         $blob21 = <<<yow
209 BEGIN:VCALENDAR
210 BEGIN:VEVENT
211 DTSTART:20110101T120000Z
212 BEGIN:VALARM
213 TRIGGER:-PT1H
214 END:VALARM
215 END:VEVENT
216 END:VCALENDAR
217 yow;
218
219         $blob22 = <<<yow
220 BEGIN:VCALENDAR
221 BEGIN:VEVENT
222 DTSTART:20110101T120000Z
223 BEGIN:VALARM
224 TRIGGER;VALUE=DURATION:-PT1H
225 END:VALARM
226 END:VEVENT
227 END:VCALENDAR
228 yow;
229
230         $blob23 = <<<yow
231 BEGIN:VCALENDAR
232 BEGIN:VEVENT
233 DTSTART:20110101T120000Z
234 BEGIN:VALARM
235 TRIGGER;VALUE=DURATION;RELATED=END:-PT1H
236 END:VALARM
237 END:VEVENT
238 END:VCALENDAR
239 yow;
240
241         $blob24 = <<<yow
242 BEGIN:VCALENDAR
243 BEGIN:VEVENT
244 DTSTART:20110101T120000Z
245 DTEND:20110101T130000Z
246 BEGIN:VALARM
247 TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
248 END:VALARM
249 END:VEVENT
250 END:VCALENDAR
251 yow;
252
253         $blob25 = <<<yow
254 BEGIN:VCALENDAR
255 BEGIN:VEVENT
256 DTSTART:20110101T120000Z
257 DURATION:PT1H
258 BEGIN:VALARM
259 TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
260 END:VALARM
261 END:VEVENT
262 END:VCALENDAR
263 yow;
264
265         $blob26 = <<<yow
266 BEGIN:VCALENDAR
267 BEGIN:VEVENT
268 DTSTART:20110101T120000Z
269 DURATION:PT1H
270 BEGIN:VALARM
271 TRIGGER;VALUE=DATE-TIME:20110101T110000Z
272 END:VALARM
273 END:VEVENT
274 END:VCALENDAR
275 yow;
276
277
278         $blob27 = <<<yow
279 BEGIN:VCALENDAR
280 BEGIN:VTODO
281 DTSTART:20110101T120000Z
282 DUE:20110101T130000Z
283 BEGIN:VALARM
284 TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
285 END:VALARM
286 END:VTODO
287 END:VCALENDAR
288 yow;
289
290         $blob28 = <<<yow
291 BEGIN:VCALENDAR
292 BEGIN:VJOURNAL
293 DTSTART:20110101T120000Z
294 BEGIN:VALARM
295 TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
296 END:VALARM
297 END:VJOURNAL
298 END:VCALENDAR
299 yow;
300
301         $blob29 = <<<yow
302 BEGIN:VCALENDAR
303 BEGIN:VEVENT
304 DTSTART:20110101T120000Z
305 DURATION:PT1H
306 BEGIN:VALARM
307 TRIGGER;VALUE=DATE-TIME:20110101T090000Z
308 REPEAT:2
309 DURATION:PT1H
310 END:VALARM
311 END:VEVENT
312 END:VCALENDAR
313 yow;
314
315         $blob30 = <<<yow
316 BEGIN:VCALENDAR
317 BEGIN:VEVENT
318 DTSTART:20110101T120000Z
319 DURATION:PT1H
320 BEGIN:VALARM
321 TRIGGER;VALUE=DATE-TIME:20110101T090000Z
322 DURATION:PT1H
323 END:VALARM
324 END:VEVENT
325 END:VCALENDAR
326 yow;
327
328         $blob31 = <<<yow
329 BEGIN:VCALENDAR
330 BEGIN:VEVENT
331 DTSTART:20080101T120000Z
332 DURATION:PT1H
333 RRULE:FREQ=YEARLY
334 END:VEVENT
335 END:VCALENDAR
336 yow;
337
338         $blob32 = <<<yow
339 BEGIN:VCALENDAR
340 BEGIN:VEVENT
341 DTSTART:20080102T120000Z
342 DURATION:PT1H
343 RRULE:FREQ=YEARLY
344 END:VEVENT
345 END:VCALENDAR
346 yow;
347
348         $filter1 = array(
349             'name' => 'VEVENT',
350             'comp-filters' => array(),
351             'prop-filters' => array(),
352             'is-not-defined' => false,
353             'time-range' => null,
354         );
355         $filter2 = $filter1;
356         $filter2['name'] = 'VTODO';
357
358         $filter3 = $filter1;
359         $filter3['is-not-defined'] = true;
360
361         $filter4 = $filter1;
362         $filter4['name'] = 'VTODO';
363         $filter4['is-not-defined'] = true;
364
365         $filter5 = $filter1;
366         $filter5['comp-filters'] = array(
367             array(
368                 'name' => 'VALARM',
369                 'is-not-defined' => false,
370                 'comp-filters' => array(),
371                 'prop-filters' => array(),
372                 'time-range' => null,
373             ),
374         );
375         $filter6 = $filter1;
376         $filter6['prop-filters'] = array(
377             array(
378                 'name' => 'SUMMARY',
379                 'is-not-defined' => false,
380                 'param-filters' => array(),
381                 'time-range' => null,
382                 'text-match' => null,
383             ),
384         );
385         $filter7 = $filter6;
386         $filter7['prop-filters'][0]['name'] = 'DESCRIPTION';
387
388         $filter8 = $filter6;
389         $filter8['prop-filters'][0]['is-not-defined'] = true;
390
391         $filter9 = $filter7;
392         $filter9['prop-filters'][0]['is-not-defined'] = true;
393
394         $filter10 = $filter5;
395         $filter10['prop-filters'] = $filter6['prop-filters'];
396
397         // Param filters
398         $filter11 = $filter1;
399         $filter11['prop-filters'] = array(
400             array(
401                 'name' => 'DTSTART',
402                 'is-not-defined' => false,
403                 'param-filters' => array(
404                     array(
405                         'name' => 'VALUE',
406                         'is-not-defined' => false,
407                         'text-match' => null,
408                     ),
409                 ),
410                 'time-range' => null,
411                 'text-match' => null,
412             ),
413         );
414
415         $filter12 = $filter11;
416         $filter12['prop-filters'][0]['param-filters'][0]['name'] = 'TZID';
417
418         $filter13 = $filter11;
419         $filter13['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
420
421         $filter14 = $filter12;
422         $filter14['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
423
424         // Param text filter
425         $filter15 = $filter11;
426         $filter15['prop-filters'][0]['param-filters'][0]['text-match'] = array(
427             'collation' => 'i;ascii-casemap',
428             'value' => 'dAtE',
429             'negate-condition' => false,
430         );
431         $filter16 = $filter15;
432         $filter16['prop-filters'][0]['param-filters'][0]['text-match']['collation'] = 'i;octet';
433
434         $filter17 = $filter15;
435         $filter17['prop-filters'][0]['param-filters'][0]['text-match']['negate-condition'] = true;
436
437         $filter18 = $filter15;
438         $filter18['prop-filters'][0]['param-filters'][0]['text-match']['negate-condition'] = true;
439         $filter18['prop-filters'][0]['param-filters'][0]['text-match']['collation'] = 'i;octet';
440
441         // prop + text
442         $filter19 = $filter5;
443         $filter19['comp-filters'][0]['prop-filters'] = array(
444             array(
445                 'name' => 'action',
446                 'is-not-defined' => false,
447                 'time-range' => null,
448                 'param-filters' => array(),
449                 'text-match' => array(
450                     'collation' => 'i;ascii-casemap',
451                     'value' => 'display',
452                     'negate-condition' => false,
453                 ),
454             ),
455         );
456
457         // Time range
458         $filter20 = array(
459             'name' => 'VEVENT',
460             'comp-filters' => array(),
461             'prop-filters' => array(),
462             'is-not-defined' => false,
463             'time-range' => array(
464                'start' => new DateTime('2011-01-01 10:00:00', new DateTimeZone('GMT')),
465                'end' => new DateTime('2011-01-01 13:00:00', new DateTimeZone('GMT')),
466             ),
467         );
468         // Time range, no end date
469         $filter21 = $filter20;
470         $filter21['time-range']['end'] = null;
471
472         // Time range, no start date
473         $filter22 = $filter20;
474         $filter22['time-range']['start'] = null;
475
476         // Time range, other dates
477         $filter23 = $filter20;
478         $filter23['time-range'] = array(
479            'start' => new DateTime('2011-02-01 10:00:00', new DateTimeZone('GMT')),
480            'end' => new DateTime('2011-02-01 13:00:00', new DateTimeZone('GMT')),
481         );
482         // Time range
483         $filter24 = array(
484             'name' => 'VTODO',
485             'comp-filters' => array(),
486             'prop-filters' => array(),
487             'is-not-defined' => false,
488             'time-range' => array(
489                'start' => new DateTime('2011-01-01 12:45:00', new DateTimeZone('GMT')),
490                'end' => new DateTime('2011-01-01 13:15:00', new DateTimeZone('GMT')),
491             ),
492         );
493         // Time range, other dates (1 month in the future)
494         $filter25 = $filter24;
495         $filter25['time-range'] = array(
496            'start' => new DateTime('2011-02-01 10:00:00', new DateTimeZone('GMT')),
497            'end' => new DateTime('2011-02-01 13:00:00', new DateTimeZone('GMT')),
498         );
499         $filter26 = $filter24;
500         $filter26['time-range'] = array(
501            'start' => new DateTime('2011-01-01 11:45:00', new DateTimeZone('GMT')),
502            'end' => new DateTime('2011-01-01 12:15:00', new DateTimeZone('GMT')),
503        );
504
505         // Time range for VJOURNAL
506         $filter27 = array(
507             'name' => 'VJOURNAL',
508             'comp-filters' => array(),
509             'prop-filters' => array(),
510             'is-not-defined' => false,
511             'time-range' => array(
512                'start' => new DateTime('2011-01-01 12:45:00', new DateTimeZone('GMT')),
513                'end' => new DateTime('2011-01-01 13:15:00', new DateTimeZone('GMT')),
514             ),
515         );
516         $filter28 = $filter27;
517         $filter28['time-range'] = array(
518            'start' => new DateTime('2011-01-01 11:45:00', new DateTimeZone('GMT')),
519            'end' => new DateTime('2011-01-01 12:15:00', new DateTimeZone('GMT')),
520         );
521         // Time range for VFREEBUSY
522         $filter29 = array(
523             'name' => 'VFREEBUSY',
524             'comp-filters' => array(),
525             'prop-filters' => array(),
526             'is-not-defined' => false,
527             'time-range' => array(
528                'start' => new DateTime('2011-01-01 12:45:00', new DateTimeZone('GMT')),
529                'end' => new DateTime('2011-01-01 13:15:00', new DateTimeZone('GMT')),
530             ),
531         );
532         // Time range filter on property
533         $filter30 = array(
534             'name' => 'VEVENT',
535             'comp-filters' => array(),
536             'prop-filters' => array(
537                 array(
538                     'name' => 'DTSTART',
539                     'is-not-defined' => false,
540                     'param-filters' => array(),
541                     'time-range' => array(
542                        'start' => new DateTime('2011-01-01 10:00:00', new DateTimeZone('GMT')),
543                        'end' => new DateTime('2011-01-01 13:00:00', new DateTimeZone('GMT')),
544                    ),
545                     'text-match' => null,
546                ),
547             ),
548             'is-not-defined' => false,
549             'time-range' => null,
550         );
551
552         // Time range for alarm
553         $filter31 = array(
554             'name' => 'VEVENT',
555             'prop-filters' => array(),
556             'comp-filters' => array(
557                 array(
558                     'name' => 'VALARM',
559                     'is-not-defined' => false,
560                     'comp-filters' => array(),
561                     'prop-filters' => array(),
562                     'time-range' => array(
563                        'start' => new DateTime('2011-01-01 10:45:00', new DateTimeZone('GMT')),
564                        'end' => new DateTime('2011-01-01 11:15:00', new DateTimeZone('GMT')),
565                     ),
566                     'text-match' => null,
567                ),
568             ),
569             'is-not-defined' => false,
570             'time-range' => null,
571         );
572         $filter32 = $filter31;
573         $filter32['comp-filters'][0]['time-range'] = array(
574            'start' => new DateTime('2011-01-01 11:45:00', new DateTimeZone('GMT')),
575            'end' => new DateTime('2011-01-01 12:15:00', new DateTimeZone('GMT')),
576        );
577
578         $filter33 = $filter31;
579         $filter33['name'] = 'VTODO';
580         $filter34 = $filter32;
581         $filter34['name'] = 'VTODO';
582         $filter35 = $filter31;
583         $filter35['name'] = 'VJOURNAL';
584         $filter36 = $filter32;
585         $filter36['name'] = 'VJOURNAL';
586
587         // Time range filter on non-datetime property
588         $filter37 = array(
589             'name' => 'VEVENT',
590             'comp-filters' => array(),
591             'prop-filters' => array(
592                 array(
593                     'name' => 'SUMMARY',
594                     'is-not-defined' => false,
595                     'param-filters' => array(),
596                     'time-range' => array(
597                        'start' => new DateTime('2011-01-01 10:00:00', new DateTimeZone('GMT')),
598                        'end' => new DateTime('2011-01-01 13:00:00', new DateTimeZone('GMT')),
599                    ),
600                     'text-match' => null,
601                ),
602             ),
603             'is-not-defined' => false,
604             'time-range' => null,
605         );
606
607         // Time-range with RRULE
608
609
610         return array(
611             // Component check
612
613             array($blob1, $filter1, 1),
614             array($blob1, $filter2, 0),
615             array($blob1, $filter3, 0),
616             array($blob1, $filter4, 1),
617
618             // Subcomponent check
619             array($blob1, $filter5, 0),
620             array($blob2, $filter5, 1),
621
622             // Property check
623             array($blob1, $filter6, 1),
624             array($blob1, $filter7, 0),
625             array($blob1, $filter8, 0),
626             array($blob1, $filter9, 1),
627
628             // Subcomponent + property
629             array($blob2, $filter10, 1),
630
631             // Param filter
632             array($blob3, $filter11, 1),
633             array($blob3, $filter12, 0),
634             array($blob3, $filter13, 0),
635             array($blob3, $filter14, 1),
636
637             // Param + text
638             array($blob3, $filter15, 1),
639             array($blob3, $filter16, 0),
640             array($blob3, $filter17, 0),
641             array($blob3, $filter18, 1),
642
643             // Prop + text
644             array($blob2, $filter19, 1),
645
646             // Incorrect object (vcard)
647             array($blob4, $filter1, -1),
648
649             // Time-range for event
650             array($blob5, $filter20, 1),
651             array($blob6, $filter20, 1),
652             array($blob7, $filter20, 1),
653             array($blob8, $filter20, 1),
654
655             array($blob5, $filter21, 1),
656             array($blob5, $filter22, 1),
657
658             array($blob5, $filter23, 0),
659             array($blob6, $filter23, 0),
660             array($blob7, $filter23, 0),
661             array($blob8, $filter23, 0),
662
663             // Time-range for todo
664             array($blob9, $filter24, 1),
665             array($blob9, $filter25, 0),
666             array($blob9, $filter26, 1),
667             array($blob10, $filter24, 1),
668             array($blob10, $filter25, 0),
669             array($blob10, $filter26, 1),
670
671             array($blob11, $filter24, 0),
672             array($blob11, $filter25, 0),
673             array($blob11, $filter26, 1),
674
675             array($blob12, $filter24, 1),
676             array($blob12, $filter25, 0),
677             array($blob12, $filter26, 0),
678
679             array($blob13, $filter24, 1),
680             array($blob13, $filter25, 0),
681             array($blob13, $filter26, 1),
682
683             array($blob14, $filter24, 1),
684             array($blob14, $filter25, 0),
685             array($blob14, $filter26, 0),
686
687             array($blob15, $filter24, 1),
688             array($blob15, $filter25, 1),
689             array($blob15, $filter26, 1),
690
691             array($blob16, $filter24, 1),
692             array($blob16, $filter25, 1),
693             array($blob16, $filter26, 1),
694
695             // Time-range for journals
696             array($blob17, $filter27, 0),
697             array($blob17, $filter28, 0),
698             array($blob18, $filter27, 0),
699             array($blob18, $filter28, 1),
700             array($blob19, $filter27, 1),
701             array($blob19, $filter28, 1),
702
703             // Time-range for free-busy
704             array($blob20, $filter29, -1),
705
706             // Time-range on property
707             array($blob5, $filter30, 1),
708             array($blob3, $filter37, -1),
709             array($blob3, $filter30, 0),
710
711             // Time-range on alarm in vevent
712             array($blob21, $filter31, 1),
713             array($blob21, $filter32, 0),
714             array($blob22, $filter31, 1),
715             array($blob22, $filter32, 0),
716             array($blob23, $filter31, 1),
717             array($blob23, $filter32, 0),
718             array($blob24, $filter31, 1),
719             array($blob24, $filter32, 0),
720             array($blob25, $filter31, 1),
721             array($blob25, $filter32, 0),
722             array($blob26, $filter31, 1),
723             array($blob26, $filter32, 0),
724
725             // Time-range on alarm for vtodo
726             array($blob27, $filter33, 1),
727             array($blob27, $filter34, 0),
728
729             // Time-range on alarm for vjournal
730             array($blob28, $filter35, -1),
731             array($blob28, $filter36, -1),
732
733             // Time-range on alarm with duration
734             array($blob29, $filter31, 1),
735             array($blob29, $filter32, 0),
736             array($blob30, $filter31, 0),
737             array($blob30, $filter32, 0),
738
739
740             // Time-range with RRULE
741             array($blob31, $filter20, 1),
742             array($blob32, $filter20, 0),
743
744         );
745
746     }
747
748 }