538 lines
16 KiB
PHP
538 lines
16 KiB
PHP
|
<?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();
|
||
|
|
||
|
}
|
||
|
}
|