]> source.dussan.org Git - nextcloud-server.git/commitdiff
adding unit tests for ObjectTree::move()
authorThomas Müller <thomas.mueller@tmit.eu>
Thu, 26 Sep 2013 08:50:15 +0000 (10:50 +0200)
committerThomas Müller <thomas.mueller@tmit.eu>
Thu, 26 Sep 2013 08:50:15 +0000 (10:50 +0200)
lib/connector/sabre/objecttree.php
tests/lib/connector/sabre/objecttree.php [new file with mode: 0644]

index 7accf98c8e1c5b9368bb54568fd6cef63470486c..80c3840b99d9fa95bd34bc7a4625a124b54e9cc0 100644 (file)
@@ -11,6 +11,14 @@ namespace OC\Connector\Sabre;
 use OC\Files\Filesystem;
 
 class ObjectTree extends \Sabre_DAV_ObjectTree {
+
+       /**
+        * keep this public to allow mock injection during unit test
+        *
+        * @var \OC\Files\View
+        */
+       public $fileView;
+
        /**
         * Returns the INode object for the requested path
         *
@@ -21,14 +29,16 @@ class ObjectTree extends \Sabre_DAV_ObjectTree {
        public function getNodeForPath($path) {
 
                $path = trim($path, '/');
-               if (isset($this->cache[$path])) return $this->cache[$path];
+               if (isset($this->cache[$path])) {
+                       return $this->cache[$path];
+               }
 
                // Is it the root node?
                if (!strlen($path)) {
                        return $this->rootNode;
                }
 
-               $info = Filesystem::getFileInfo($path);
+               $info = $this->getFileView()->getFileInfo($path);
 
                if (!$info) {
                        throw new \Sabre_DAV_Exception_NotFound('File with name ' . $path . ' could not be located');
@@ -65,25 +75,21 @@ class ObjectTree extends \Sabre_DAV_ObjectTree {
                list($destinationDir,) = \Sabre_DAV_URLUtil::splitPath($destinationPath);
 
                // check update privileges
-               if ($sourceDir === $destinationDir) {
-                       // for renaming it's enough to check if the sourcePath can be updated
-                       if (!\OC\Files\Filesystem::isUpdatable($sourcePath)) {
-                               throw new \Sabre_DAV_Exception_Forbidden();
-                       }
-               } else {
+               $fs = $this->getFileView();
+               if (!$fs->isUpdatable($sourcePath)) {
+                       throw new \Sabre_DAV_Exception_Forbidden();
+               }
+               if ($sourceDir !== $destinationDir) {
                        // for a full move we need update privileges on sourcePath and sourceDir as well as destinationDir
-                       if (!\OC\Files\Filesystem::isUpdatable($sourcePath)) {
-                               throw new \Sabre_DAV_Exception_Forbidden();
-                       }
-                       if (!\OC\Files\Filesystem::isUpdatable($sourceDir)) {
+                       if (!$fs->isUpdatable($sourceDir)) {
                                throw new \Sabre_DAV_Exception_Forbidden();
                        }
-                       if (!\OC\Files\Filesystem::isUpdatable($destinationDir)) {
+                       if (!$fs->isUpdatable($destinationDir)) {
                                throw new \Sabre_DAV_Exception_Forbidden();
                        }
                }
 
-               $renameOkay = Filesystem::rename($sourcePath, $destinationPath);
+               $renameOkay = $fs->rename($sourcePath, $destinationPath);
                if (!$renameOkay) {
                        throw new \Sabre_DAV_Exception_Forbidden('');
                }
@@ -123,4 +129,14 @@ class ObjectTree extends \Sabre_DAV_ObjectTree {
                list($destinationDir,) = \Sabre_DAV_URLUtil::splitPath($destination);
                $this->markDirty($destinationDir);
        }
+
+       /**
+        * @return \OC\Files\View
+        */
+       public function getFileView() {
+               if (is_null($this->fileView)) {
+                       $this->fileView = \OC\Files\Filesystem::getView();
+               }
+               return $this->fileView;
+       }
 }
diff --git a/tests/lib/connector/sabre/objecttree.php b/tests/lib/connector/sabre/objecttree.php
new file mode 100644 (file)
index 0000000..c920441
--- /dev/null
@@ -0,0 +1,104 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test\OC\Connector\Sabre;
+
+
+use OC_Connector_Sabre_Directory;
+use PHPUnit_Framework_TestCase;
+use Sabre_DAV_Exception_Forbidden;
+
+class TestDoubleFileView extends \OC\Files\View{
+
+       public function __construct($updatables, $canRename = true) {
+               $this->updatables = $updatables;
+               $this->canRename = $canRename;
+       }
+
+       public function isUpdatable($path) {
+               return $this->updatables[$path];
+       }
+
+       public function rename($path1, $path2) {
+               return $this->canRename;
+       }
+}
+
+class ObjectTree extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @dataProvider moveFailedProvider
+        * @expectedException Sabre_DAV_Exception_Forbidden
+        */
+       public function testMoveFailed($source, $dest, $updatables) {
+               $rootDir = new OC_Connector_Sabre_Directory('');
+               $objectTree = $this->getMock('\OC\Connector\Sabre\ObjectTree',
+                       array('nodeExists', 'getNodeForPath'),
+                       array($rootDir));
+
+               $objectTree->expects($this->once())
+                       ->method('getNodeForPath')
+                       ->with($this->identicalTo('a/b'))
+                       ->will($this->returnValue(false));
+
+               /** @var $objectTree \OC\Connector\Sabre\ObjectTree */
+               $objectTree->fileView = new TestDoubleFileView($updatables);
+               $objectTree->move($source, $dest);
+       }
+
+       /**
+        * @dataProvider moveSuccessProvider
+        */
+       public function testMoveSuccess($source, $dest, $updatables) {
+               $rootDir = new OC_Connector_Sabre_Directory('');
+               $objectTree = $this->getMock('\OC\Connector\Sabre\ObjectTree',
+                       array('nodeExists', 'getNodeForPath'),
+                       array($rootDir));
+
+               $objectTree->expects($this->once())
+                       ->method('getNodeForPath')
+                       ->with($this->identicalTo('a/b'))
+                       ->will($this->returnValue(false));
+
+               /** @var $objectTree \OC\Connector\Sabre\ObjectTree */
+               $objectTree->fileView = new TestDoubleFileView($updatables);
+               $objectTree->move($source, $dest);
+               $this->assertTrue(true);
+       }
+
+       function moveFailedProvider() {
+               return array(
+                       array('a/b', 'a/c', array('a' => false, 'a/b' => false, 'a/c' => false)),
+                       array('a/b', 'b/b', array('a' => false, 'a/b' => false, 'b' => false, 'b/b' => false)),
+                       array('a/b', 'b/b', array('a' => false, 'a/b' => true, 'b' => false, 'b/b' => false)),
+                       array('a/b', 'b/b', array('a' => true, 'a/b' => true, 'b' => false, 'b/b' => false)),
+               );
+       }
+
+       function moveSuccessProvider() {
+               return array(
+                       array('a/b', 'a/c', array('a' => false, 'a/b' => true, 'a/c' => false)),
+                       array('a/b', 'b/b', array('a' => true, 'a/b' => true, 'b' => true, 'b/b' => false)),
+               );
+       }
+
+//     private function buildFileViewMock($updatables) {
+//             // mock filesysten
+//             $view = $this->getMock('\OC\Files\View', array('isUpdatable'), array(), '', FALSE);
+//
+//             foreach ($updatables as $path => $updatable) {
+//                     $view->expects($this->any())
+//                             ->method('isUpdatable')
+//                             ->with($this->identicalTo($path))
+//                             ->will($this->returnValue($updatable));
+//             }
+//
+//             return $view;
+//     }
+
+}