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