3 class Sabre_CalDAV_CalendarQueryValidatorTest extends PHPUnit_Framework_TestCase {
6 * @dataProvider provider
8 function testValid($icalObject, $filters, $outcome) {
10 $validator = new Sabre_CalDAV_CalendarQueryValidator();
12 // Wrapping filter in a VCALENDAR component filter, as this is always
15 'name' => 'VCALENDAR',
16 'comp-filters' => array($filters),
17 'prop-filters' => array(),
18 'is-not-defined' => false,
22 $vObject = Sabre_VObject_Reader::read($icalObject);
26 $this->assertFalse($validator->validate($vObject, $filters));
29 $this->assertTrue($validator->validate($vObject, $filters));
33 $validator->validate($vObject, $filters);
34 } catch (Sabre_DAV_Exception $e) {
68 DTSTART;VALUE=DATE:20110704
82 DTSTART:20110101T120000Z
83 DTEND:20110102T120000Z
91 DTSTART:20110101T120000Z
100 DTSTART;VALUE=DATE:20110101
108 DTSTART:20110101T120000Z
116 DTSTART:20110101T120000Z
124 DTSTART:20110101T120000Z
132 DTSTART:20110101T120000Z
148 COMPLETED:20110101T130000Z
149 CREATED:20110101T110000Z
157 COMPLETED:20110101T130000Z
165 CREATED:20110101T110000Z
188 DTSTART:20110101T120000Z
196 DTSTART;VALUE=DATE:20110101
211 DTSTART:20110101T120000Z
222 DTSTART:20110101T120000Z
224 TRIGGER;VALUE=DURATION:-PT1H
233 DTSTART:20110101T120000Z
235 TRIGGER;VALUE=DURATION;RELATED=END:-PT1H
244 DTSTART:20110101T120000Z
245 DTEND:20110101T130000Z
247 TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
256 DTSTART:20110101T120000Z
259 TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
268 DTSTART:20110101T120000Z
271 TRIGGER;VALUE=DATE-TIME:20110101T110000Z
281 DTSTART:20110101T120000Z
284 TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
293 DTSTART:20110101T120000Z
295 TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
304 DTSTART:20110101T120000Z
307 TRIGGER;VALUE=DATE-TIME:20110101T090000Z
318 DTSTART:20110101T120000Z
321 TRIGGER;VALUE=DATE-TIME:20110101T090000Z
331 DTSTART:20080101T120000Z
341 DTSTART:20080102T120000Z
350 DTSTART;VALUE=DATE:20120628
358 'comp-filters' => array(),
359 'prop-filters' => array(),
360 'is-not-defined' => false,
361 'time-range' => null,
364 $filter2['name'] = 'VTODO';
367 $filter3['is-not-defined'] = true;
370 $filter4['name'] = 'VTODO';
371 $filter4['is-not-defined'] = true;
374 $filter5['comp-filters'] = array(
377 'is-not-defined' => false,
378 'comp-filters' => array(),
379 'prop-filters' => array(),
380 'time-range' => null,
384 $filter6['prop-filters'] = array(
387 'is-not-defined' => false,
388 'param-filters' => array(),
389 'time-range' => null,
390 'text-match' => null,
394 $filter7['prop-filters'][0]['name'] = 'DESCRIPTION';
397 $filter8['prop-filters'][0]['is-not-defined'] = true;
400 $filter9['prop-filters'][0]['is-not-defined'] = true;
402 $filter10 = $filter5;
403 $filter10['prop-filters'] = $filter6['prop-filters'];
406 $filter11 = $filter1;
407 $filter11['prop-filters'] = array(
410 'is-not-defined' => false,
411 'param-filters' => array(
414 'is-not-defined' => false,
415 'text-match' => null,
418 'time-range' => null,
419 'text-match' => null,
423 $filter12 = $filter11;
424 $filter12['prop-filters'][0]['param-filters'][0]['name'] = 'TZID';
426 $filter13 = $filter11;
427 $filter13['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
429 $filter14 = $filter12;
430 $filter14['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
433 $filter15 = $filter11;
434 $filter15['prop-filters'][0]['param-filters'][0]['text-match'] = array(
435 'collation' => 'i;ascii-casemap',
437 'negate-condition' => false,
439 $filter16 = $filter15;
440 $filter16['prop-filters'][0]['param-filters'][0]['text-match']['collation'] = 'i;octet';
442 $filter17 = $filter15;
443 $filter17['prop-filters'][0]['param-filters'][0]['text-match']['negate-condition'] = true;
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';
450 $filter19 = $filter5;
451 $filter19['comp-filters'][0]['prop-filters'] = array(
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,
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')),
476 // Time range, no end date
477 $filter21 = $filter20;
478 $filter21['time-range']['end'] = null;
480 // Time range, no start date
481 $filter22 = $filter20;
482 $filter22['time-range']['start'] = null;
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')),
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')),
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')),
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')),
513 // Time range for VJOURNAL
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')),
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')),
529 // Time range for VFREEBUSY
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')),
540 // Time range filter on property
543 'comp-filters' => array(),
544 'prop-filters' => array(
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')),
553 'text-match' => null,
556 'is-not-defined' => false,
557 'time-range' => null,
560 // Time range for alarm
563 'prop-filters' => array(),
564 'comp-filters' => array(
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')),
574 'text-match' => null,
577 'is-not-defined' => false,
578 'time-range' => null,
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')),
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';
595 // Time range filter on non-datetime property
598 'comp-filters' => array(),
599 'prop-filters' => array(
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')),
608 'text-match' => null,
611 'is-not-defined' => false,
612 'time-range' => null,
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')),
629 array($blob1, $filter1, 1),
630 array($blob1, $filter2, 0),
631 array($blob1, $filter3, 0),
632 array($blob1, $filter4, 1),
634 // Subcomponent check
635 array($blob1, $filter5, 0),
636 array($blob2, $filter5, 1),
639 array($blob1, $filter6, 1),
640 array($blob1, $filter7, 0),
641 array($blob1, $filter8, 0),
642 array($blob1, $filter9, 1),
644 // Subcomponent + property
645 array($blob2, $filter10, 1),
648 array($blob3, $filter11, 1),
649 array($blob3, $filter12, 0),
650 array($blob3, $filter13, 0),
651 array($blob3, $filter14, 1),
654 array($blob3, $filter15, 1),
655 array($blob3, $filter16, 0),
656 array($blob3, $filter17, 0),
657 array($blob3, $filter18, 1),
660 array($blob2, $filter19, 1),
662 // Incorrect object (vcard)
663 array($blob4, $filter1, -1),
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),
671 array($blob5, $filter21, 1),
672 array($blob5, $filter22, 1),
674 array($blob5, $filter23, 0),
675 array($blob6, $filter23, 0),
676 array($blob7, $filter23, 0),
677 array($blob8, $filter23, 0),
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),
687 array($blob11, $filter24, 0),
688 array($blob11, $filter25, 0),
689 array($blob11, $filter26, 1),
691 array($blob12, $filter24, 1),
692 array($blob12, $filter25, 0),
693 array($blob12, $filter26, 0),
695 array($blob13, $filter24, 1),
696 array($blob13, $filter25, 0),
697 array($blob13, $filter26, 1),
699 array($blob14, $filter24, 1),
700 array($blob14, $filter25, 0),
701 array($blob14, $filter26, 0),
703 array($blob15, $filter24, 1),
704 array($blob15, $filter25, 1),
705 array($blob15, $filter26, 1),
707 array($blob16, $filter24, 1),
708 array($blob16, $filter25, 1),
709 array($blob16, $filter26, 1),
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),
719 // Time-range for free-busy
720 array($blob20, $filter29, -1),
722 // Time-range on property
723 array($blob5, $filter30, 1),
724 array($blob3, $filter37, -1),
725 array($blob3, $filter30, 0),
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),
741 // Time-range on alarm for vtodo
742 array($blob27, $filter33, 1),
743 array($blob27, $filter34, 0),
745 // Time-range on alarm for vjournal
746 array($blob28, $filter35, -1),
747 array($blob28, $filter36, -1),
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),
756 // Time-range with RRULE
757 array($blob31, $filter20, 1),
758 array($blob32, $filter20, 0),
760 // Bug reported on mailing list, related to all-day events.
761 array($blob33, $filter38, 1),