1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\DAV; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehlerclass TreeTest extends \PHPUnit_Framework_TestCase { 6*a1a3b679SAndreas Boehler 7*a1a3b679SAndreas Boehler function testNodeExists() { 8*a1a3b679SAndreas Boehler 9*a1a3b679SAndreas Boehler $tree = new TreeMock(); 10*a1a3b679SAndreas Boehler 11*a1a3b679SAndreas Boehler $this->assertTrue($tree->nodeExists('hi')); 12*a1a3b679SAndreas Boehler $this->assertFalse($tree->nodeExists('hello')); 13*a1a3b679SAndreas Boehler 14*a1a3b679SAndreas Boehler } 15*a1a3b679SAndreas Boehler 16*a1a3b679SAndreas Boehler function testCopy() { 17*a1a3b679SAndreas Boehler 18*a1a3b679SAndreas Boehler $tree = new TreeMock(); 19*a1a3b679SAndreas Boehler $tree->copy('hi','hi2'); 20*a1a3b679SAndreas Boehler 21*a1a3b679SAndreas Boehler $this->assertArrayHasKey('hi2', $tree->getNodeForPath('')->newDirectories); 22*a1a3b679SAndreas Boehler $this->assertEquals('foobar', $tree->getNodeForPath('hi/file')->get()); 23*a1a3b679SAndreas Boehler $this->assertEquals(array('test1'=>'value'), $tree->getNodeForPath('hi/file')->getProperties(array())); 24*a1a3b679SAndreas Boehler 25*a1a3b679SAndreas Boehler } 26*a1a3b679SAndreas Boehler 27*a1a3b679SAndreas Boehler function testMove() { 28*a1a3b679SAndreas Boehler 29*a1a3b679SAndreas Boehler $tree = new TreeMock(); 30*a1a3b679SAndreas Boehler $tree->move('hi','hi2'); 31*a1a3b679SAndreas Boehler 32*a1a3b679SAndreas Boehler $this->assertEquals('hi2', $tree->getNodeForPath('hi')->getName()); 33*a1a3b679SAndreas Boehler $this->assertTrue($tree->getNodeForPath('hi')->isRenamed); 34*a1a3b679SAndreas Boehler 35*a1a3b679SAndreas Boehler } 36*a1a3b679SAndreas Boehler 37*a1a3b679SAndreas Boehler function testDeepMove() { 38*a1a3b679SAndreas Boehler 39*a1a3b679SAndreas Boehler $tree = new TreeMock(); 40*a1a3b679SAndreas Boehler $tree->move('hi/sub','hi2'); 41*a1a3b679SAndreas Boehler 42*a1a3b679SAndreas Boehler $this->assertArrayHasKey('hi2', $tree->getNodeForPath('')->newDirectories); 43*a1a3b679SAndreas Boehler $this->assertTrue($tree->getNodeForPath('hi/sub')->isDeleted); 44*a1a3b679SAndreas Boehler 45*a1a3b679SAndreas Boehler } 46*a1a3b679SAndreas Boehler 47*a1a3b679SAndreas Boehler function testDelete() { 48*a1a3b679SAndreas Boehler 49*a1a3b679SAndreas Boehler $tree = new TreeMock(); 50*a1a3b679SAndreas Boehler $tree->delete('hi'); 51*a1a3b679SAndreas Boehler $this->assertTrue($tree->getNodeForPath('hi')->isDeleted); 52*a1a3b679SAndreas Boehler 53*a1a3b679SAndreas Boehler } 54*a1a3b679SAndreas Boehler 55*a1a3b679SAndreas Boehler function testGetChildren() { 56*a1a3b679SAndreas Boehler 57*a1a3b679SAndreas Boehler $tree = new TreeMock(); 58*a1a3b679SAndreas Boehler $children = $tree->getChildren(''); 59*a1a3b679SAndreas Boehler $this->assertEquals(2,count($children)); 60*a1a3b679SAndreas Boehler $this->assertEquals('hi', $children[0]->getName()); 61*a1a3b679SAndreas Boehler 62*a1a3b679SAndreas Boehler } 63*a1a3b679SAndreas Boehler 64*a1a3b679SAndreas Boehler function testGetMultipleNodes() { 65*a1a3b679SAndreas Boehler 66*a1a3b679SAndreas Boehler $tree = new TreeMock(); 67*a1a3b679SAndreas Boehler $result = $tree->getMultipleNodes(['hi/sub', 'hi/file']); 68*a1a3b679SAndreas Boehler $this->assertArrayHasKey('hi/sub', $result); 69*a1a3b679SAndreas Boehler $this->assertArrayHasKey('hi/file', $result); 70*a1a3b679SAndreas Boehler 71*a1a3b679SAndreas Boehler $this->assertEquals('sub', $result['hi/sub']->getName()); 72*a1a3b679SAndreas Boehler $this->assertEquals('file', $result['hi/file']->getName()); 73*a1a3b679SAndreas Boehler 74*a1a3b679SAndreas Boehler } 75*a1a3b679SAndreas Boehler function testGetMultipleNodes2() { 76*a1a3b679SAndreas Boehler 77*a1a3b679SAndreas Boehler $tree = new TreeMock(); 78*a1a3b679SAndreas Boehler $result = $tree->getMultipleNodes(['multi/1', 'multi/2']); 79*a1a3b679SAndreas Boehler $this->assertArrayHasKey('multi/1', $result); 80*a1a3b679SAndreas Boehler $this->assertArrayHasKey('multi/2', $result); 81*a1a3b679SAndreas Boehler 82*a1a3b679SAndreas Boehler } 83*a1a3b679SAndreas Boehler 84*a1a3b679SAndreas Boehler} 85*a1a3b679SAndreas Boehler 86*a1a3b679SAndreas Boehlerclass TreeMock extends Tree { 87*a1a3b679SAndreas Boehler 88*a1a3b679SAndreas Boehler private $nodes = array(); 89*a1a3b679SAndreas Boehler 90*a1a3b679SAndreas Boehler function __construct() { 91*a1a3b679SAndreas Boehler 92*a1a3b679SAndreas Boehler $file = new TreeFileTester('file'); 93*a1a3b679SAndreas Boehler $file->properties = ['test1'=>'value']; 94*a1a3b679SAndreas Boehler $file->data = 'foobar'; 95*a1a3b679SAndreas Boehler 96*a1a3b679SAndreas Boehler parent::__construct( 97*a1a3b679SAndreas Boehler new TreeDirectoryTester('root', [ 98*a1a3b679SAndreas Boehler new TreeDirectoryTester('hi', [ 99*a1a3b679SAndreas Boehler new TreeDirectoryTester('sub'), 100*a1a3b679SAndreas Boehler $file, 101*a1a3b679SAndreas Boehler ]), 102*a1a3b679SAndreas Boehler new TreeMultiGetTester('multi', [ 103*a1a3b679SAndreas Boehler new TreeFileTester('1'), 104*a1a3b679SAndreas Boehler new TreeFileTester('2'), 105*a1a3b679SAndreas Boehler new TreeFileTester('3'), 106*a1a3b679SAndreas Boehler ]) 107*a1a3b679SAndreas Boehler ]) 108*a1a3b679SAndreas Boehler ); 109*a1a3b679SAndreas Boehler 110*a1a3b679SAndreas Boehler } 111*a1a3b679SAndreas Boehler 112*a1a3b679SAndreas Boehler} 113*a1a3b679SAndreas Boehler 114*a1a3b679SAndreas Boehlerclass TreeDirectoryTester extends SimpleCollection { 115*a1a3b679SAndreas Boehler 116*a1a3b679SAndreas Boehler public $newDirectories = array(); 117*a1a3b679SAndreas Boehler public $newFiles = array(); 118*a1a3b679SAndreas Boehler public $isDeleted = false; 119*a1a3b679SAndreas Boehler public $isRenamed = false; 120*a1a3b679SAndreas Boehler 121*a1a3b679SAndreas Boehler function createDirectory($name) { 122*a1a3b679SAndreas Boehler 123*a1a3b679SAndreas Boehler $this->newDirectories[$name] = true; 124*a1a3b679SAndreas Boehler 125*a1a3b679SAndreas Boehler } 126*a1a3b679SAndreas Boehler 127*a1a3b679SAndreas Boehler function createFile($name,$data = null) { 128*a1a3b679SAndreas Boehler 129*a1a3b679SAndreas Boehler $this->newFiles[$name] = $data; 130*a1a3b679SAndreas Boehler 131*a1a3b679SAndreas Boehler } 132*a1a3b679SAndreas Boehler 133*a1a3b679SAndreas Boehler function getChild($name) { 134*a1a3b679SAndreas Boehler 135*a1a3b679SAndreas Boehler if (isset($this->newDirectories[$name])) return new TreeDirectoryTester($name); 136*a1a3b679SAndreas Boehler if (isset($this->newFiles[$name])) return new TreeFileTester($name, $this->newFiles[$name]); 137*a1a3b679SAndreas Boehler return parent::getChild($name); 138*a1a3b679SAndreas Boehler 139*a1a3b679SAndreas Boehler } 140*a1a3b679SAndreas Boehler 141*a1a3b679SAndreas Boehler function childExists($name) { 142*a1a3b679SAndreas Boehler 143*a1a3b679SAndreas Boehler return !!$this->getChild($name); 144*a1a3b679SAndreas Boehler 145*a1a3b679SAndreas Boehler } 146*a1a3b679SAndreas Boehler 147*a1a3b679SAndreas Boehler function delete() { 148*a1a3b679SAndreas Boehler 149*a1a3b679SAndreas Boehler $this->isDeleted = true; 150*a1a3b679SAndreas Boehler 151*a1a3b679SAndreas Boehler } 152*a1a3b679SAndreas Boehler 153*a1a3b679SAndreas Boehler function setName($name) { 154*a1a3b679SAndreas Boehler 155*a1a3b679SAndreas Boehler $this->isRenamed = true; 156*a1a3b679SAndreas Boehler $this->name = $name; 157*a1a3b679SAndreas Boehler 158*a1a3b679SAndreas Boehler } 159*a1a3b679SAndreas Boehler 160*a1a3b679SAndreas Boehler} 161*a1a3b679SAndreas Boehler 162*a1a3b679SAndreas Boehlerclass TreeFileTester extends File implements IProperties { 163*a1a3b679SAndreas Boehler 164*a1a3b679SAndreas Boehler public $name; 165*a1a3b679SAndreas Boehler public $data; 166*a1a3b679SAndreas Boehler public $properties; 167*a1a3b679SAndreas Boehler 168*a1a3b679SAndreas Boehler function __construct($name, $data = null) { 169*a1a3b679SAndreas Boehler 170*a1a3b679SAndreas Boehler $this->name = $name; 171*a1a3b679SAndreas Boehler if (is_null($data)) $data = 'bla'; 172*a1a3b679SAndreas Boehler $this->data = $data; 173*a1a3b679SAndreas Boehler 174*a1a3b679SAndreas Boehler } 175*a1a3b679SAndreas Boehler 176*a1a3b679SAndreas Boehler function getName() { 177*a1a3b679SAndreas Boehler 178*a1a3b679SAndreas Boehler return $this->name; 179*a1a3b679SAndreas Boehler 180*a1a3b679SAndreas Boehler } 181*a1a3b679SAndreas Boehler 182*a1a3b679SAndreas Boehler function get() { 183*a1a3b679SAndreas Boehler 184*a1a3b679SAndreas Boehler return $this->data; 185*a1a3b679SAndreas Boehler 186*a1a3b679SAndreas Boehler } 187*a1a3b679SAndreas Boehler 188*a1a3b679SAndreas Boehler function getProperties($properties) { 189*a1a3b679SAndreas Boehler 190*a1a3b679SAndreas Boehler return $this->properties; 191*a1a3b679SAndreas Boehler 192*a1a3b679SAndreas Boehler } 193*a1a3b679SAndreas Boehler 194*a1a3b679SAndreas Boehler /** 195*a1a3b679SAndreas Boehler * Updates properties on this node. 196*a1a3b679SAndreas Boehler * 197*a1a3b679SAndreas Boehler * This method received a PropPatch object, which contains all the 198*a1a3b679SAndreas Boehler * information about the update. 199*a1a3b679SAndreas Boehler * 200*a1a3b679SAndreas Boehler * To update specific properties, call the 'handle' method on this object. 201*a1a3b679SAndreas Boehler * Read the PropPatch documentation for more information. 202*a1a3b679SAndreas Boehler * 203*a1a3b679SAndreas Boehler * @param array $mutations 204*a1a3b679SAndreas Boehler * @return bool|array 205*a1a3b679SAndreas Boehler */ 206*a1a3b679SAndreas Boehler function propPatch(PropPatch $propPatch) { 207*a1a3b679SAndreas Boehler 208*a1a3b679SAndreas Boehler $this->properties = $propPatch->getMutations(); 209*a1a3b679SAndreas Boehler $propPatch->setRemainingResultCode(200); 210*a1a3b679SAndreas Boehler 211*a1a3b679SAndreas Boehler } 212*a1a3b679SAndreas Boehler 213*a1a3b679SAndreas Boehler} 214*a1a3b679SAndreas Boehler 215*a1a3b679SAndreas Boehlerclass TreeMultiGetTester extends TreeDirectoryTester implements IMultiGet { 216*a1a3b679SAndreas Boehler 217*a1a3b679SAndreas Boehler /** 218*a1a3b679SAndreas Boehler * This method receives a list of paths in it's first argument. 219*a1a3b679SAndreas Boehler * It must return an array with Node objects. 220*a1a3b679SAndreas Boehler * 221*a1a3b679SAndreas Boehler * If any children are not found, you do not have to return them. 222*a1a3b679SAndreas Boehler * 223*a1a3b679SAndreas Boehler * @return array 224*a1a3b679SAndreas Boehler */ 225*a1a3b679SAndreas Boehler function getMultipleChildren(array $paths) { 226*a1a3b679SAndreas Boehler 227*a1a3b679SAndreas Boehler $result = []; 228*a1a3b679SAndreas Boehler foreach($paths as $path) { 229*a1a3b679SAndreas Boehler try { 230*a1a3b679SAndreas Boehler $child = $this->getChild($path); 231*a1a3b679SAndreas Boehler $result[] = $child; 232*a1a3b679SAndreas Boehler } catch (Exception\NotFound $e) { 233*a1a3b679SAndreas Boehler // Do nothing 234*a1a3b679SAndreas Boehler } 235*a1a3b679SAndreas Boehler } 236*a1a3b679SAndreas Boehler 237*a1a3b679SAndreas Boehler return $result; 238*a1a3b679SAndreas Boehler 239*a1a3b679SAndreas Boehler } 240*a1a3b679SAndreas Boehler 241*a1a3b679SAndreas Boehler} 242