326 lines
9.9 KiB
PHP
326 lines
9.9 KiB
PHP
|
<?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);
|
||
|
|
||
|
}
|
||
|
}
|