]> git.mxchange.org Git - friendica-addons.git/blobdiff - dav/SabreDAV/tests/Sabre/CardDAV/AddressBookQueryParserTest.php
Initial Release of the calendar plugin
[friendica-addons.git] / dav / SabreDAV / tests / Sabre / CardDAV / AddressBookQueryParserTest.php
diff --git a/dav/SabreDAV/tests/Sabre/CardDAV/AddressBookQueryParserTest.php b/dav/SabreDAV/tests/Sabre/CardDAV/AddressBookQueryParserTest.php
new file mode 100644 (file)
index 0000000..54fa534
--- /dev/null
@@ -0,0 +1,325 @@
+<?php
+
+class Sabre_CardDAV_AddressBookQueryParserTest extends PHPUnit_Framework_TestCase {
+
+    function parse($xml) {
+
+        $xml = implode("\n", $xml);
+        $dom = Sabre_DAV_XMLUtil::loadDOMDocument($xml);
+
+        $q = new Sabre_CardDAV_AddressBookQueryParser($dom);
+        $q->parse();
+        return $q;
+
+    }
+
+    function testFilterBasic() {
+
+        $xml = array(
+            '<?xml version="1.0"?>',
+            '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+            '   <d:prop>',
+            '      <d:foo />',
+            '   </d:prop>',
+            '   <c:filter>',
+            '     <c:prop-filter name="NICKNAME" />',
+            '   </c:filter>',
+            '</c:addressbook-query>'
+        );
+
+        $q = $this->parse($xml);
+
+        $this->assertEquals(
+            array('{DAV:}foo'),
+            $q->requestedProperties
+        );
+
+        $this->assertEquals(
+            array(
+                array(
+                    'name' => 'NICKNAME',
+                    'test' => 'anyof',
+                    'is-not-defined' => false,
+                    'param-filters' => array(),
+                    'text-matches' => array(),
+                ),
+            ),
+            $q->filters
+        );
+
+        $this->assertNull($q->limit);
+        $this->assertEquals('anyof', $q->test);
+
+    }
+
+    function testNoFilter() {
+
+        // This is non-standard, but helps working around a KDE bug
+        $xml = array(
+            '<?xml version="1.0"?>',
+            '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+            '   <d:prop>',
+            '      <d:foo />',
+            '   </d:prop>',
+            '</c:addressbook-query>'
+        );
+
+        $q = $this->parse($xml);
+
+        $this->assertEquals(
+            array('{DAV:}foo'),
+            $q->requestedProperties
+        );
+
+        $this->assertEquals(
+            array(),
+            $q->filters
+        );
+
+        $this->assertNull($q->limit);
+        $this->assertEquals('anyof', $q->test);
+
+    }
+
+    /**
+     * @expectedException Sabre_DAV_Exception_BadRequest
+     */
+    function testFilterDoubleFilter() {
+
+        $xml = array(
+            '<?xml version="1.0"?>',
+            '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+            '   <d:prop>',
+            '      <d:foo />',
+            '   </d:prop>',
+            '   <c:filter>',
+            '     <c:prop-filter name="NICKNAME" />',
+            '   </c:filter>',
+            '   <c:filter>',
+            '     <c:prop-filter name="NICKNAME" />',
+            '   </c:filter>',
+            '</c:addressbook-query>'
+        );
+
+        $q = $this->parse($xml);
+
+    }
+    /**
+     * @expectedException Sabre_DAV_Exception_BadRequest
+     */
+    function testFilterCorruptTest() {
+
+        $xml = array(
+            '<?xml version="1.0"?>',
+            '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+            '   <d:prop>',
+            '      <d:foo />',
+            '   </d:prop>',
+            '   <c:filter test="foo">',
+            '     <c:prop-filter name="NICKNAME" />',
+            '   </c:filter>',
+            '</c:addressbook-query>'
+        );
+
+        $q = $this->parse($xml);
+
+    }
+
+    function testPropFilter() {
+
+        $xml = array(
+            '<?xml version="1.0"?>',
+            '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+            '   <d:prop>',
+            '      <d:foo />',
+            '   </d:prop>',
+            '   <c:filter test="allof">',
+            '     <c:prop-filter name="NICKNAME" />',
+            '     <c:prop-filter name="EMAIL" test="allof" />',
+            '     <c:prop-filter name="FN">',
+            '        <c:is-not-defined />',
+            '     </c:prop-filter>',
+            '   </c:filter>',
+            '   <c:limit><c:nresults>4</c:nresults></c:limit>',
+            '</c:addressbook-query>'
+        );
+
+        $q = $this->parse($xml);
+
+        $this->assertEquals(
+            array(
+                array(
+                    'name' => 'NICKNAME',
+                    'test' => 'anyof',
+                    'is-not-defined' => false,
+                    'param-filters' => array(),
+                    'text-matches' => array(),
+                ),
+                array(
+                    'name' => 'EMAIL',
+                    'test' => 'allof',
+                    'is-not-defined' => false,
+                    'param-filters' => array(),
+                    'text-matches' => array(),
+                ),
+                array(
+                    'name' => 'FN',
+                    'test' => 'anyof',
+                    'is-not-defined' => true,
+                    'param-filters' => array(),
+                    'text-matches' => array(),
+                ),
+            ),
+            $q->filters
+        );
+
+        $this->assertEquals(4,$q->limit);
+        $this->assertEquals('allof', $q->test);
+
+    }
+
+    function testParamFilter() {
+
+        $xml = array(
+            '<?xml version="1.0"?>',
+            '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+            '   <d:prop>',
+            '      <d:foo />',
+            '   </d:prop>',
+            '   <c:filter>',
+            '     <c:prop-filter name="NICKNAME">',
+            '        <c:param-filter name="BLA" />',
+            '        <c:param-filter name="BLA2">',
+            '          <c:is-not-defined />',
+            '        </c:param-filter>',
+            '     </c:prop-filter>',
+            '   </c:filter>',
+            '</c:addressbook-query>'
+        );
+
+        $q = $this->parse($xml);
+
+        $this->assertEquals(
+            array(
+                array(
+                    'name' => 'NICKNAME',
+                    'test' => 'anyof',
+                    'is-not-defined' => false,
+                    'param-filters' => array(
+                        array(
+                            'name' => 'BLA',
+                            'is-not-defined' => false,
+                            'text-match' => null
+                        ),
+                        array(
+                            'name' => 'BLA2',
+                            'is-not-defined' => true,
+                            'text-match' => null
+                        ),
+                    ),
+                    'text-matches' => array(),
+                ),
+            ),
+            $q->filters
+        );
+
+    }
+
+    function testTextMatch() {
+
+        $xml = array(
+            '<?xml version="1.0"?>',
+            '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+            '   <d:prop>',
+            '      <d:foo />',
+            '   </d:prop>',
+            '   <c:filter>',
+            '     <c:prop-filter name="NICKNAME">',
+            '        <c:text-match>evert</c:text-match>',
+            '        <c:text-match collation="i;octet">evert</c:text-match>',
+            '        <c:text-match negate-condition="yes">rene</c:text-match>',
+            '        <c:text-match match-type="starts-with">e</c:text-match>',
+            '        <c:param-filter name="BLA">',
+            '            <c:text-match>foo</c:text-match>',
+            '        </c:param-filter>',
+            '     </c:prop-filter>',
+            '   </c:filter>',
+            '</c:addressbook-query>'
+        );
+
+        $q = $this->parse($xml);
+
+        $this->assertEquals(
+            array(
+                array(
+                    'name' => 'NICKNAME',
+                    'test' => 'anyof',
+                    'is-not-defined' => false,
+                    'param-filters' => array(
+                        array(
+                            'name' => 'BLA',
+                            'is-not-defined' => false,
+                            'text-match' => array(
+                                'negate-condition' => false,
+                                'collation' => 'i;unicode-casemap',
+                                'match-type' => 'contains',
+                                'value'     => 'foo',
+                            ),
+                        ),
+                    ),
+                    'text-matches' => array(
+                        array(
+                            'negate-condition' => false,
+                            'collation' => 'i;unicode-casemap',
+                            'match-type' => 'contains',
+                            'value'     => 'evert',
+                        ),
+                        array(
+                            'negate-condition' => false,
+                            'collation' => 'i;octet',
+                            'match-type' => 'contains',
+                            'value'     => 'evert',
+                        ),
+                        array(
+                            'negate-condition' => true,
+                            'collation' => 'i;unicode-casemap',
+                            'match-type' => 'contains',
+                            'value'     => 'rene',
+                        ),
+                        array(
+                            'negate-condition' => false,
+                            'collation' => 'i;unicode-casemap',
+                            'match-type' => 'starts-with',
+                            'value'     => 'e',
+                        ),
+                    ),
+                ),
+            ),
+            $q->filters
+        );
+
+    }
+
+    /**
+     * @expectedException Sabre_DAV_Exception_BadRequest
+     */
+    function testBadTextMatch() {
+
+        $xml = array(
+            '<?xml version="1.0"?>',
+            '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+            '   <d:prop>',
+            '      <d:foo />',
+            '   </d:prop>',
+            '   <c:filter>',
+            '     <c:prop-filter name="NICKNAME">',
+            '        <c:text-match match-type="foo">evert</c:text-match>',
+            '     </c:prop-filter>',
+            '   </c:filter>',
+            '</c:addressbook-query>'
+        );
+
+        $q = $this->parse($xml);
+
+    }
+}