]> git.mxchange.org Git - friendica-addons.git/blobdiff - dav/SabreDAV/tests/Sabre/DAV/ServerSimpleTest.php
Initial Release of the calendar plugin
[friendica-addons.git] / dav / SabreDAV / tests / Sabre / DAV / ServerSimpleTest.php
diff --git a/dav/SabreDAV/tests/Sabre/DAV/ServerSimpleTest.php b/dav/SabreDAV/tests/Sabre/DAV/ServerSimpleTest.php
new file mode 100644 (file)
index 0000000..37f03e2
--- /dev/null
@@ -0,0 +1,696 @@
+<?php
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+require_once 'Sabre/DAV/Exception.php';
+
+class Sabre_DAV_ServerSimpleTest extends Sabre_DAV_AbstractServer{
+
+    function testConstructArray() {
+
+        $nodes = array(
+            new Sabre_DAV_SimpleCollection('hello')
+        );
+
+        $server = new Sabre_DAV_Server($nodes);
+        $this->assertEquals($nodes[0], $server->tree->getNodeForPath('hello'));
+
+    }
+
+    /**
+     * @expectedException Sabre_DAV_Exception
+     */
+    function testConstructIncorrectObj() {
+
+        $nodes = array(
+            new Sabre_DAV_SimpleCollection('hello'),
+            new STDClass(),
+        );
+
+        $server = new Sabre_DAV_Server($nodes);
+
+    }
+
+    /**
+     * @expectedException Sabre_DAV_Exception
+     */
+    function testConstructInvalidArg() {
+
+        $server = new Sabre_DAV_Server(1);
+
+    }
+
+    function testGet() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/test.txt',
+            'REQUEST_METHOD' => 'GET',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            'Content-Type' => 'application/octet-stream',
+            'Content-Length' => 13,
+            'Last-Modified' => Sabre_HTTP_Util::toHTTPDate(new DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+            ),
+            $this->response->headers
+         );
+
+        $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+        $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+    }
+
+    function testGetDoesntExist() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/test.txt_randomblbla',
+            'REQUEST_METHOD' => 'GET',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+        $this->assertEquals('HTTP/1.1 404 Not Found',$this->response->status);
+
+    }
+
+    function testGetDoesntExist2() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/test.txt/randomblbla',
+            'REQUEST_METHOD' => 'GET',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+        $this->assertEquals('HTTP/1.1 404 Not Found',$this->response->status);
+
+    }
+
+    /**
+     * This test should have the exact same result as testGet.
+     *
+     * The idea is that double slashes // are converted to single ones /
+     *
+     */
+    function testGetDoubleSlash() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '//test.txt',
+            'REQUEST_METHOD' => 'GET',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            'Content-Type' => 'application/octet-stream',
+            'Content-Length' => 13,
+            'Last-Modified' => Sabre_HTTP_Util::toHTTPDate(new DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+            ),
+            $this->response->headers
+         );
+
+        $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+        $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+    }
+
+
+    function testHEAD() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/test.txt',
+            'REQUEST_METHOD' => 'HEAD',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            'Content-Type' => 'application/octet-stream',
+            'Content-Length' => 13,
+            'Last-Modified' => Sabre_HTTP_Util::toHTTPDate(new DateTime('@' .  filemtime($this->tempDir . '/test.txt'))),
+            ),
+            $this->response->headers
+         );
+
+        $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+        $this->assertEquals('', $this->response->body);
+
+    }
+
+    function testPut() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/testput.txt',
+            'REQUEST_METHOD' => 'PUT',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $request->setBody('Testing new file');
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals('', $this->response->body);
+        $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+        $this->assertEquals(array(
+            "Content-Length" => "0",
+        ), $this->response->headers);
+
+        $this->assertEquals('Testing new file',file_get_contents($this->tempDir . '/testput.txt'));
+
+    }
+
+    function testPutAlreadyExists() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/test.txt',
+            'REQUEST_METHOD' => 'PUT',
+            'HTTP_IF_NONE_MATCH' => '*',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $request->setBody('Testing new file');
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            'Content-Type' => 'application/xml; charset=utf-8',
+        ),$this->response->headers);
+
+        $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+        $this->assertNotEquals('Testing new file',file_get_contents($this->tempDir . '/test.txt'));
+
+    }
+
+    function testPutUpdate() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/test.txt',
+            'REQUEST_METHOD' => 'PUT',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $request->setBody('Testing updated file');
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals('0', $this->response->headers['Content-Length']);
+
+        $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+        $this->assertEquals('', $this->response->body);
+        $this->assertEquals('Testing updated file',file_get_contents($this->tempDir . '/test.txt'));
+
+    }
+
+    function testPutContentRange() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/testput.txt',
+            'REQUEST_METHOD' => 'PUT',
+            'HTTP_CONTENT_RANGE' => 'bytes/100-200',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $request->setBody('Testing new file');
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals('HTTP/1.1 501 Not Implemented',$this->response->status);
+
+    }
+
+
+    function testDelete() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/test.txt',
+            'REQUEST_METHOD' => 'DELETE',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            'Content-Length' => '0',
+        ),$this->response->headers);
+
+        $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+        $this->assertEquals('', $this->response->body);
+        $this->assertFalse(file_exists($this->tempDir . '/test.txt'));
+
+    }
+
+    function testDeleteDirectory() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/testcol',
+            'REQUEST_METHOD' => 'DELETE',
+        );
+
+        mkdir($this->tempDir.'/testcol');
+        file_put_contents($this->tempDir.'/testcol/test.txt','Hi! I\'m a file with a short lifespan');
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            'Content-Length' => '0',
+        ),$this->response->headers);
+        $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+        $this->assertEquals('', $this->response->body);
+        $this->assertFalse(file_exists($this->tempDir . '/col'));
+
+    }
+
+    function testOptions() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/',
+            'REQUEST_METHOD' => 'OPTIONS',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            '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' => Sabre_DAV_Version::VERSION,
+        ),$this->response->headers);
+
+        $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+        $this->assertEquals('', $this->response->body);
+
+
+    }
+    function testNonExistantMethod() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/',
+            'REQUEST_METHOD' => 'BLABLA',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            'Content-Type' => 'application/xml; charset=utf-8',
+        ),$this->response->headers);
+
+        $this->assertEquals('HTTP/1.1 501 Not Implemented',$this->response->status);
+
+
+    }
+
+    function testGETOnCollection() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/',
+            'REQUEST_METHOD' => 'GET',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            'Content-Type' => 'application/xml; charset=utf-8',
+        ),$this->response->headers);
+
+        $this->assertEquals('HTTP/1.1 501 Not Implemented',$this->response->status);
+
+    }
+
+    function testHEADOnCollection() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/',
+            'REQUEST_METHOD' => 'HEAD',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+    }
+
+    function testBaseUri() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/blabla/test.txt',
+            'REQUEST_METHOD' => 'GET',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->setBaseUri('/blabla/');
+        $this->assertEquals('/blabla/',$this->server->getBaseUri());
+        $this->server->httpRequest = ($request);
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            'Content-Type' => 'application/octet-stream',
+            'Content-Length' => 13,
+            'Last-Modified' => Sabre_HTTP_Util::toHTTPDate(new DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+            ),
+            $this->response->headers
+         );
+
+        $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+        $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+    }
+
+    function testBaseUriAddSlash() {
+
+        $tests = array(
+            '/'         => '/',
+            '/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());
+
+        }
+
+    }
+
+    function testCalculateUri() {
+
+        $uris = array(
+            'http://www.example.org/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'));
+
+    }
+
+    function testCalculateUriSpecialChars() {
+
+        $uris = array(
+            '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));
+
+        }
+
+    }
+
+    function testBaseUriCheck() {
+
+        $uris = array(
+            'http://www.example.org/root/somepath',
+            '/root/somepath',
+            '/root/somepath/'
+        );
+
+        try {
+
+            $this->server->setBaseUri('root/');
+            $this->server->calculateUri('/root/testuri');
+
+            $this->fail('Expected an exception');
+
+        } catch (Sabre_DAV_Exception_Forbidden $e) {
+
+            // This was expected
+
+        }
+
+    }
+
+    /**
+     * @covers Sabre_DAV_Server::guessBaseUri
+     */
+    function testGuessBaseUri() {
+
+        $serverVars = array(
+            'REQUEST_URI' => '/index.php/root',
+            'PATH_INFO'   => '/root',
+        );
+
+        $httpRequest = new Sabre_HTTP_Request($serverVars);
+        $server = new Sabre_DAV_Server();
+        $server->httpRequest = $httpRequest;
+
+        $this->assertEquals('/index.php/', $server->guessBaseUri());
+
+    }
+
+    /**
+     * @depends testGuessBaseUri
+     * @covers Sabre_DAV_Server::guessBaseUri
+     */
+    function testGuessBaseUriPercentEncoding() {
+
+        $serverVars = array(
+            'REQUEST_URI' => '/index.php/dir/path2/path%20with%20spaces',
+            'PATH_INFO'   => '/dir/path2/path with spaces',
+        );
+
+        $httpRequest = new Sabre_HTTP_Request($serverVars);
+        $server = new Sabre_DAV_Server();
+        $server->httpRequest = $httpRequest;
+
+        $this->assertEquals('/index.php/', $server->guessBaseUri());
+
+    }
+
+    /**
+     * @depends testGuessBaseUri
+     * @covers Sabre_DAV_Server::guessBaseUri
+     */
+    /*
+    function testGuessBaseUriPercentEncoding2() {
+
+        $this->markTestIncomplete('This behaviour is not yet implemented');
+        $serverVars = array(
+            'REQUEST_URI' => '/some%20directory+mixed/index.php/dir/path2/path%20with%20spaces',
+            'PATH_INFO'   => '/dir/path2/path with spaces',
+        );
+
+        $httpRequest = new Sabre_HTTP_Request($serverVars);
+        $server = new Sabre_DAV_Server();
+        $server->httpRequest = $httpRequest;
+
+        $this->assertEquals('/some%20directory+mixed/index.php/', $server->guessBaseUri());
+
+    }*/
+
+    function testGuessBaseUri2() {
+
+        $serverVars = array(
+            'REQUEST_URI' => '/index.php/root/',
+            'PATH_INFO'   => '/root/',
+        );
+
+        $httpRequest = new Sabre_HTTP_Request($serverVars);
+        $server = new Sabre_DAV_Server();
+        $server->httpRequest = $httpRequest;
+
+        $this->assertEquals('/index.php/', $server->guessBaseUri());
+
+    }
+
+    function testGuessBaseUriNoPathInfo() {
+
+        $serverVars = array(
+            'REQUEST_URI' => '/index.php/root',
+        );
+
+        $httpRequest = new Sabre_HTTP_Request($serverVars);
+        $server = new Sabre_DAV_Server();
+        $server->httpRequest = $httpRequest;
+
+        $this->assertEquals('/', $server->guessBaseUri());
+
+    }
+
+    function testGuessBaseUriNoPathInfo2() {
+
+        $serverVars = array(
+            'REQUEST_URI' => '/a/b/c/test.php',
+        );
+
+        $httpRequest = new Sabre_HTTP_Request($serverVars);
+        $server = new Sabre_DAV_Server();
+        $server->httpRequest = $httpRequest;
+
+        $this->assertEquals('/', $server->guessBaseUri());
+
+    }
+
+
+    /**
+     * @covers Sabre_DAV_Server::guessBaseUri
+     * @depends testGuessBaseUri
+     */
+    function testGuessBaseUriQueryString() {
+
+        $serverVars = array(
+            'REQUEST_URI' => '/index.php/root?query_string=blabla',
+            'PATH_INFO'   => '/root',
+        );
+
+        $httpRequest = new Sabre_HTTP_Request($serverVars);
+        $server = new Sabre_DAV_Server();
+        $server->httpRequest = $httpRequest;
+
+        $this->assertEquals('/index.php/', $server->guessBaseUri());
+
+    }
+
+    function testTriggerException() {
+
+        $this->server->subscribeEvent('beforeMethod',array($this,'exceptionTrigger'));
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            'Content-Type' => 'application/xml; charset=utf-8',
+        ),$this->response->headers);
+
+        $this->assertEquals('HTTP/1.1 500 Internal Server Error',$this->response->status);
+
+    }
+
+    function exceptionTrigger() {
+
+        throw new Sabre_DAV_Exception('Hola');
+
+    }
+
+    function testReportNotFound() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/',
+            'REQUEST_METHOD' => 'REPORT',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->httpRequest->setBody('<?xml version="1.0"?><bla:myreport xmlns:bla="http://www.rooftopsolutions.nl/NS"></bla:myreport>');
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            'Content-Type' => 'application/xml; charset=utf-8',
+            ),
+            $this->response->headers
+         );
+
+        $this->assertEquals('HTTP/1.1 501 Not Implemented',$this->response->status,'We got an incorrect status back. Full response body follows: ' . $this->response->body);
+
+    }
+
+    function testReportIntercepted() {
+
+        $serverVars = array(
+            'REQUEST_URI'    => '/',
+            'REQUEST_METHOD' => 'REPORT',
+        );
+
+        $request = new Sabre_HTTP_Request($serverVars);
+        $this->server->httpRequest = ($request);
+        $this->server->httpRequest->setBody('<?xml version="1.0"?><bla:myreport xmlns:bla="http://www.rooftopsolutions.nl/NS"></bla:myreport>');
+        $this->server->subscribeEvent('report',array($this,'reportHandler'));
+        $this->server->exec();
+
+        $this->assertEquals(array(
+            'testheader' => 'testvalue',
+            ),
+            $this->response->headers
+        );
+
+        $this->assertEquals('HTTP/1.1 418 I\'m a teapot',$this->response->status,'We got an incorrect status back. Full response body follows: ' . $this->response->body);
+
+    }
+
+    function reportHandler($reportName) {
+
+        if ($reportName=='{http://www.rooftopsolutions.nl/NS}myreport') {
+            $this->server->httpResponse->sendStatus(418);
+            $this->server->httpResponse->setHeader('testheader','testvalue');
+            return false;
+        }
+        else return;
+
+    }
+
+    function testGetPropertiesForChildren() {
+
+        $result = $this->server->getPropertiesForChildren('',array(
+            '{DAV:}getcontentlength',
+        ));
+
+        $expected = array(
+            'test.txt' => array('{DAV:}getcontentlength' => 13),
+            'dir/' => array(),
+        );
+
+        $this->assertEquals($expected,$result);
+
+    }
+
+}