xref: /plugin/davcal/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDTest.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
1*a1a3b679SAndreas Boehler<?php
2*a1a3b679SAndreas Boehler
3*a1a3b679SAndreas Boehlernamespace Sabre\CalDAV;
4*a1a3b679SAndreas Boehleruse Sabre\HTTP;
5*a1a3b679SAndreas Boehleruse Sabre\VObject;
6*a1a3b679SAndreas Boehler
7*a1a3b679SAndreas Boehler/**
8*a1a3b679SAndreas Boehler * This unittests is created to find out why recurring events have wrong DTSTART value
9*a1a3b679SAndreas Boehler *
10*a1a3b679SAndreas Boehler *
11*a1a3b679SAndreas Boehler * @copyright Copyright (C) 2007-2015 fruux GmbH (https://fruux.com/).
12*a1a3b679SAndreas Boehler * @author Evert Pot (http://evertpot.com/)
13*a1a3b679SAndreas Boehler * @license http://sabre.io/license/ Modified BSD License
14*a1a3b679SAndreas Boehler */
15*a1a3b679SAndreas Boehlerclass ExpandEventsDTSTARTandDTENDTest extends \Sabre\DAVServerTest {
16*a1a3b679SAndreas Boehler
17*a1a3b679SAndreas Boehler    protected $setupCalDAV = true;
18*a1a3b679SAndreas Boehler
19*a1a3b679SAndreas Boehler    protected $caldavCalendars = array(
20*a1a3b679SAndreas Boehler        array(
21*a1a3b679SAndreas Boehler            'id' => 1,
22*a1a3b679SAndreas Boehler            'name' => 'Calendar',
23*a1a3b679SAndreas Boehler            'principaluri' => 'principals/user1',
24*a1a3b679SAndreas Boehler            'uri' => 'calendar1',
25*a1a3b679SAndreas Boehler        )
26*a1a3b679SAndreas Boehler    );
27*a1a3b679SAndreas Boehler
28*a1a3b679SAndreas Boehler    protected $caldavCalendarObjects = array(
29*a1a3b679SAndreas Boehler        1 => array(
30*a1a3b679SAndreas Boehler           'event.ics' => array(
31*a1a3b679SAndreas Boehler                'calendardata' => 'BEGIN:VCALENDAR
32*a1a3b679SAndreas BoehlerVERSION:2.0
33*a1a3b679SAndreas BoehlerBEGIN:VEVENT
34*a1a3b679SAndreas BoehlerUID:foobar
35*a1a3b679SAndreas BoehlerDTEND;TZID=Europe/Berlin:20120207T191500
36*a1a3b679SAndreas BoehlerRRULE:FREQ=DAILY;INTERVAL=1;COUNT=3
37*a1a3b679SAndreas BoehlerSUMMARY:RecurringEvents 3 times
38*a1a3b679SAndreas BoehlerDTSTART;TZID=Europe/Berlin:20120207T181500
39*a1a3b679SAndreas BoehlerEND:VEVENT
40*a1a3b679SAndreas BoehlerBEGIN:VEVENT
41*a1a3b679SAndreas BoehlerCREATED:20120207T111900Z
42*a1a3b679SAndreas BoehlerUID:foobar
43*a1a3b679SAndreas BoehlerDTEND;TZID=Europe/Berlin:20120208T191500
44*a1a3b679SAndreas BoehlerSUMMARY:RecurringEvents 3 times OVERWRITTEN
45*a1a3b679SAndreas BoehlerDTSTART;TZID=Europe/Berlin:20120208T181500
46*a1a3b679SAndreas BoehlerRECURRENCE-ID;TZID=Europe/Berlin:20120208T181500
47*a1a3b679SAndreas BoehlerEND:VEVENT
48*a1a3b679SAndreas BoehlerEND:VCALENDAR
49*a1a3b679SAndreas Boehler',
50*a1a3b679SAndreas Boehler            ),
51*a1a3b679SAndreas Boehler        ),
52*a1a3b679SAndreas Boehler    );
53*a1a3b679SAndreas Boehler
54*a1a3b679SAndreas Boehler    function testExpand() {
55*a1a3b679SAndreas Boehler
56*a1a3b679SAndreas Boehler        $request = HTTP\Sapi::createFromServerArray([
57*a1a3b679SAndreas Boehler            'REQUEST_METHOD' => 'REPORT',
58*a1a3b679SAndreas Boehler            'HTTP_CONTENT_TYPE' => 'application/xml',
59*a1a3b679SAndreas Boehler            'REQUEST_URI' => '/calendars/user1/calendar1',
60*a1a3b679SAndreas Boehler            'HTTP_DEPTH' => '1',
61*a1a3b679SAndreas Boehler        ]);
62*a1a3b679SAndreas Boehler
63*a1a3b679SAndreas Boehler        $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
64*a1a3b679SAndreas Boehler<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
65*a1a3b679SAndreas Boehler    <D:prop>
66*a1a3b679SAndreas Boehler        <C:calendar-data>
67*a1a3b679SAndreas Boehler            <C:expand start="20120205T230000Z" end="20120212T225959Z"/>
68*a1a3b679SAndreas Boehler        </C:calendar-data>
69*a1a3b679SAndreas Boehler        <D:getetag/>
70*a1a3b679SAndreas Boehler    </D:prop>
71*a1a3b679SAndreas Boehler    <C:filter>
72*a1a3b679SAndreas Boehler        <C:comp-filter name="VCALENDAR">
73*a1a3b679SAndreas Boehler            <C:comp-filter name="VEVENT">
74*a1a3b679SAndreas Boehler                <C:time-range start="20120205T230000Z" end="20120212T225959Z"/>
75*a1a3b679SAndreas Boehler            </C:comp-filter>
76*a1a3b679SAndreas Boehler        </C:comp-filter>
77*a1a3b679SAndreas Boehler    </C:filter>
78*a1a3b679SAndreas Boehler</C:calendar-query>');
79*a1a3b679SAndreas Boehler
80*a1a3b679SAndreas Boehler        $response = $this->request($request);
81*a1a3b679SAndreas Boehler
82*a1a3b679SAndreas Boehler        // Everts super awesome xml parser.
83*a1a3b679SAndreas Boehler        $body = substr(
84*a1a3b679SAndreas Boehler            $response->body,
85*a1a3b679SAndreas Boehler            $start = strpos($response->body, 'BEGIN:VCALENDAR'),
86*a1a3b679SAndreas Boehler            strpos($response->body, 'END:VCALENDAR') - $start + 13
87*a1a3b679SAndreas Boehler        );
88*a1a3b679SAndreas Boehler        $body = str_replace('&#13;','',$body);
89*a1a3b679SAndreas Boehler
90*a1a3b679SAndreas Boehler        try {
91*a1a3b679SAndreas Boehler            $vObject = VObject\Reader::read($body);
92*a1a3b679SAndreas Boehler        } catch (VObject\ParseException $e) {
93*a1a3b679SAndreas Boehler            $this->fail('Could not parse object. Error:' . $e->getMessage(). ' full object: ' . $response->getBodyAsString());
94*a1a3b679SAndreas Boehler        }
95*a1a3b679SAndreas Boehler
96*a1a3b679SAndreas Boehler        // check if DTSTARTs and DTENDs are correct
97*a1a3b679SAndreas Boehler        foreach ($vObject->VEVENT as $vevent) {
98*a1a3b679SAndreas Boehler            /** @var $vevent Sabre\VObject\Component\VEvent */
99*a1a3b679SAndreas Boehler            foreach ($vevent->children as $child) {
100*a1a3b679SAndreas Boehler                /** @var $child Sabre\VObject\Property */
101*a1a3b679SAndreas Boehler
102*a1a3b679SAndreas Boehler                if ($child->name == 'DTSTART') {
103*a1a3b679SAndreas Boehler                    // DTSTART has to be one of three valid values
104*a1a3b679SAndreas Boehler                    $this->assertContains($child->getValue(), ['20120207T171500Z', '20120208T171500Z', '20120209T171500Z'], 'DTSTART is not a valid value: '.$child->getValue());
105*a1a3b679SAndreas Boehler                } elseif ($child->name == 'DTEND') {
106*a1a3b679SAndreas Boehler                    // DTEND has to be one of three valid values
107*a1a3b679SAndreas Boehler                    $this->assertContains($child->getValue(), ['20120207T181500Z', '20120208T181500Z', '20120209T181500Z'], 'DTEND is not a valid value: '.$child->getValue());
108*a1a3b679SAndreas Boehler                }
109*a1a3b679SAndreas Boehler            }
110*a1a3b679SAndreas Boehler        }
111*a1a3b679SAndreas Boehler    }
112*a1a3b679SAndreas Boehler
113*a1a3b679SAndreas Boehler}
114*a1a3b679SAndreas Boehler
115