5 class Sabre_CalDAV_CalendarQueryValidatorTest extends PHPUnit_Framework_TestCase {
8 * @dataProvider provider
10 function testValid($icalObject, $filters, $outcome) {
12 $validator = new Sabre_CalDAV_CalendarQueryValidator();
14 // Wrapping filter in a VCALENDAR component filter, as this is always
17 'name' => 'VCALENDAR',
18 'comp-filters' => array($filters),
19 'prop-filters' => array(),
20 'is-not-defined' => false,
24 $vObject = VObject\Reader::read($icalObject);
28 $this->assertFalse($validator->validate($vObject, $filters));
31 $this->assertTrue($validator->validate($vObject, $filters));
35 $validator->validate($vObject, $filters);
36 } catch (Exception $e) {
70 DTSTART;VALUE=DATE:20110704
84 DTSTART:20110101T120000Z
85 DTEND:20110102T120000Z
93 DTSTART:20110101T120000Z
102 DTSTART;VALUE=DATE:20110101
110 DTSTART:20110101T120000Z
118 DTSTART:20110101T120000Z
126 DTSTART:20110101T120000Z
134 DTSTART:20110101T120000Z
150 COMPLETED:20110101T130000Z
151 CREATED:20110101T110000Z
159 COMPLETED:20110101T130000Z
167 CREATED:20110101T110000Z
190 DTSTART:20110101T120000Z
198 DTSTART;VALUE=DATE:20110101
213 DTSTART:20110101T120000Z
224 DTSTART:20110101T120000Z
226 TRIGGER;VALUE=DURATION:-PT1H
235 DTSTART:20110101T120000Z
237 TRIGGER;VALUE=DURATION;RELATED=END:-PT1H
246 DTSTART:20110101T120000Z
247 DTEND:20110101T130000Z
249 TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
258 DTSTART:20110101T120000Z
261 TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
270 DTSTART:20110101T120000Z
273 TRIGGER;VALUE=DATE-TIME:20110101T110000Z
283 DTSTART:20110101T120000Z
286 TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
295 DTSTART:20110101T120000Z
297 TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
306 DTSTART:20110101T120000Z
309 TRIGGER;VALUE=DATE-TIME:20110101T090000Z
320 DTSTART:20110101T120000Z
323 TRIGGER;VALUE=DATE-TIME:20110101T090000Z
333 DTSTART:20080101T120000Z
343 DTSTART:20080102T120000Z
352 DTSTART;VALUE=DATE:20120628
360 'comp-filters' => array(),
361 'prop-filters' => array(),
362 'is-not-defined' => false,
363 'time-range' => null,
366 $filter2['name'] = 'VTODO';
369 $filter3['is-not-defined'] = true;
372 $filter4['name'] = 'VTODO';
373 $filter4['is-not-defined'] = true;
376 $filter5['comp-filters'] = array(
379 'is-not-defined' => false,
380 'comp-filters' => array(),
381 'prop-filters' => array(),
382 'time-range' => null,
386 $filter6['prop-filters'] = array(
389 'is-not-defined' => false,
390 'param-filters' => array(),
391 'time-range' => null,
392 'text-match' => null,
396 $filter7['prop-filters'][0]['name'] = 'DESCRIPTION';
399 $filter8['prop-filters'][0]['is-not-defined'] = true;
402 $filter9['prop-filters'][0]['is-not-defined'] = true;
404 $filter10 = $filter5;
405 $filter10['prop-filters'] = $filter6['prop-filters'];
408 $filter11 = $filter1;
409 $filter11['prop-filters'] = array(
412 'is-not-defined' => false,
413 'param-filters' => array(
416 'is-not-defined' => false,
417 'text-match' => null,
420 'time-range' => null,
421 'text-match' => null,
425 $filter12 = $filter11;
426 $filter12['prop-filters'][0]['param-filters'][0]['name'] = 'TZID';
428 $filter13 = $filter11;
429 $filter13['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
431 $filter14 = $filter12;
432 $filter14['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
435 $filter15 = $filter11;
436 $filter15['prop-filters'][0]['param-filters'][0]['text-match'] = array(
437 'collation' => 'i;ascii-casemap',
439 'negate-condition' => false,
441 $filter16 = $filter15;
442 $filter16['prop-filters'][0]['param-filters'][0]['text-match']['collation'] = 'i;octet';
444 $filter17 = $filter15;
445 $filter17['prop-filters'][0]['param-filters'][0]['text-match']['negate-condition'] = true;
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';
452 $filter19 = $filter5;
453 $filter19['comp-filters'][0]['prop-filters'] = array(
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,
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')),
478 // Time range, no end date
479 $filter21 = $filter20;
480 $filter21['time-range']['end'] = null;
482 // Time range, no start date
483 $filter22 = $filter20;
484 $filter22['time-range']['start'] = null;
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')),
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')),
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')),
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')),
515 // Time range for VJOURNAL
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')),
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')),
531 // Time range for VFREEBUSY
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')),
542 // Time range filter on property
545 'comp-filters' => array(),
546 'prop-filters' => array(
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')),
555 'text-match' => null,
558 'is-not-defined' => false,
559 'time-range' => null,
562 // Time range for alarm
565 'prop-filters' => array(),
566 'comp-filters' => array(
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')),
576 'text-match' => null,
579 'is-not-defined' => false,
580 'time-range' => null,
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')),
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';
597 // Time range filter on non-datetime property
600 'comp-filters' => array(),
601 'prop-filters' => array(
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')),
610 'text-match' => null,
613 'is-not-defined' => false,
614 'time-range' => null,
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')),
631 array($blob1, $filter1, 1),
632 array($blob1, $filter2, 0),
633 array($blob1, $filter3, 0),
634 array($blob1, $filter4, 1),
636 // Subcomponent check
637 array($blob1, $filter5, 0),
638 array($blob2, $filter5, 1),
641 array($blob1, $filter6, 1),
642 array($blob1, $filter7, 0),
643 array($blob1, $filter8, 0),
644 array($blob1, $filter9, 1),
646 // Subcomponent + property
647 array($blob2, $filter10, 1),
650 array($blob3, $filter11, 1),
651 array($blob3, $filter12, 0),
652 array($blob3, $filter13, 0),
653 array($blob3, $filter14, 1),
656 array($blob3, $filter15, 1),
657 array($blob3, $filter16, 0),
658 array($blob3, $filter17, 0),
659 array($blob3, $filter18, 1),
662 array($blob2, $filter19, 1),
664 // Incorrect object (vcard)
665 array($blob4, $filter1, -1),
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),
673 array($blob5, $filter21, 1),
674 array($blob5, $filter22, 1),
676 array($blob5, $filter23, 0),
677 array($blob6, $filter23, 0),
678 array($blob7, $filter23, 0),
679 array($blob8, $filter23, 0),
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),
689 array($blob11, $filter24, 0),
690 array($blob11, $filter25, 0),
691 array($blob11, $filter26, 1),
693 array($blob12, $filter24, 1),
694 array($blob12, $filter25, 0),
695 array($blob12, $filter26, 0),
697 array($blob13, $filter24, 1),
698 array($blob13, $filter25, 0),
699 array($blob13, $filter26, 1),
701 array($blob14, $filter24, 1),
702 array($blob14, $filter25, 0),
703 array($blob14, $filter26, 0),
705 array($blob15, $filter24, 1),
706 array($blob15, $filter25, 1),
707 array($blob15, $filter26, 1),
709 array($blob16, $filter24, 1),
710 array($blob16, $filter25, 1),
711 array($blob16, $filter26, 1),
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),
721 // Time-range for free-busy
722 array($blob20, $filter29, -1),
724 // Time-range on property
725 array($blob5, $filter30, 1),
726 array($blob3, $filter37, -1),
727 array($blob3, $filter30, 0),
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),
743 // Time-range on alarm for vtodo
744 array($blob27, $filter33, 1),
745 array($blob27, $filter34, 0),
747 // Time-range on alarm for vjournal
748 array($blob28, $filter35, -1),
749 array($blob28, $filter36, -1),
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),
758 // Time-range with RRULE
759 array($blob31, $filter20, 1),
760 array($blob32, $filter20, 0),
762 // Bug reported on mailing list, related to all-day events.
763 array($blob33, $filter38, 1),