[Pkg-owncloud-commits] [php-sabredav] 94/148: CardDAV is at 100% coverage again.

David Prévot taffit at moszumanska.debian.org
Wed Apr 15 01:37:21 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository php-sabredav.

commit 12358d8599ba5f5e67164d9396dfe7b100d3ce48
Author: Evert Pot <me at evertpot.com>
Date:   Fri Mar 27 15:57:05 2015 -0700

    CardDAV is at 100% coverage again.
---
 lib/CardDAV/Xml/Filter/ParamFilter.php             |   4 -
 lib/CardDAV/Xml/Request/AddressBookQueryReport.php |  29 +-
 tests/Sabre/CardDAV/PluginTest.php                 |   1 +
 .../Xml/Request/AddressBookQueryReportTest.php     | 302 +++++++++++++++++++++
 tests/Sabre/DAV/Xml/XmlTest.php                    |   5 +-
 5 files changed, 330 insertions(+), 11 deletions(-)

diff --git a/lib/CardDAV/Xml/Filter/ParamFilter.php b/lib/CardDAV/Xml/Filter/ParamFilter.php
index 44fba48..706929c 100644
--- a/lib/CardDAV/Xml/Filter/ParamFilter.php
+++ b/lib/CardDAV/Xml/Filter/ParamFilter.php
@@ -55,10 +55,6 @@ abstract class ParamFilter implements Element {
         $att = $reader->parseAttributes();
         $result['name'] = $att['name'];
 
-        if (isset($att['test']) && $att['test']==='allof') {
-            $result['test'] = 'allof';
-        }
-
         $elems = $reader->parseInnerTree();
 
         if (is_array($elems)) foreach($elems as $elem) {
diff --git a/lib/CardDAV/Xml/Request/AddressBookQueryReport.php b/lib/CardDAV/Xml/Request/AddressBookQueryReport.php
index 1e03794..3982668 100644
--- a/lib/CardDAV/Xml/Request/AddressBookQueryReport.php
+++ b/lib/CardDAV/Xml/Request/AddressBookQueryReport.php
@@ -31,6 +31,27 @@ class AddressBookQueryReport implements XmlDeserializable {
     /**
      * List of property/component filters.
      *
+     * This is an array with filters. Every item is a property filter. Every
+     * property filter has the following keys:
+     *   * name - name of the component to filter on
+     *   * test - anyof or allof
+     *   * is-not-defined - Test for non-existence
+     *   * param-filters - A list of parameter filters on the property
+     *   * text-matches - A list of text values the filter needs to match
+     *
+     * Each param-filter has the following keys:
+     *   * name - name of the parameter
+     *   * is-not-defined - Test for non-existence
+     *   * text-match - Match the parameter value
+     *
+     * Each text-match in property filters, and the single text-match in
+     * param-filters have the following keys:
+     *
+     *   * value - value to match
+     *   * match-type - contains, starts-with, ends-with, equals
+     *   * negate-condition - Do the opposite match
+     *   * collation - Usually i;unicode-casemap
+     *
      * @var array
      */
     public $filters;
@@ -91,7 +112,7 @@ class AddressBookQueryReport implements XmlDeserializable {
      */
     static function xmlDeserialize(Reader $reader) {
 
-        $elems = $reader->parseInnerTree([
+        $elems = (array)$reader->parseInnerTree([
             '{urn:ietf:params:xml:ns:carddav}prop-filter'  => 'Sabre\\CardDAV\\Xml\\Filter\\PropFilter',
             '{urn:ietf:params:xml:ns:carddav}param-filter' => 'Sabre\\CardDAV\\Xml\\Filter\\ParamFilter',
             '{urn:ietf:params:xml:ns:carddav}address-data' => 'Sabre\\CardDAV\\Xml\\Filter\\AddressData',
@@ -129,11 +150,9 @@ class AddressBookQueryReport implements XmlDeserializable {
                         }
                     }
 
-                    foreach($elem['value'] as $subElem) {
+                    $newProps['filters'] = [];
+                    foreach((array)$elem['value'] as $subElem) {
                         if ($subElem['name'] === '{' . Plugin::NS_CARDDAV . '}prop-filter') {
-                            if (is_null($newProps['filters'])) {
-                                $newProps['filters'] = [];
-                            }
                             $newProps['filters'][] = $subElem['value'];
                         }
                     }
diff --git a/tests/Sabre/CardDAV/PluginTest.php b/tests/Sabre/CardDAV/PluginTest.php
index 8c0b53e..3f95e66 100644
--- a/tests/Sabre/CardDAV/PluginTest.php
+++ b/tests/Sabre/CardDAV/PluginTest.php
@@ -12,6 +12,7 @@ class PluginTest extends AbstractPluginTest {
         $this->assertEquals('{' . Plugin::NS_CARDDAV . '}addressbook', $this->server->resourceTypeMapping['Sabre\\CardDAV\\IAddressBook']);
 
         $this->assertTrue(in_array('addressbook', $this->plugin->getFeatures()));
+        $this->assertEquals('carddav', $this->plugin->getPluginInfo()['name']);
 
     }
 
diff --git a/tests/Sabre/CardDAV/Xml/Request/AddressBookQueryReportTest.php b/tests/Sabre/CardDAV/Xml/Request/AddressBookQueryReportTest.php
new file mode 100644
index 0000000..b110e20
--- /dev/null
+++ b/tests/Sabre/CardDAV/Xml/Request/AddressBookQueryReportTest.php
@@ -0,0 +1,302 @@
+<?php
+
+namespace Sabre\CardDAV\Xml\Request;
+use Sabre\DAV\Xml\XmlTest;
+
+class AddressBookQueryReportTest extends XmlTest {
+
+    protected $elementMap = [
+        '{urn:ietf:params:xml:ns:carddav}addressbook-query' => 'Sabre\\CardDAV\\Xml\\Request\AddressBookQueryReport',
+    ];
+
+    function testDeserialize() {
+
+        $xml = <<<XML
+<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+    <d:prop>
+      <d:getetag />
+    </d:prop>
+    <c:filter>
+        <c:prop-filter name="uid" />
+    </c:filter>
+</c:addressbook-query>
+XML;
+
+        $result = $this->parse($xml);
+        $addressBookQueryReport = new AddressBookQueryReport();
+        $addressBookQueryReport->properties = [
+            '{DAV:}getetag',
+        ];
+        $addressBookQueryReport->test = 'anyof';
+        $addressBookQueryReport->filters = [
+            [
+                'name' => 'uid',
+                'test' => 'anyof',
+                'is-not-defined' => false,
+                'param-filters' => [],
+                'text-matches' => [],
+            ]
+        ];
+
+        $this->assertEquals(
+            $addressBookQueryReport,
+            $result['value']
+        );
+
+    }
+
+    function testDeserializeAllOf() {
+
+        $xml = <<<XML
+<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+    <d:prop>
+      <d:getetag />
+    </d:prop>
+    <c:filter test="allof">
+        <c:prop-filter name="uid" />
+    </c:filter>
+</c:addressbook-query>
+XML;
+
+        $result = $this->parse($xml);
+        $addressBookQueryReport = new AddressBookQueryReport();
+        $addressBookQueryReport->properties = [
+            '{DAV:}getetag',
+        ];
+        $addressBookQueryReport->test = 'allof';
+        $addressBookQueryReport->filters = [
+            [
+                'name' => 'uid',
+                'test' => 'anyof',
+                'is-not-defined' => false,
+                'param-filters' => [],
+                'text-matches' => [],
+            ]
+        ];
+
+        $this->assertEquals(
+            $addressBookQueryReport,
+            $result['value']
+        );
+
+    }
+
+    /**
+     * @expectedException \Sabre\DAV\Exception\BadRequest
+     */
+    function testDeserializeBadTest() {
+
+        $xml = <<<XML
+<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+    <d:prop>
+      <d:getetag />
+    </d:prop>
+    <c:filter test="bad">
+        <c:prop-filter name="uid" />
+    </c:filter>
+</c:addressbook-query>
+XML;
+
+        $this->parse($xml);
+
+    }
+
+    /**
+     * We should error on this, but KDE does this, so we chose to support it.
+     */
+    function testDeserializeNoFilter() {
+
+        $xml = <<<XML
+<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+    <d:prop>
+      <d:getetag />
+    </d:prop>
+</c:addressbook-query>
+XML;
+
+        $result = $this->parse($xml);
+        $addressBookQueryReport = new AddressBookQueryReport();
+        $addressBookQueryReport->properties = [
+            '{DAV:}getetag',
+        ];
+        $addressBookQueryReport->test = 'anyof';
+        $addressBookQueryReport->filters = [];
+
+        $this->assertEquals(
+            $addressBookQueryReport,
+            $result['value']
+        );
+
+    }
+
+    function testDeserializeComplex() {
+
+        $xml = <<<XML
+<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+    <d:prop>
+      <d:getetag />
+      <c:address-data content-type="application/vcard+json" version="4.0" />
+    </d:prop>
+    <c:filter>
+        <c:prop-filter name="uid">
+            <c:is-not-defined />
+        </c:prop-filter>
+        <c:prop-filter name="x-foo" test="allof">
+            <c:param-filter name="x-param1" />
+            <c:param-filter name="x-param2">
+                <c:is-not-defined />
+            </c:param-filter>
+            <c:param-filter name="x-param3">
+                <c:text-match match-type="contains">Hello!</c:text-match>
+            </c:param-filter>
+        </c:prop-filter>
+        <c:prop-filter name="x-prop2">
+            <c:text-match match-type="starts-with" negate-condition="yes">No</c:text-match>
+        </c:prop-filter>
+    </c:filter>
+    <c:limit><c:nresults>10</c:nresults></c:limit>
+</c:addressbook-query>
+XML;
+
+        $result = $this->parse($xml);
+        $addressBookQueryReport = new AddressBookQueryReport();
+        $addressBookQueryReport->properties = [
+            '{DAV:}getetag',
+            '{urn:ietf:params:xml:ns:carddav}address-data',
+        ];
+        $addressBookQueryReport->test = 'anyof';
+        $addressBookQueryReport->filters = [
+            [
+                'name' => 'uid',
+                'test' => 'anyof',
+                'is-not-defined' => true,
+                'param-filters' => [],
+                'text-matches' => [],
+            ],
+            [
+                'name' => 'x-foo',
+                'test' => 'allof',
+                'is-not-defined' => false,
+                'param-filters' => [
+                    [
+                        'name' => 'x-param1',
+                        'is-not-defined' => false,
+                        'text-match' => null,
+                    ],
+                    [
+                        'name' => 'x-param2',
+                        'is-not-defined' => true,
+                        'text-match' => null,
+                    ],
+                    [
+                        'name' => 'x-param3',
+                        'is-not-defined' => false,
+                        'text-match' => [
+                            'negate-condition' => false,
+                            'value' => 'Hello!',
+                            'match-type' => 'contains',
+                            'collation' => 'i;unicode-casemap',
+                        ],
+                    ],
+                ],
+                'text-matches' => [],
+            ],
+            [
+                'name' => 'x-prop2',
+                'test' => 'anyof',
+                'is-not-defined' => false,
+                'param-filters' => [],
+                'text-matches' => [
+                    [
+                        'negate-condition' => true,
+                        'value' => 'No',
+                        'match-type' => 'starts-with',
+                        'collation' => 'i;unicode-casemap',
+                    ],
+                ],
+            ]
+        ];
+
+        $addressBookQueryReport->version = '4.0';
+        $addressBookQueryReport->contentType = 'application/vcard+json';
+        $addressBookQueryReport->limit = 10;
+
+        $this->assertEquals(
+            $addressBookQueryReport,
+            $result['value']
+        );
+
+    }
+
+    /**
+     * @expectedException \Sabre\DAV\Exception\BadRequest
+     */
+    function testDeserializeBadMatchType() {
+
+        $xml = <<<XML
+<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+    <d:prop>
+      <d:getetag />
+    </d:prop>
+    <c:filter>
+        <c:prop-filter name="x-foo" test="allof">
+            <c:param-filter name="x-param3">
+                <c:text-match match-type="bad">Hello!</c:text-match>
+            </c:param-filter>
+        </c:prop-filter>
+    </c:filter>
+</c:addressbook-query>
+XML;
+        $this->parse($xml);
+
+    }
+
+    /**
+     * @expectedException \Sabre\DAV\Exception\BadRequest
+     */
+    function testDeserializeBadMatchType2() {
+
+        $xml = <<<XML
+<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+    <d:prop>
+      <d:getetag />
+    </d:prop>
+    <c:filter>
+        <c:prop-filter name="x-prop2">
+            <c:text-match match-type="bad" negate-condition="yes">No</c:text-match>
+        </c:prop-filter>
+    </c:filter>
+</c:addressbook-query>
+XML;
+        $this->parse($xml);
+
+    }
+
+    /**
+     * @expectedException \Sabre\DAV\Exception\BadRequest
+     */
+    function testDeserializeDoubleFilter() {
+
+        $xml = <<<XML
+<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+    <d:prop>
+      <d:getetag />
+    </d:prop>
+    <c:filter>
+    </c:filter>
+    <c:filter>
+    </c:filter>
+</c:addressbook-query>
+XML;
+        $this->parse($xml);
+
+    }
+}
diff --git a/tests/Sabre/DAV/Xml/XmlTest.php b/tests/Sabre/DAV/Xml/XmlTest.php
index 33246f2..9867011 100644
--- a/tests/Sabre/DAV/Xml/XmlTest.php
+++ b/tests/Sabre/DAV/Xml/XmlTest.php
@@ -7,6 +7,7 @@ use Sabre\Xml\Reader;
 
 abstract class XmlTest extends \PHPUnit_Framework_TestCase {
 
+    protected $elementMap = [];
     protected $namespaceMap = ['DAV:' => 'd'];
     protected $contextUri = '/';
 
@@ -22,10 +23,10 @@ abstract class XmlTest extends \PHPUnit_Framework_TestCase {
 
     }
 
-    function parse($xml, $elementMap) {
+    function parse($xml, array $elementMap = []) {
 
         $reader = new Reader();
-        $reader->elementMap = $elementMap;
+        $reader->elementMap = array_merge($this->elementMap, $elementMap);
         $reader->xml($xml);
         return $reader->parse();
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/php-sabredav.git



More information about the Pkg-owncloud-commits mailing list