xref: /plugin/davcal/vendor/sabre/dav/tests/Sabre/DAV/ServerPropsTest.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
1*a1a3b679SAndreas Boehler<?php
2*a1a3b679SAndreas Boehler
3*a1a3b679SAndreas Boehlernamespace Sabre\DAV;
4*a1a3b679SAndreas Boehleruse Sabre\HTTP;
5*a1a3b679SAndreas Boehler
6*a1a3b679SAndreas Boehlerrequire_once 'Sabre/HTTP/ResponseMock.php';
7*a1a3b679SAndreas Boehlerrequire_once 'Sabre/DAV/AbstractServer.php';
8*a1a3b679SAndreas Boehler
9*a1a3b679SAndreas Boehlerclass ServerPropsTest extends AbstractServer {
10*a1a3b679SAndreas Boehler
11*a1a3b679SAndreas Boehler    protected function getRootNode() {
12*a1a3b679SAndreas Boehler
13*a1a3b679SAndreas Boehler        return new FSExt\Directory(SABRE_TEMPDIR);
14*a1a3b679SAndreas Boehler
15*a1a3b679SAndreas Boehler    }
16*a1a3b679SAndreas Boehler
17*a1a3b679SAndreas Boehler    function setUp() {
18*a1a3b679SAndreas Boehler
19*a1a3b679SAndreas Boehler        if (file_exists(SABRE_TEMPDIR.'../.sabredav')) unlink(SABRE_TEMPDIR.'../.sabredav');
20*a1a3b679SAndreas Boehler        parent::setUp();
21*a1a3b679SAndreas Boehler        file_put_contents(SABRE_TEMPDIR . '/test2.txt', 'Test contents2');
22*a1a3b679SAndreas Boehler        mkdir(SABRE_TEMPDIR . '/col');
23*a1a3b679SAndreas Boehler        file_put_contents(SABRE_TEMPDIR . 'col/test.txt', 'Test contents');
24*a1a3b679SAndreas Boehler        $this->server->addPlugin(new Locks\Plugin(new Locks\Backend\File(SABRE_TEMPDIR . '/.locksdb')));
25*a1a3b679SAndreas Boehler
26*a1a3b679SAndreas Boehler    }
27*a1a3b679SAndreas Boehler
28*a1a3b679SAndreas Boehler    function tearDown() {
29*a1a3b679SAndreas Boehler
30*a1a3b679SAndreas Boehler        parent::tearDown();
31*a1a3b679SAndreas Boehler        if (file_exists(SABRE_TEMPDIR.'../.locksdb')) unlink(SABRE_TEMPDIR.'../.locksdb');
32*a1a3b679SAndreas Boehler
33*a1a3b679SAndreas Boehler    }
34*a1a3b679SAndreas Boehler
35*a1a3b679SAndreas Boehler    private function sendRequest($body, $path = '/', $headers = ['Depth' => '0']) {
36*a1a3b679SAndreas Boehler
37*a1a3b679SAndreas Boehler        $request = new HTTP\Request('PROPFIND', $path, $headers, $body);
38*a1a3b679SAndreas Boehler
39*a1a3b679SAndreas Boehler        $this->server->httpRequest = $request;
40*a1a3b679SAndreas Boehler        $this->server->exec();
41*a1a3b679SAndreas Boehler
42*a1a3b679SAndreas Boehler    }
43*a1a3b679SAndreas Boehler
44*a1a3b679SAndreas Boehler    function testPropFindEmptyBody() {
45*a1a3b679SAndreas Boehler
46*a1a3b679SAndreas Boehler        $this->sendRequest("");
47*a1a3b679SAndreas Boehler        $this->assertEquals(207, $this->response->status);
48*a1a3b679SAndreas Boehler
49*a1a3b679SAndreas Boehler        $this->assertEquals(array(
50*a1a3b679SAndreas Boehler                'X-Sabre-Version' => [Version::VERSION],
51*a1a3b679SAndreas Boehler                'Content-Type' => ['application/xml; charset=utf-8'],
52*a1a3b679SAndreas Boehler                'DAV' => ['1, 3, extended-mkcol, 2'],
53*a1a3b679SAndreas Boehler                'Vary' => ['Brief,Prefer'],
54*a1a3b679SAndreas Boehler            ),
55*a1a3b679SAndreas Boehler            $this->response->getHeaders()
56*a1a3b679SAndreas Boehler         );
57*a1a3b679SAndreas Boehler
58*a1a3b679SAndreas Boehler        $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
59*a1a3b679SAndreas Boehler        $xml = simplexml_load_string($body);
60*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('d','urn:DAV');
61*a1a3b679SAndreas Boehler
62*a1a3b679SAndreas Boehler        list($data) = $xml->xpath('/d:multistatus/d:response/d:href');
63*a1a3b679SAndreas Boehler        $this->assertEquals('/',(string)$data,'href element should have been /');
64*a1a3b679SAndreas Boehler
65*a1a3b679SAndreas Boehler        $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:resourcetype');
66*a1a3b679SAndreas Boehler        $this->assertEquals(1,count($data));
67*a1a3b679SAndreas Boehler
68*a1a3b679SAndreas Boehler    }
69*a1a3b679SAndreas Boehler
70*a1a3b679SAndreas Boehler    function testPropFindEmptyBodyFile() {
71*a1a3b679SAndreas Boehler
72*a1a3b679SAndreas Boehler        $this->sendRequest("", '/test2.txt', []);
73*a1a3b679SAndreas Boehler        $this->assertEquals(207, $this->response->status);
74*a1a3b679SAndreas Boehler
75*a1a3b679SAndreas Boehler        $this->assertEquals(array(
76*a1a3b679SAndreas Boehler                'X-Sabre-Version' => [Version::VERSION],
77*a1a3b679SAndreas Boehler                'Content-Type' => ['application/xml; charset=utf-8'],
78*a1a3b679SAndreas Boehler                'DAV' => ['1, 3, extended-mkcol, 2'],
79*a1a3b679SAndreas Boehler                'Vary' => ['Brief,Prefer'],
80*a1a3b679SAndreas Boehler            ),
81*a1a3b679SAndreas Boehler            $this->response->getHeaders()
82*a1a3b679SAndreas Boehler         );
83*a1a3b679SAndreas Boehler
84*a1a3b679SAndreas Boehler        $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
85*a1a3b679SAndreas Boehler        $xml = simplexml_load_string($body);
86*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('d','urn:DAV');
87*a1a3b679SAndreas Boehler
88*a1a3b679SAndreas Boehler        list($data) = $xml->xpath('/d:multistatus/d:response/d:href');
89*a1a3b679SAndreas Boehler        $this->assertEquals('/test2.txt',(string)$data,'href element should have been /');
90*a1a3b679SAndreas Boehler
91*a1a3b679SAndreas Boehler        $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:getcontentlength');
92*a1a3b679SAndreas Boehler        $this->assertEquals(1,count($data));
93*a1a3b679SAndreas Boehler
94*a1a3b679SAndreas Boehler    }
95*a1a3b679SAndreas Boehler
96*a1a3b679SAndreas Boehler    function testSupportedLocks() {
97*a1a3b679SAndreas Boehler
98*a1a3b679SAndreas Boehler        $xml = '<?xml version="1.0"?>
99*a1a3b679SAndreas Boehler<d:propfind xmlns:d="DAV:">
100*a1a3b679SAndreas Boehler  <d:prop>
101*a1a3b679SAndreas Boehler    <d:supportedlock />
102*a1a3b679SAndreas Boehler  </d:prop>
103*a1a3b679SAndreas Boehler</d:propfind>';
104*a1a3b679SAndreas Boehler
105*a1a3b679SAndreas Boehler        $this->sendRequest($xml);
106*a1a3b679SAndreas Boehler
107*a1a3b679SAndreas Boehler        $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
108*a1a3b679SAndreas Boehler        $xml = simplexml_load_string($body);
109*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('d','urn:DAV');
110*a1a3b679SAndreas Boehler
111*a1a3b679SAndreas Boehler        $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry');
112*a1a3b679SAndreas Boehler        $this->assertEquals(2,count($data),'We expected two \'d:lockentry\' tags');
113*a1a3b679SAndreas Boehler
114*a1a3b679SAndreas Boehler        $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:lockscope');
115*a1a3b679SAndreas Boehler        $this->assertEquals(2,count($data),'We expected two \'d:lockscope\' tags');
116*a1a3b679SAndreas Boehler
117*a1a3b679SAndreas Boehler        $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:locktype');
118*a1a3b679SAndreas Boehler        $this->assertEquals(2,count($data),'We expected two \'d:locktype\' tags');
119*a1a3b679SAndreas Boehler
120*a1a3b679SAndreas Boehler        $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:lockscope/d:shared');
121*a1a3b679SAndreas Boehler        $this->assertEquals(1,count($data),'We expected a \'d:shared\' tag');
122*a1a3b679SAndreas Boehler
123*a1a3b679SAndreas Boehler        $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:lockscope/d:exclusive');
124*a1a3b679SAndreas Boehler        $this->assertEquals(1,count($data),'We expected a \'d:exclusive\' tag');
125*a1a3b679SAndreas Boehler
126*a1a3b679SAndreas Boehler        $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:locktype/d:write');
127*a1a3b679SAndreas Boehler        $this->assertEquals(2,count($data),'We expected two \'d:write\' tags');
128*a1a3b679SAndreas Boehler    }
129*a1a3b679SAndreas Boehler
130*a1a3b679SAndreas Boehler    function testLockDiscovery() {
131*a1a3b679SAndreas Boehler
132*a1a3b679SAndreas Boehler        $xml = '<?xml version="1.0"?>
133*a1a3b679SAndreas Boehler<d:propfind xmlns:d="DAV:">
134*a1a3b679SAndreas Boehler  <d:prop>
135*a1a3b679SAndreas Boehler    <d:lockdiscovery />
136*a1a3b679SAndreas Boehler  </d:prop>
137*a1a3b679SAndreas Boehler</d:propfind>';
138*a1a3b679SAndreas Boehler
139*a1a3b679SAndreas Boehler        $this->sendRequest($xml);
140*a1a3b679SAndreas Boehler
141*a1a3b679SAndreas Boehler        $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
142*a1a3b679SAndreas Boehler        $xml = simplexml_load_string($body);
143*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('d','urn:DAV');
144*a1a3b679SAndreas Boehler
145*a1a3b679SAndreas Boehler        $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:lockdiscovery');
146*a1a3b679SAndreas Boehler        $this->assertEquals(1,count($data),'We expected a \'d:lockdiscovery\' tag');
147*a1a3b679SAndreas Boehler
148*a1a3b679SAndreas Boehler    }
149*a1a3b679SAndreas Boehler
150*a1a3b679SAndreas Boehler    function testUnknownProperty() {
151*a1a3b679SAndreas Boehler
152*a1a3b679SAndreas Boehler        $xml = '<?xml version="1.0"?>
153*a1a3b679SAndreas Boehler<d:propfind xmlns:d="DAV:">
154*a1a3b679SAndreas Boehler  <d:prop>
155*a1a3b679SAndreas Boehler    <d:macaroni />
156*a1a3b679SAndreas Boehler  </d:prop>
157*a1a3b679SAndreas Boehler</d:propfind>';
158*a1a3b679SAndreas Boehler
159*a1a3b679SAndreas Boehler        $this->sendRequest($xml);
160*a1a3b679SAndreas Boehler        $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
161*a1a3b679SAndreas Boehler        $xml = simplexml_load_string($body);
162*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('d','urn:DAV');
163*a1a3b679SAndreas Boehler        $pathTests = array(
164*a1a3b679SAndreas Boehler            '/d:multistatus',
165*a1a3b679SAndreas Boehler            '/d:multistatus/d:response',
166*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat',
167*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:status',
168*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop',
169*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/d:macaroni',
170*a1a3b679SAndreas Boehler        );
171*a1a3b679SAndreas Boehler        foreach($pathTests as $test) {
172*a1a3b679SAndreas Boehler            $this->assertTrue(count($xml->xpath($test))==true,'We expected the ' . $test . ' element to appear in the response, we got: ' . $body);
173*a1a3b679SAndreas Boehler        }
174*a1a3b679SAndreas Boehler
175*a1a3b679SAndreas Boehler        $val = $xml->xpath('/d:multistatus/d:response/d:propstat/d:status');
176*a1a3b679SAndreas Boehler        $this->assertEquals(1,count($val),$body);
177*a1a3b679SAndreas Boehler        $this->assertEquals('HTTP/1.1 404 Not Found',(string)$val[0]);
178*a1a3b679SAndreas Boehler
179*a1a3b679SAndreas Boehler    }
180*a1a3b679SAndreas Boehler
181*a1a3b679SAndreas Boehler    function testParsePropPatchRequest() {
182*a1a3b679SAndreas Boehler
183*a1a3b679SAndreas Boehler        $body = '<?xml version="1.0"?>
184*a1a3b679SAndreas Boehler<d:propertyupdate xmlns:d="DAV:" xmlns:s="http://sabredav.org/NS/test">
185*a1a3b679SAndreas Boehler  <d:set><d:prop><s:someprop>somevalue</s:someprop></d:prop></d:set>
186*a1a3b679SAndreas Boehler  <d:remove><d:prop><s:someprop2 /></d:prop></d:remove>
187*a1a3b679SAndreas Boehler  <d:set><d:prop><s:someprop3>removeme</s:someprop3></d:prop></d:set>
188*a1a3b679SAndreas Boehler  <d:remove><d:prop><s:someprop3 /></d:prop></d:remove>
189*a1a3b679SAndreas Boehler</d:propertyupdate>';
190*a1a3b679SAndreas Boehler
191*a1a3b679SAndreas Boehler        $result = $this->server->xml->parse($body);
192*a1a3b679SAndreas Boehler        $this->assertEquals([
193*a1a3b679SAndreas Boehler            '{http://sabredav.org/NS/test}someprop' => 'somevalue',
194*a1a3b679SAndreas Boehler            '{http://sabredav.org/NS/test}someprop2' => null,
195*a1a3b679SAndreas Boehler            '{http://sabredav.org/NS/test}someprop3' => null,
196*a1a3b679SAndreas Boehler        ], $result->properties);
197*a1a3b679SAndreas Boehler
198*a1a3b679SAndreas Boehler    }
199*a1a3b679SAndreas Boehler
200*a1a3b679SAndreas Boehler}
201