deprecated-addons/dav/SabreDAV/tests/Sabre/CalDAV/CalendarQueryParserTest.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();
}
}