Browse Source

adding unit tests for ObjectTree::move()

tags/v6.0.0alpha2
Thomas Müller 10 years ago
parent
commit
b11d8799c1
2 changed files with 134 additions and 14 deletions
  1. 30
    14
      lib/connector/sabre/objecttree.php
  2. 104
    0
      tests/lib/connector/sabre/objecttree.php

+ 30
- 14
lib/connector/sabre/objecttree.php View 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;
}
}

+ 104
- 0
tests/lib/connector/sabre/objecttree.php View File

@@ -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;
// }

}

Loading…
Cancel
Save