]> git.mxchange.org Git - friendica-addons.git/blob - dav/SabreDAV/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php
Move friendica-specific parts into an own subdirectory
[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         $blob33 = <<<yow
348 BEGIN:VCALENDAR
349 BEGIN:VEVENT
350 DTSTART;VALUE=DATE:20120628
351 RRULE:FREQ=DAILY
352 END:VEVENT
353 END:VCALENDAR
354 yow;
355
356         $filter1 = array(
357             'name' => 'VEVENT',
358             'comp-filters' => array(),
359             'prop-filters' => array(),
360             'is-not-defined' => false,
361             'time-range' => null,
362         );
363         $filter2 = $filter1;
364         $filter2['name'] = 'VTODO';
365
366         $filter3 = $filter1;
367         $filter3['is-not-defined'] = true;
368
369         $filter4 = $filter1;
370         $filter4['name'] = 'VTODO';
371         $filter4['is-not-defined'] = true;
372
373         $filter5 = $filter1;
374         $filter5['comp-filters'] = array(
375             array(
376                 'name' => 'VALARM',
377                 'is-not-defined' => false,
378                 'comp-filters' => array(),
379                 'prop-filters' => array(),
380                 'time-range' => null,
381             ),
382         );
383         $filter6 = $filter1;
384         $filter6['prop-filters'] = array(
385             array(
386                 'name' => 'SUMMARY',
387                 'is-not-defined' => false,
388                 'param-filters' => array(),
389                 'time-range' => null,
390                 'text-match' => null,
391             ),
392         );
393         $filter7 = $filter6;
394         $filter7['prop-filters'][0]['name'] = 'DESCRIPTION';
395
396         $filter8 = $filter6;
397         $filter8['prop-filters'][0]['is-not-defined'] = true;
398
399         $filter9 = $filter7;
400         $filter9['prop-filters'][0]['is-not-defined'] = true;
401
402         $filter10 = $filter5;
403         $filter10['prop-filters'] = $filter6['prop-filters'];
404
405         // Param filters
406         $filter11 = $filter1;
407         $filter11['prop-filters'] = array(
408             array(
409                 'name' => 'DTSTART',
410                 'is-not-defined' => false,
411                 'param-filters' => array(
412                     array(
413                         'name' => 'VALUE',
414                         'is-not-defined' => false,
415                         'text-match' => null,
416                     ),
417                 ),
418                 'time-range' => null,
419                 'text-match' => null,
420             ),
421         );
422
423         $filter12 = $filter11;
424         $filter12['prop-filters'][0]['param-filters'][0]['name'] = 'TZID';
425
426         $filter13 = $filter11;
427         $filter13['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
428
429         $filter14 = $filter12;
430         $filter14['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
431
432         // Param text filter
433         $filter15 = $filter11;
434         $filter15['prop-filters'][0]['param-filters'][0]['text-match'] = array(
435             'collation' => 'i;ascii-casemap',
436             'value' => 'dAtE',
437             'negate-condition' => false,
438         );
439         $filter16 = $filter15;
440         $filter16['prop-filters'][0]['param-filters'][0]['text-match']['collation'] = 'i;octet';
441
442         $filter17 = $filter15;
443         $filter17['prop-filters'][0]['param-filters'][0]['text-match']['negate-condition'] = true;
444
445         $filter18 = $filter15;
446         $filter18['prop-filters'][0]['param-filters'][0]['text-match']['negate-condition'] = true;
447         $filter18['prop-filters'][0]['param-filters'][0]['text-match']['collation'] = 'i;octet';
448
449         // prop + text
450         $filter19 = $filter5;
451         $filter19['comp-filters'][0]['prop-filters'] = array(
452             array(
453                 'name' => 'action',
454                 'is-not-defined' => false,
455                 'time-range' => null,
456                 'param-filters' => array(),
457                 'text-match' => array(
458                     'collation' => 'i;ascii-casemap',
459                     'value' => 'display',
460                     'negate-condition' => false,
461                 ),
462             ),
463         );
464
465         // Time range
466         $filter20 = array(
467             'name' => 'VEVENT',
468             'comp-filters' => array(),
469             'prop-filters' => array(),
470             'is-not-defined' => false,
471             'time-range' => array(
472                'start' => new DateTime('2011-01-01 10:00:00', new DateTimeZone('GMT')),
473                'end' => new DateTime('2011-01-01 13:00:00', new DateTimeZone('GMT')),
474             ),
475         );
476         // Time range, no end date
477         $filter21 = $filter20;
478         $filter21['time-range']['end'] = null;
479
480         // Time range, no start date
481         $filter22 = $filter20;
482         $filter22['time-range']['start'] = null;
483
484         // Time range, other dates
485         $filter23 = $filter20;
486         $filter23['time-range'] = array(
487            'start' => new DateTime('2011-02-01 10:00:00', new DateTimeZone('GMT')),
488            'end' => new DateTime('2011-02-01 13:00:00', new DateTimeZone('GMT')),
489         );
490         // Time range
491         $filter24 = array(
492             'name' => 'VTODO',
493             'comp-filters' => array(),
494             'prop-filters' => array(),
495             'is-not-defined' => false,
496             'time-range' => array(
497                'start' => new DateTime('2011-01-01 12:45:00', new DateTimeZone('GMT')),
498                'end' => new DateTime('2011-01-01 13:15:00', new DateTimeZone('GMT')),
499             ),
500         );
501         // Time range, other dates (1 month in the future)
502         $filter25 = $filter24;
503         $filter25['time-range'] = array(
504            'start' => new DateTime('2011-02-01 10:00:00', new DateTimeZone('GMT')),
505            'end' => new DateTime('2011-02-01 13:00:00', new DateTimeZone('GMT')),
506         );
507         $filter26 = $filter24;
508         $filter26['time-range'] = array(
509            'start' => new DateTime('2011-01-01 11:45:00', new DateTimeZone('GMT')),
510            'end' => new DateTime('2011-01-01 12:15:00', new DateTimeZone('GMT')),
511        );
512
513         // Time range for VJOURNAL
514         $filter27 = array(
515             'name' => 'VJOURNAL',
516             'comp-filters' => array(),
517             'prop-filters' => array(),
518             'is-not-defined' => false,
519             'time-range' => array(
520                'start' => new DateTime('2011-01-01 12:45:00', new DateTimeZone('GMT')),
521                'end' => new DateTime('2011-01-01 13:15:00', new DateTimeZone('GMT')),
522             ),
523         );
524         $filter28 = $filter27;
525         $filter28['time-range'] = array(
526            'start' => new DateTime('2011-01-01 11:45:00', new DateTimeZone('GMT')),
527            'end' => new DateTime('2011-01-01 12:15:00', new DateTimeZone('GMT')),
528         );
529         // Time range for VFREEBUSY
530         $filter29 = array(
531             'name' => 'VFREEBUSY',
532             'comp-filters' => array(),
533             'prop-filters' => array(),
534             'is-not-defined' => false,
535             'time-range' => array(
536                'start' => new DateTime('2011-01-01 12:45:00', new DateTimeZone('GMT')),
537                'end' => new DateTime('2011-01-01 13:15:00', new DateTimeZone('GMT')),
538             ),
539         );
540         // Time range filter on property
541         $filter30 = array(
542             'name' => 'VEVENT',
543             'comp-filters' => array(),
544             'prop-filters' => array(
545                 array(
546                     'name' => 'DTSTART',
547                     'is-not-defined' => false,
548                     'param-filters' => array(),
549                     'time-range' => array(
550                        'start' => new DateTime('2011-01-01 10:00:00', new DateTimeZone('GMT')),
551                        'end' => new DateTime('2011-01-01 13:00:00', new DateTimeZone('GMT')),
552                    ),
553                     'text-match' => null,
554                ),
555             ),
556             'is-not-defined' => false,
557             'time-range' => null,
558         );
559
560         // Time range for alarm
561         $filter31 = array(
562             'name' => 'VEVENT',
563             'prop-filters' => array(),
564             'comp-filters' => array(
565                 array(
566                     'name' => 'VALARM',
567                     'is-not-defined' => false,
568                     'comp-filters' => array(),
569                     'prop-filters' => array(),
570                     'time-range' => array(
571                        'start' => new DateTime('2011-01-01 10:45:00', new DateTimeZone('GMT')),
572                        'end' => new DateTime('2011-01-01 11:15:00', new DateTimeZone('GMT')),
573                     ),
574                     'text-match' => null,
575                ),
576             ),
577             'is-not-defined' => false,
578             'time-range' => null,
579         );
580         $filter32 = $filter31;
581         $filter32['comp-filters'][0]['time-range'] = array(
582            'start' => new DateTime('2011-01-01 11:45:00', new DateTimeZone('GMT')),
583            'end' => new DateTime('2011-01-01 12:15:00', new DateTimeZone('GMT')),
584        );
585
586         $filter33 = $filter31;
587         $filter33['name'] = 'VTODO';
588         $filter34 = $filter32;
589         $filter34['name'] = 'VTODO';
590         $filter35 = $filter31;
591         $filter35['name'] = 'VJOURNAL';
592         $filter36 = $filter32;
593         $filter36['name'] = 'VJOURNAL';
594
595         // Time range filter on non-datetime property
596         $filter37 = array(
597             'name' => 'VEVENT',
598             'comp-filters' => array(),
599             'prop-filters' => array(
600                 array(
601                     'name' => 'SUMMARY',
602                     'is-not-defined' => false,
603                     'param-filters' => array(),
604                     'time-range' => array(
605                        'start' => new DateTime('2011-01-01 10:00:00', new DateTimeZone('GMT')),
606                        'end' => new DateTime('2011-01-01 13:00:00', new DateTimeZone('GMT')),
607                    ),
608                     'text-match' => null,
609                ),
610             ),
611             'is-not-defined' => false,
612             'time-range' => null,
613         );
614
615         $filter38 = array(
616             'name' => 'VEVENT',
617             'comp-filters' => array(),
618             'prop-filters' => array(),
619             'is-not-defined' => false,
620             'time-range' => array(
621                 'start' => new DateTime('2012-07-01 00:00:00', new DateTimeZone('UTC')),
622                 'end' => new DateTime('2012-08-01 00:00:00', new DateTimeZone('UTC')),
623             )
624         );
625
626         return array(
627             // Component check
628
629             array($blob1, $filter1, 1),
630             array($blob1, $filter2, 0),
631             array($blob1, $filter3, 0),
632             array($blob1, $filter4, 1),
633
634             // Subcomponent check
635             array($blob1, $filter5, 0),
636             array($blob2, $filter5, 1),
637
638             // Property check
639             array($blob1, $filter6, 1),
640             array($blob1, $filter7, 0),
641             array($blob1, $filter8, 0),
642             array($blob1, $filter9, 1),
643
644             // Subcomponent + property
645             array($blob2, $filter10, 1),
646
647             // Param filter
648             array($blob3, $filter11, 1),
649             array($blob3, $filter12, 0),
650             array($blob3, $filter13, 0),
651             array($blob3, $filter14, 1),
652
653             // Param + text
654             array($blob3, $filter15, 1),
655             array($blob3, $filter16, 0),
656             array($blob3, $filter17, 0),
657             array($blob3, $filter18, 1),
658
659             // Prop + text
660             array($blob2, $filter19, 1),
661
662             // Incorrect object (vcard)
663             array($blob4, $filter1, -1),
664
665             // Time-range for event
666             array($blob5, $filter20, 1),
667             array($blob6, $filter20, 1),
668             array($blob7, $filter20, 1),
669             array($blob8, $filter20, 1),
670
671             array($blob5, $filter21, 1),
672             array($blob5, $filter22, 1),
673
674             array($blob5, $filter23, 0),
675             array($blob6, $filter23, 0),
676             array($blob7, $filter23, 0),
677             array($blob8, $filter23, 0),
678
679             // Time-range for todo
680             array($blob9, $filter24, 1),
681             array($blob9, $filter25, 0),
682             array($blob9, $filter26, 1),
683             array($blob10, $filter24, 1),
684             array($blob10, $filter25, 0),
685             array($blob10, $filter26, 1),
686
687             array($blob11, $filter24, 0),
688             array($blob11, $filter25, 0),
689             array($blob11, $filter26, 1),
690
691             array($blob12, $filter24, 1),
692             array($blob12, $filter25, 0),
693             array($blob12, $filter26, 0),
694
695             array($blob13, $filter24, 1),
696             array($blob13, $filter25, 0),
697             array($blob13, $filter26, 1),
698
699             array($blob14, $filter24, 1),
700             array($blob14, $filter25, 0),
701             array($blob14, $filter26, 0),
702
703             array($blob15, $filter24, 1),
704             array($blob15, $filter25, 1),
705             array($blob15, $filter26, 1),
706
707             array($blob16, $filter24, 1),
708             array($blob16, $filter25, 1),
709             array($blob16, $filter26, 1),
710
711             // Time-range for journals
712             array($blob17, $filter27, 0),
713             array($blob17, $filter28, 0),
714             array($blob18, $filter27, 0),
715             array($blob18, $filter28, 1),
716             array($blob19, $filter27, 1),
717             array($blob19, $filter28, 1),
718
719             // Time-range for free-busy
720             array($blob20, $filter29, -1),
721
722             // Time-range on property
723             array($blob5, $filter30, 1),
724             array($blob3, $filter37, -1),
725             array($blob3, $filter30, 0),
726
727             // Time-range on alarm in vevent
728             array($blob21, $filter31, 1),
729             array($blob21, $filter32, 0),
730             array($blob22, $filter31, 1),
731             array($blob22, $filter32, 0),
732             array($blob23, $filter31, 1),
733             array($blob23, $filter32, 0),
734             array($blob24, $filter31, 1),
735             array($blob24, $filter32, 0),
736             array($blob25, $filter31, 1),
737             array($blob25, $filter32, 0),
738             array($blob26, $filter31, 1),
739             array($blob26, $filter32, 0),
740
741             // Time-range on alarm for vtodo
742             array($blob27, $filter33, 1),
743             array($blob27, $filter34, 0),
744
745             // Time-range on alarm for vjournal
746             array($blob28, $filter35, -1),
747             array($blob28, $filter36, -1),
748
749             // Time-range on alarm with duration
750             array($blob29, $filter31, 1),
751             array($blob29, $filter32, 0),
752             array($blob30, $filter31, 0),
753             array($blob30, $filter32, 0),
754
755
756             // Time-range with RRULE
757             array($blob31, $filter20, 1),
758             array($blob32, $filter20, 0),
759
760             // Bug reported on mailing list, related to all-day events.
761             array($blob33, $filter38, 1),
762
763         );
764
765     }
766
767 }