assertEquals($nodes[0], $server->tree->getNodeForPath('hello')); } public function testConstructInvalidArg() { $this->expectException('Sabre\DAV\Exception'); $server = new Server(1); } public function testOptions() { $request = new HTTP\Request('OPTIONS', '/'); $this->server->httpRequest = $request; $this->server->exec(); $this->assertEquals([ 'DAV' => ['1, 3, extended-mkcol'], 'MS-Author-Via' => ['DAV'], 'Allow' => ['OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, PROPPATCH, COPY, MOVE, REPORT'], 'Accept-Ranges' => ['bytes'], 'Content-Length' => ['0'], 'X-Sabre-Version' => [Version::VERSION], ], $this->response->getHeaders()); $this->assertEquals(200, $this->response->status); $this->assertEquals('', $this->response->getBodyAsString()); } public function testOptionsUnmapped() { $request = new HTTP\Request('OPTIONS', '/unmapped'); $this->server->httpRequest = $request; $this->server->exec(); $this->assertEquals([ 'DAV' => ['1, 3, extended-mkcol'], 'MS-Author-Via' => ['DAV'], 'Allow' => ['OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, PROPPATCH, COPY, MOVE, REPORT, MKCOL'], 'Accept-Ranges' => ['bytes'], 'Content-Length' => ['0'], 'X-Sabre-Version' => [Version::VERSION], ], $this->response->getHeaders()); $this->assertEquals(200, $this->response->status); $this->assertEquals('', $this->response->getBodyAsString()); } public function testNonExistantMethod() { $serverVars = [ 'REQUEST_URI' => '/', 'REQUEST_METHOD' => 'BLABLA', ]; $request = HTTP\Sapi::createFromServerArray($serverVars); $this->server->httpRequest = ($request); $this->server->exec(); $this->assertEquals([ 'X-Sabre-Version' => [Version::VERSION], 'Content-Type' => ['application/xml; charset=utf-8'], ], $this->response->getHeaders()); $this->assertEquals(501, $this->response->status); } public function testBaseUri() { $serverVars = [ 'REQUEST_URI' => '/blabla/test.txt', 'REQUEST_METHOD' => 'GET', ]; $filename = $this->tempDir.'/test.txt'; $request = HTTP\Sapi::createFromServerArray($serverVars); $this->server->setBaseUri('/blabla/'); $this->assertEquals('/blabla/', $this->server->getBaseUri()); $this->server->httpRequest = ($request); $this->server->exec(); $this->assertEquals([ 'X-Sabre-Version' => [Version::VERSION], 'Content-Type' => ['application/octet-stream'], 'Content-Length' => [13], 'Last-Modified' => [HTTP\toDate(new \DateTime('@'.filemtime($filename)))], 'ETag' => ['"'.sha1(fileinode($filename).filesize($filename).filemtime($filename)).'"'], ], $this->response->getHeaders() ); $this->assertEquals(200, $this->response->status); $this->assertEquals('Test contents', stream_get_contents($this->response->body)); } public function testBaseUriAddSlash() { $tests = [ '/' => '/', '/foo' => '/foo/', '/foo/' => '/foo/', '/foo/bar' => '/foo/bar/', '/foo/bar/' => '/foo/bar/', ]; foreach ($tests as $test => $result) { $this->server->setBaseUri($test); $this->assertEquals($result, $this->server->getBaseUri()); } } public function testCalculateUri() { $uris = [ 'http://www.example.org/root/somepath', '/root/somepath', '/root/somepath/', '//root/somepath/', '///root///somepath///', ]; $this->server->setBaseUri('/root/'); foreach ($uris as $uri) { $this->assertEquals('somepath', $this->server->calculateUri($uri)); } $this->server->setBaseUri('/root'); foreach ($uris as $uri) { $this->assertEquals('somepath', $this->server->calculateUri($uri)); } $this->assertEquals('', $this->server->calculateUri('/root')); $this->server->setBaseUri('/'); foreach ($uris as $uri) { $this->assertEquals('root/somepath', $this->server->calculateUri($uri)); } $this->assertEquals('', $this->server->calculateUri('')); } public function testCalculateUriSpecialChars() { $uris = [ 'http://www.example.org/root/%C3%A0fo%C3%B3', '/root/%C3%A0fo%C3%B3', '/root/%C3%A0fo%C3%B3/', ]; $this->server->setBaseUri('/root/'); foreach ($uris as $uri) { $this->assertEquals("\xc3\xa0fo\xc3\xb3", $this->server->calculateUri($uri)); } $this->server->setBaseUri('/root'); foreach ($uris as $uri) { $this->assertEquals("\xc3\xa0fo\xc3\xb3", $this->server->calculateUri($uri)); } $this->server->setBaseUri('/'); foreach ($uris as $uri) { $this->assertEquals("root/\xc3\xa0fo\xc3\xb3", $this->server->calculateUri($uri)); } } public function testCalculateUriBreakout() { $this->expectException('Sabre\DAV\Exception\Forbidden'); $uri = '/path1/'; $this->server->setBaseUri('/path2/'); $this->server->calculateUri($uri); } public function testGuessBaseUri() { $serverVars = [ 'REQUEST_METHOD' => 'GET', 'REQUEST_URI' => '/index.php/root', 'PATH_INFO' => '/root', ]; $httpRequest = HTTP\Sapi::createFromServerArray($serverVars); $server = new Server(); $server->httpRequest = $httpRequest; $this->assertEquals('/index.php/', $server->guessBaseUri()); } /** * @depends testGuessBaseUri */ public function testGuessBaseUriPercentEncoding() { $serverVars = [ 'REQUEST_METHOD' => 'GET', 'REQUEST_URI' => '/index.php/dir/path2/path%20with%20spaces', 'PATH_INFO' => '/dir/path2/path with spaces', ]; $httpRequest = HTTP\Sapi::createFromServerArray($serverVars); $server = new Server(); $server->httpRequest = $httpRequest; $this->assertEquals('/index.php/', $server->guessBaseUri()); } /** * @depends testGuessBaseUri */ /* function testGuessBaseUriPercentEncoding2() { $this->markTestIncomplete('This behaviour is not yet implemented'); $serverVars = [ 'REQUEST_URI' => '/some%20directory+mixed/index.php/dir/path2/path%20with%20spaces', 'PATH_INFO' => '/dir/path2/path with spaces', ]; $httpRequest = HTTP\Sapi::createFromServerArray($serverVars); $server = new Server(); $server->httpRequest = $httpRequest; $this->assertEquals('/some%20directory+mixed/index.php/', $server->guessBaseUri()); }*/ public function testGuessBaseUri2() { $serverVars = [ 'REQUEST_METHOD' => 'GET', 'REQUEST_URI' => '/index.php/root/', 'PATH_INFO' => '/root/', ]; $httpRequest = HTTP\Sapi::createFromServerArray($serverVars); $server = new Server(); $server->httpRequest = $httpRequest; $this->assertEquals('/index.php/', $server->guessBaseUri()); } public function testGuessBaseUriNoPathInfo() { $serverVars = [ 'REQUEST_METHOD' => 'GET', 'REQUEST_URI' => '/index.php/root', ]; $httpRequest = HTTP\Sapi::createFromServerArray($serverVars); $server = new Server(); $server->httpRequest = $httpRequest; $this->assertEquals('/', $server->guessBaseUri()); } public function testGuessBaseUriNoPathInfo2() { $httpRequest = new HTTP\Request('GET', '/a/b/c/test.php'); $server = new Server(); $server->httpRequest = $httpRequest; $this->assertEquals('/', $server->guessBaseUri()); } /** * @depends testGuessBaseUri */ public function testGuessBaseUriQueryString() { $serverVars = [ 'REQUEST_METHOD' => 'GET', 'REQUEST_URI' => '/index.php/root?query_string=blabla', 'PATH_INFO' => '/root', ]; $httpRequest = HTTP\Sapi::createFromServerArray($serverVars); $server = new Server(); $server->httpRequest = $httpRequest; $this->assertEquals('/index.php/', $server->guessBaseUri()); } /** * @depends testGuessBaseUri */ public function testGuessBaseUriBadConfig() { $this->expectException('Sabre\DAV\Exception'); $serverVars = [ 'REQUEST_METHOD' => 'GET', 'REQUEST_URI' => '/index.php/root/heyyy', 'PATH_INFO' => '/root', ]; $httpRequest = HTTP\Sapi::createFromServerArray($serverVars); $server = new Server(); $server->httpRequest = $httpRequest; $server->guessBaseUri(); } public function testTriggerException() { $serverVars = [ 'REQUEST_URI' => '/', 'REQUEST_METHOD' => 'FOO', ]; $httpRequest = HTTP\Sapi::createFromServerArray($serverVars); $this->server->httpRequest = $httpRequest; $this->server->on('beforeMethod:*', [$this, 'exceptionTrigger']); $this->server->exec(); $this->assertEquals([ 'Content-Type' => ['application/xml; charset=utf-8'], ], $this->response->getHeaders()); $this->assertEquals(500, $this->response->status); } public function exceptionTrigger($request, $response) { throw new Exception('Hola'); } public function testReportNotFound() { $serverVars = [ 'REQUEST_URI' => '/', 'REQUEST_METHOD' => 'REPORT', ]; $request = HTTP\Sapi::createFromServerArray($serverVars); $this->server->httpRequest = ($request); $this->server->httpRequest->setBody(''); $this->server->exec(); $this->assertEquals([ 'X-Sabre-Version' => [Version::VERSION], 'Content-Type' => ['application/xml; charset=utf-8'], ], $this->response->getHeaders() ); $this->assertEquals(415, $this->response->status, 'We got an incorrect status back. Full response body follows: '.$this->response->getBodyAsString()); } public function testReportIntercepted() { $serverVars = [ 'REQUEST_URI' => '/', 'REQUEST_METHOD' => 'REPORT', ]; $request = HTTP\Sapi::createFromServerArray($serverVars); $this->server->httpRequest = ($request); $this->server->httpRequest->setBody(''); $this->server->on('report', [$this, 'reportHandler']); $this->server->exec(); $this->assertEquals([ 'X-Sabre-Version' => [Version::VERSION], 'testheader' => ['testvalue'], ], $this->response->getHeaders() ); $this->assertEquals(418, $this->response->status, 'We got an incorrect status back. Full response body follows: '.$this->response->getBodyAsString()); } public function reportHandler($reportName, $result, $path) { if ('{http://www.rooftopsolutions.nl/NS}myreport' == $reportName) { $this->server->httpResponse->setStatus(418); $this->server->httpResponse->setHeader('testheader', 'testvalue'); return false; } else { return; } } public function testGetPropertiesForChildren() { $result = $this->server->getPropertiesForChildren('', [ '{DAV:}getcontentlength', ]); $expected = [ 'test.txt' => ['{DAV:}getcontentlength' => 13], 'dir/' => [], ]; $this->assertEquals($expected, $result); } /** * There are certain cases where no HTTP status may be set. We need to * intercept these and set it to a default error message. */ public function testNoHTTPStatusSet() { $this->server->on('method:GET', function () { return false; }, 1); $this->server->httpRequest = new HTTP\Request('GET', '/'); $this->server->exec(); $this->assertEquals(500, $this->response->getStatus()); } }