]> git.mxchange.org Git - friendica-addons.git/blobdiff - dav/SabreDAV/tests/Sabre/CalDAV/CalendarQueryParserTest.php
Initial Release of the calendar plugin
[friendica-addons.git] / dav / SabreDAV / tests / Sabre / CalDAV / CalendarQueryParserTest.php
diff --git a/dav/SabreDAV/tests/Sabre/CalDAV/CalendarQueryParserTest.php b/dav/SabreDAV/tests/Sabre/CalDAV/CalendarQueryParserTest.php
new file mode 100644 (file)
index 0000000..fa37346
--- /dev/null
@@ -0,0 +1,537 @@
+<?php
+
+class Sabre_CalDAV_CalendarQueryParserTest extends PHPUnit_Framework_TestCase {
+
+    function parse($xml) {
+
+        $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+        $dom = Sabre_DAV_XMLUtil::loadDOMDocument($xml);
+
+        $q = new Sabre_CalDAV_CalendarQueryParser($dom);
+        $q->parse();
+        return $q->filters;
+
+    }
+
+    /**
+     * @expectedException Sabre_DAV_Exception_BadRequest
+     */
+    function testNoFilter() {
+
+        $xml = array();
+        $this->parse($xml);
+
+    }
+
+    /**
+     * @expectedException Sabre_DAV_Exception_BadRequest
+     */
+    function testTwoCompFilter() {
+
+        $xml = array(
+            '<c:filter>',
+            '  <c:comp-filter name="VEVENT" />',
+            '  <c:comp-filter name="VEVENT" />',
+            '</c:filter>'
+        );
+        $this->parse($xml);
+
+    }
+
+    function testBasicFilter() {
+
+        $xml = array(
+            '<c:filter>',
+            '  <c:comp-filter name="VCALENDAR" />',
+            '</c:filter>'
+        );
+        $result = $this->parse($xml);
+
+        $expected = array(
+            'name' => 'VCALENDAR',
+            'comp-filters' => array(),
+            'prop-filters' => array(),
+            'is-not-defined' => false,
+            'time-range' => false
+        );
+
+        $this->assertEquals(
+            $expected,
+            $result
+        );
+
+    }
+
+    function testCompIsNotDefined() {
+
+        $xml = array(
+            '<c:filter>',
+            '  <c:comp-filter name="VCALENDAR">',
+            '    <c:comp-filter name="VEVENT">',
+            '       <c:is-not-defined/>',
+            '    </c:comp-filter>',
+            '  </c:comp-filter>',
+            '</c:filter>'
+        );
+        $result = $this->parse($xml);
+
+        $expected = array(
+            'name' => 'VCALENDAR',
+            'comp-filters' => array(
+                array(
+                    'name' => 'VEVENT',
+                    'comp-filters' => array(),
+                    'prop-filters' => array(),
+                    'is-not-defined' => true,
+                    'time-range' => false
+                ),
+            ),
+            'prop-filters' => array(),
+            'is-not-defined' => false,
+            'time-range' => false
+        );
+
+        $this->assertEquals(
+            $expected,
+            $result
+        );
+
+    }
+
+    /**
+     * @expectedException Sabre_DAV_Exception_BadRequest
+     */
+    function testCompTimeRangeOnVCALENDAR() {
+
+        $xml = array(
+            '<c:filter>',
+            '  <c:comp-filter name="VCALENDAR">',
+            '     <c:time-range start="20110101T000000Z" end="20111231T235959Z" />',
+            '  </c:comp-filter>',
+            '</c:filter>'
+        );
+        $result = $this->parse($xml);
+
+    }
+
+    function testCompTimeRange() {
+
+        $xml = array(
+            '<c:filter>',
+            '  <c:comp-filter name="VCALENDAR">',
+            '    <c:comp-filter name="VEVENT">',
+            '       <c:time-range start="20110101T000000Z" end="20111231T235959Z" />',
+            '    </c:comp-filter>',
+            '    <c:comp-filter name="VTODO">',
+            '       <c:time-range start="20110101T000000Z" />',
+            '    </c:comp-filter>',
+            '    <c:comp-filter name="VJOURNAL">',
+            '       <c:time-range end="20111231T235959Z" />',
+            '    </c:comp-filter>',
+            '  </c:comp-filter>',
+            '</c:filter>'
+        );
+        $result = $this->parse($xml);
+
+        $expected = array(
+            'name' => 'VCALENDAR',
+            'comp-filters' => array(
+                array(
+                    'name' => 'VEVENT',
+                    'comp-filters' => array(),
+                    'prop-filters' => array(),
+                    'is-not-defined' => false,
+                    'time-range' => array(
+                        'start' => new DateTime('2011-01-01 00:00:00', new DateTimeZone('GMT')),
+                        'end' => new DateTime('2011-12-31 23:59:59', new DateTimeZone('GMT')),
+                    ),
+                ),
+                array(
+                    'name' => 'VTODO',
+                    'comp-filters' => array(),
+                    'prop-filters' => array(),
+                    'is-not-defined' => false,
+                    'time-range' => array(
+                        'start' => new DateTime('2011-01-01 00:00:00', new DateTimeZone('GMT')),
+                        'end' => null,
+                    ),
+                ),
+                array(
+                    'name' => 'VJOURNAL',
+                    'comp-filters' => array(),
+                    'prop-filters' => array(),
+                    'is-not-defined' => false,
+                    'time-range' => array(
+                        'start' => null,
+                        'end' => new DateTime('2011-12-31 23:59:59', new DateTimeZone('GMT')),
+                    ),
+                ),
+            ),
+            'prop-filters' => array(),
+            'is-not-defined' => false,
+            'time-range' => false
+        );
+
+        $this->assertEquals(
+            $expected,
+            $result
+        );
+
+    }
+
+    /**
+     * @expectedException Sabre_DAV_Exception_BadRequest
+     */
+    function testCompTimeRangeBadRange() {
+
+        $xml = array(
+            '<c:filter>',
+            '  <c:comp-filter name="VCALENDAR">',
+            '    <c:comp-filter name="VEVENT">',
+            '       <c:time-range start="20110101T000000Z" end="20100101T000000Z" />',
+            '    </c:comp-filter>',
+            '  </c:comp-filter>',
+            '</c:filter>'
+        );
+        $this->parse($xml);
+
+    }
+
+    function testProp() {
+
+        $xml = array(
+            '<c:filter>',
+            '  <c:comp-filter name="VCALENDAR">',
+            '    <c:comp-filter name="VEVENT">',
+            '       <c:prop-filter name="SUMMARY">',
+            '           <c:text-match>vacation</c:text-match>',
+            '       </c:prop-filter>',
+            '    </c:comp-filter>',
+            '  </c:comp-filter>',
+            '</c:filter>'
+        );
+        $result = $this->parse($xml);
+
+        $expected = array(
+            'name' => 'VCALENDAR',
+            'comp-filters' => array(
+                array(
+                    'name' => 'VEVENT',
+                    'is-not-defined' => false,
+                    'comp-filters' => array(),
+                    'prop-filters' => array(
+                        array(
+                            'name' => 'SUMMARY',
+                            'is-not-defined' => false,
+                            'param-filters' => array(),
+                            'text-match' => array(
+                                'negate-condition' => false,
+                                'collation' => 'i;ascii-casemap',
+                                'value' => 'vacation',
+                            ),
+                            'time-range' => null,
+                       ),
+                    ),
+                    'time-range' => null,
+                ),
+            ),
+            'prop-filters' => array(),
+            'is-not-defined' => false,
+            'time-range' => false
+        );
+
+        $this->assertEquals(
+            $expected,
+            $result
+        );
+
+    }
+
+    function testComplex() {
+
+        $xml = array(
+            '<c:filter>',
+            '  <c:comp-filter name="VCALENDAR">',
+            '    <c:comp-filter name="VEVENT">',
+            '       <c:prop-filter name="SUMMARY">',
+            '           <c:text-match collation="i;unicode-casemap">vacation</c:text-match>',
+            '       </c:prop-filter>',
+            '       <c:prop-filter name="DTSTAMP">',
+            '           <c:time-range start="20110704T000000Z" />',
+            '       </c:prop-filter>',
+            '       <c:prop-filter name="ORGANIZER">',
+            '           <c:is-not-defined />',
+            '       </c:prop-filter>',
+            '       <c:prop-filter name="DTSTART">',
+            '           <c:param-filter name="VALUE">',
+            '               <c:text-match negate-condition="yes">DATE</c:text-match>',
+            '           </c:param-filter>',
+            '       </c:prop-filter>',
+            '    </c:comp-filter>',
+            '  </c:comp-filter>',
+            '</c:filter>'
+        );
+        $result = $this->parse($xml);
+
+        $expected = array(
+            'name' => 'VCALENDAR',
+            'comp-filters' => array(
+                array(
+                    'name' => 'VEVENT',
+                    'is-not-defined' => false,
+                    'comp-filters' => array(),
+                    'prop-filters' => array(
+                        array(
+                            'name' => 'SUMMARY',
+                            'is-not-defined' => false,
+                            'param-filters' => array(),
+                            'text-match' => array(
+                                'negate-condition' => false,
+                                'collation' => 'i;unicode-casemap',
+                                'value' => 'vacation',
+                            ),
+                            'time-range' => null,
+                        ),
+                        array(
+                            'name' => 'DTSTAMP',
+                            'is-not-defined' => false,
+                            'param-filters' => array(),
+                            'text-match' => null,
+                            'time-range' => array(
+                                'start' => new DateTime('2011-07-04 00:00:00', new DateTimeZone('GMT')),
+                                'end' => null,
+                            ),
+                        ),
+                        array(
+                            'name' => 'ORGANIZER',
+                            'is-not-defined' => true,
+                            'param-filters' => array(),
+                            'text-match' => null,
+                            'time-range' => null,
+                        ),
+                        array(
+                            'name' => 'DTSTART',
+                            'is-not-defined' => false,
+                            'param-filters' => array(
+                                array(
+                                    'name' => 'VALUE',
+                                    'is-not-defined' => false,
+                                    'text-match' => array(
+                                        'negate-condition' => true,
+                                        'value' => 'DATE',
+                                        'collation' => 'i;ascii-casemap',
+                                    ),
+                                ),
+                            ),
+                            'text-match' => null,
+                            'time-range' => null,
+                        ),
+                    ),
+                    'time-range' => null,
+                ),
+            ),
+            'prop-filters' => array(),
+            'is-not-defined' => false,
+            'time-range' => false
+        );
+
+        $this->assertEquals(
+            $expected,
+            $result
+        );
+
+    }
+
+    function testOther1() {
+
+        // This body was exactly sent to us from the sabredav mailing list. Checking if this parses correctly.
+
+        $body = <<<BLA
+<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:"
+xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+   <C:calendar-data/>
+   <D:getetag/>
+ </D:prop>
+ <C:filter>
+   <C:comp-filter name="VCALENDAR">
+     <C:comp-filter name="VEVENT">
+       <C:time-range start="20090101T000000Z" end="20121202T000000Z"/>
+     </C:comp-filter>
+   </C:comp-filter>
+ </C:filter>
+</C:calendar-query>
+BLA;
+
+        $dom = Sabre_DAV_XMLUtil::loadDOMDocument($body);
+
+        $q = new Sabre_CalDAV_CalendarQueryParser($dom);
+        $q->parse();
+
+        $this->assertEquals(array(
+            '{urn:ietf:params:xml:ns:caldav}calendar-data',
+            '{DAV:}getetag',
+        ), $q->requestedProperties);
+
+        $expectedFilters = array(
+            'name' => 'VCALENDAR',
+            'comp-filters' => array(
+                array(
+                    'name' => 'VEVENT',
+                    'comp-filters' => array(),
+                    'prop-filters' => array(),
+                    'time-range' => array(
+                        'start' => new DateTime('2009-01-01 00:00:00', new DateTimeZone('UTC')),
+                        'end' => new DateTime('2012-12-02 00:00:00', new DateTimeZone('UTC')),
+                    ),
+                    'is-not-defined' => false,
+                ),
+            ),
+            'prop-filters' => array(),
+            'time-range' => null,
+            'is-not-defined' => false,
+        );
+
+        $this->assertEquals($expectedFilters, $q->filters);
+
+    }
+
+    function testExpand() {
+
+        $xml = array(
+            '<d:prop>',
+            '  <c:calendar-data>',
+            '     <c:expand start="20110101T000000Z" end="20120101T000000Z"/>',
+            '  </c:calendar-data>',
+            '</d:prop>',
+            '<c:filter>',
+            '  <c:comp-filter name="VCALENDAR" />',
+            '</c:filter>'
+        );
+
+        $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+        $dom = Sabre_DAV_XMLUtil::loadDOMDocument($xml);
+        $q = new Sabre_CalDAV_CalendarQueryParser($dom);
+        $q->parse();
+
+
+        $expected = array(
+            'name' => 'VCALENDAR',
+            'comp-filters' => array(),
+            'prop-filters' => array(),
+            'is-not-defined' => false,
+            'time-range' => false
+        );
+
+        $this->assertEquals(
+            $expected,
+            $q->filters
+        );
+
+        $this->assertEquals(array(
+            '{urn:ietf:params:xml:ns:caldav}calendar-data',
+        ), $q->requestedProperties);
+
+        $this->assertEquals(
+            array(
+                'start' => new DateTime('2011-01-01 00:00:00', new DateTimeZone('UTC')),
+                'end' => new DateTime('2012-01-01 00:00:00', new DateTimeZone('UTC')),
+            ),
+            $q->expand
+        );
+
+    }
+
+    /**
+     * @expectedException Sabre_DAV_Exception_BadRequest
+     */
+    function testExpandNoStart() {
+
+        $xml = array(
+            '<d:prop>',
+            '  <c:calendar-data>',
+            '     <c:expand end="20120101T000000Z"/>',
+            '  </c:calendar-data>',
+            '</d:prop>',
+            '<c:filter>',
+            '  <c:comp-filter name="VCALENDAR" />',
+            '</c:filter>'
+        );
+
+        $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+        $dom = Sabre_DAV_XMLUtil::loadDOMDocument($xml);
+        $q = new Sabre_CalDAV_CalendarQueryParser($dom);
+        $q->parse();
+
+    }
+    /**
+     * @expectedException Sabre_DAV_Exception_BadRequest
+     */
+    function testExpandNoEnd() {
+
+        $xml = array(
+            '<d:prop>',
+            '  <c:calendar-data>',
+            '     <c:expand start="20120101T000000Z"/>',
+            '  </c:calendar-data>',
+            '</d:prop>',
+            '<c:filter>',
+            '  <c:comp-filter name="VCALENDAR" />',
+            '</c:filter>'
+        );
+
+        $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+        $dom = Sabre_DAV_XMLUtil::loadDOMDocument($xml);
+        $q = new Sabre_CalDAV_CalendarQueryParser($dom);
+        $q->parse();
+
+    }
+    /**
+     * @expectedException Sabre_DAV_Exception_BadRequest
+     */
+    function testExpandBadTimes() {
+
+        $xml = array(
+            '<d:prop>',
+            '  <c:calendar-data>',
+            '     <c:expand start="20120101T000000Z" end="19980101T000000Z"/>',
+            '  </c:calendar-data>',
+            '</d:prop>',
+            '<c:filter>',
+            '  <c:comp-filter name="VCALENDAR" />',
+            '</c:filter>'
+        );
+
+        $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+        $dom = Sabre_DAV_XMLUtil::loadDOMDocument($xml);
+        $q = new Sabre_CalDAV_CalendarQueryParser($dom);
+        $q->parse();
+
+    }
+}