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