1<?php
2
3namespace Sabre\CalDAV;
4
5use Sabre\DAV;
6use Sabre\HTTP;
7
8require_once 'Sabre/CalDAV/Backend/Mock.php';
9require_once 'Sabre/HTTP/ResponseMock.php';
10
11class FreeBusyReportTest extends \PHPUnit_Framework_TestCase {
12
13    /**
14     * @var Plugin
15     */
16    protected $plugin;
17    /**
18     * @var DAV\Server
19     */
20    protected $server;
21
22    function setUp() {
23
24        $obj1 = <<<ics
25BEGIN:VCALENDAR
26BEGIN:VEVENT
27DTSTART:20111005T120000Z
28DURATION:PT1H
29END:VEVENT
30END:VCALENDAR
31ics;
32
33        $obj2 = fopen('php://memory', 'r+');
34        fwrite($obj2, <<<ics
35BEGIN:VCALENDAR
36BEGIN:VEVENT
37DTSTART:20121005T120000Z
38DURATION:PT1H
39END:VEVENT
40END:VCALENDAR
41ics
42        );
43        rewind($obj2);
44
45        $obj3 = <<<ics
46BEGIN:VCALENDAR
47BEGIN:VEVENT
48DTSTART:20111006T120000
49DURATION:PT1H
50END:VEVENT
51END:VCALENDAR
52ics;
53
54        $calendarData = [
55            1 => [
56                'obj1' => [
57                    'calendarid'   => 1,
58                    'uri'          => 'event1.ics',
59                    'calendardata' => $obj1,
60                ],
61                'obj2' => [
62                    'calendarid'   => 1,
63                    'uri'          => 'event2.ics',
64                    'calendardata' => $obj2
65                ],
66                'obj3' => [
67                    'calendarid'   => 1,
68                    'uri'          => 'event3.ics',
69                    'calendardata' => $obj3
70                ]
71            ],
72        ];
73
74
75        $caldavBackend = new Backend\Mock([], $calendarData);
76
77        $calendar = new Calendar($caldavBackend, [
78            'id'                                           => 1,
79            'uri'                                          => 'calendar',
80            'principaluri'                                 => 'principals/user1',
81            '{' . Plugin::NS_CALDAV . '}calendar-timezone' => "BEGIN:VCALENDAR\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nEND:VTIMEZONE\r\nEND:VCALENDAR",
82        ]);
83
84        $this->server = new DAV\Server([$calendar]);
85
86        $request = HTTP\Sapi::createFromServerArray([
87            'REQUEST_URI' => '/calendar',
88        ]);
89        $this->server->httpRequest = $request;
90        $this->server->httpResponse = new HTTP\ResponseMock();
91
92        $this->plugin = new Plugin();
93        $this->server->addPlugin($this->plugin);
94
95    }
96
97    function testFreeBusyReport() {
98
99        $reportXML = <<<XML
100<?xml version="1.0"?>
101<c:free-busy-query xmlns:c="urn:ietf:params:xml:ns:caldav">
102    <c:time-range start="20111001T000000Z" end="20111101T000000Z" />
103</c:free-busy-query>
104XML;
105
106        $report = $this->server->xml->parse($reportXML, null, $rootElem);
107        $this->plugin->report($rootElem, $report, null);
108
109        $this->assertEquals(200, $this->server->httpResponse->status);
110        $this->assertEquals('text/calendar', $this->server->httpResponse->getHeader('Content-Type'));
111        $this->assertTrue(strpos($this->server->httpResponse->body, 'BEGIN:VFREEBUSY') !== false);
112        $this->assertTrue(strpos($this->server->httpResponse->body, '20111005T120000Z/20111005T130000Z') !== false);
113        $this->assertTrue(strpos($this->server->httpResponse->body, '20111006T100000Z/20111006T110000Z') !== false);
114
115    }
116
117    /**
118     * @expectedException Sabre\DAV\Exception\BadRequest
119     */
120    function testFreeBusyReportNoTimeRange() {
121
122        $reportXML = <<<XML
123<?xml version="1.0"?>
124<c:free-busy-query xmlns:c="urn:ietf:params:xml:ns:caldav">
125</c:free-busy-query>
126XML;
127
128        $report = $this->server->xml->parse($reportXML, null, $rootElem);
129
130    }
131
132    /**
133     * @expectedException Sabre\DAV\Exception\NotImplemented
134     */
135    function testFreeBusyReportWrongNode() {
136
137        $request = HTTP\Sapi::createFromServerArray([
138            'REQUEST_URI' => '/',
139        ]);
140        $this->server->httpRequest = $request;
141
142        $reportXML = <<<XML
143<?xml version="1.0"?>
144<c:free-busy-query xmlns:c="urn:ietf:params:xml:ns:caldav">
145    <c:time-range start="20111001T000000Z" end="20111101T000000Z" />
146</c:free-busy-query>
147XML;
148
149        $report = $this->server->xml->parse($reportXML, null, $rootElem);
150        $this->plugin->report($rootElem, $report, null);
151
152    }
153
154    /**
155     * @expectedException Sabre\DAV\Exception
156     */
157    function testFreeBusyReportNoACLPlugin() {
158
159        $this->server = new DAV\Server();
160        $this->plugin = new Plugin();
161        $this->server->addPlugin($this->plugin);
162
163        $reportXML = <<<XML
164<?xml version="1.0"?>
165<c:free-busy-query xmlns:c="urn:ietf:params:xml:ns:caldav">
166    <c:time-range start="20111001T000000Z" end="20111101T000000Z" />
167</c:free-busy-query>
168XML;
169
170        $report = $this->server->xml->parse($reportXML, null, $rootElem);
171        $this->plugin->report($rootElem, $report, null);
172
173    }
174}
175