1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\DAV; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehlerclass PropPatchTest extends \PHPUnit_Framework_TestCase { 6*a1a3b679SAndreas Boehler 7*a1a3b679SAndreas Boehler protected $propPatch; 8*a1a3b679SAndreas Boehler 9*a1a3b679SAndreas Boehler public function setUp() { 10*a1a3b679SAndreas Boehler 11*a1a3b679SAndreas Boehler $this->propPatch = new PropPatch([ 12*a1a3b679SAndreas Boehler '{DAV:}displayname' => 'foo', 13*a1a3b679SAndreas Boehler ]); 14*a1a3b679SAndreas Boehler $this->assertEquals(['{DAV:}displayname' => 'foo'], $this->propPatch->getMutations()); 15*a1a3b679SAndreas Boehler 16*a1a3b679SAndreas Boehler } 17*a1a3b679SAndreas Boehler 18*a1a3b679SAndreas Boehler public function testHandleSingleSuccess() { 19*a1a3b679SAndreas Boehler 20*a1a3b679SAndreas Boehler $hasRan = false; 21*a1a3b679SAndreas Boehler 22*a1a3b679SAndreas Boehler $this->propPatch->handle('{DAV:}displayname', function($value) use (&$hasRan) { 23*a1a3b679SAndreas Boehler $hasRan = true; 24*a1a3b679SAndreas Boehler $this->assertEquals('foo', $value); 25*a1a3b679SAndreas Boehler return true; 26*a1a3b679SAndreas Boehler }); 27*a1a3b679SAndreas Boehler 28*a1a3b679SAndreas Boehler $this->assertTrue($this->propPatch->commit()); 29*a1a3b679SAndreas Boehler $result = $this->propPatch->getResult(); 30*a1a3b679SAndreas Boehler $this->assertEquals(['{DAV:}displayname' => 200], $result); 31*a1a3b679SAndreas Boehler 32*a1a3b679SAndreas Boehler $this->assertTrue($hasRan); 33*a1a3b679SAndreas Boehler 34*a1a3b679SAndreas Boehler } 35*a1a3b679SAndreas Boehler 36*a1a3b679SAndreas Boehler public function testHandleSingleFail() { 37*a1a3b679SAndreas Boehler 38*a1a3b679SAndreas Boehler $hasRan = false; 39*a1a3b679SAndreas Boehler 40*a1a3b679SAndreas Boehler $this->propPatch->handle('{DAV:}displayname', function($value) use (&$hasRan) { 41*a1a3b679SAndreas Boehler $hasRan = true; 42*a1a3b679SAndreas Boehler $this->assertEquals('foo', $value); 43*a1a3b679SAndreas Boehler return false; 44*a1a3b679SAndreas Boehler }); 45*a1a3b679SAndreas Boehler 46*a1a3b679SAndreas Boehler $this->assertFalse($this->propPatch->commit()); 47*a1a3b679SAndreas Boehler $result = $this->propPatch->getResult(); 48*a1a3b679SAndreas Boehler $this->assertEquals(['{DAV:}displayname' => 403], $result); 49*a1a3b679SAndreas Boehler 50*a1a3b679SAndreas Boehler $this->assertTrue($hasRan); 51*a1a3b679SAndreas Boehler 52*a1a3b679SAndreas Boehler } 53*a1a3b679SAndreas Boehler 54*a1a3b679SAndreas Boehler public function testHandleSingleCustomResult() { 55*a1a3b679SAndreas Boehler 56*a1a3b679SAndreas Boehler $hasRan = false; 57*a1a3b679SAndreas Boehler 58*a1a3b679SAndreas Boehler $this->propPatch->handle('{DAV:}displayname', function($value) use (&$hasRan) { 59*a1a3b679SAndreas Boehler $hasRan = true; 60*a1a3b679SAndreas Boehler $this->assertEquals('foo', $value); 61*a1a3b679SAndreas Boehler return 201; 62*a1a3b679SAndreas Boehler }); 63*a1a3b679SAndreas Boehler 64*a1a3b679SAndreas Boehler $this->assertTrue($this->propPatch->commit()); 65*a1a3b679SAndreas Boehler $result = $this->propPatch->getResult(); 66*a1a3b679SAndreas Boehler $this->assertEquals(['{DAV:}displayname' => 201], $result); 67*a1a3b679SAndreas Boehler 68*a1a3b679SAndreas Boehler $this->assertTrue($hasRan); 69*a1a3b679SAndreas Boehler 70*a1a3b679SAndreas Boehler } 71*a1a3b679SAndreas Boehler 72*a1a3b679SAndreas Boehler public function testHandleSingleDeleteSuccess() { 73*a1a3b679SAndreas Boehler 74*a1a3b679SAndreas Boehler $hasRan = false; 75*a1a3b679SAndreas Boehler 76*a1a3b679SAndreas Boehler $this->propPatch = new PropPatch(['{DAV:}displayname' => null]); 77*a1a3b679SAndreas Boehler $this->propPatch->handle('{DAV:}displayname', function($value) use (&$hasRan) { 78*a1a3b679SAndreas Boehler $hasRan = true; 79*a1a3b679SAndreas Boehler $this->assertNull($value); 80*a1a3b679SAndreas Boehler return true; 81*a1a3b679SAndreas Boehler }); 82*a1a3b679SAndreas Boehler 83*a1a3b679SAndreas Boehler $this->assertTrue($this->propPatch->commit()); 84*a1a3b679SAndreas Boehler $result = $this->propPatch->getResult(); 85*a1a3b679SAndreas Boehler $this->assertEquals(['{DAV:}displayname' => 204], $result); 86*a1a3b679SAndreas Boehler 87*a1a3b679SAndreas Boehler $this->assertTrue($hasRan); 88*a1a3b679SAndreas Boehler 89*a1a3b679SAndreas Boehler } 90*a1a3b679SAndreas Boehler 91*a1a3b679SAndreas Boehler 92*a1a3b679SAndreas Boehler public function testHandleNothing() { 93*a1a3b679SAndreas Boehler 94*a1a3b679SAndreas Boehler $hasRan = false; 95*a1a3b679SAndreas Boehler 96*a1a3b679SAndreas Boehler $this->propPatch->handle('{DAV:}foobar', function($value) use (&$hasRan) { 97*a1a3b679SAndreas Boehler $hasRan = true; 98*a1a3b679SAndreas Boehler }); 99*a1a3b679SAndreas Boehler 100*a1a3b679SAndreas Boehler $this->assertFalse($hasRan); 101*a1a3b679SAndreas Boehler 102*a1a3b679SAndreas Boehler } 103*a1a3b679SAndreas Boehler 104*a1a3b679SAndreas Boehler /** 105*a1a3b679SAndreas Boehler * @depends testHandleSingleSuccess 106*a1a3b679SAndreas Boehler */ 107*a1a3b679SAndreas Boehler public function testHandleRemaining() { 108*a1a3b679SAndreas Boehler 109*a1a3b679SAndreas Boehler $hasRan = false; 110*a1a3b679SAndreas Boehler 111*a1a3b679SAndreas Boehler $this->propPatch->handleRemaining(function($mutations) use (&$hasRan) { 112*a1a3b679SAndreas Boehler $hasRan = true; 113*a1a3b679SAndreas Boehler $this->assertEquals(['{DAV:}displayname' => 'foo'], $mutations); 114*a1a3b679SAndreas Boehler return true; 115*a1a3b679SAndreas Boehler }); 116*a1a3b679SAndreas Boehler 117*a1a3b679SAndreas Boehler $this->assertTrue($this->propPatch->commit()); 118*a1a3b679SAndreas Boehler $result = $this->propPatch->getResult(); 119*a1a3b679SAndreas Boehler $this->assertEquals(['{DAV:}displayname' => 200], $result); 120*a1a3b679SAndreas Boehler 121*a1a3b679SAndreas Boehler $this->assertTrue($hasRan); 122*a1a3b679SAndreas Boehler 123*a1a3b679SAndreas Boehler } 124*a1a3b679SAndreas Boehler public function testHandleRemainingNothingToDo() { 125*a1a3b679SAndreas Boehler 126*a1a3b679SAndreas Boehler $hasRan = false; 127*a1a3b679SAndreas Boehler 128*a1a3b679SAndreas Boehler $this->propPatch->handle('{DAV:}displayname', function() {} ); 129*a1a3b679SAndreas Boehler $this->propPatch->handleRemaining(function($mutations) use (&$hasRan) { 130*a1a3b679SAndreas Boehler $hasRan = true; 131*a1a3b679SAndreas Boehler }); 132*a1a3b679SAndreas Boehler 133*a1a3b679SAndreas Boehler $this->assertFalse($hasRan); 134*a1a3b679SAndreas Boehler 135*a1a3b679SAndreas Boehler } 136*a1a3b679SAndreas Boehler 137*a1a3b679SAndreas Boehler public function testSetResultCode() { 138*a1a3b679SAndreas Boehler 139*a1a3b679SAndreas Boehler $this->propPatch->setResultCode('{DAV:}displayname', 201); 140*a1a3b679SAndreas Boehler $this->assertTrue($this->propPatch->commit()); 141*a1a3b679SAndreas Boehler $result = $this->propPatch->getResult(); 142*a1a3b679SAndreas Boehler $this->assertEquals(['{DAV:}displayname' => 201], $result); 143*a1a3b679SAndreas Boehler 144*a1a3b679SAndreas Boehler } 145*a1a3b679SAndreas Boehler 146*a1a3b679SAndreas Boehler public function testSetResultCodeFail() { 147*a1a3b679SAndreas Boehler 148*a1a3b679SAndreas Boehler $this->propPatch->setResultCode('{DAV:}displayname', 402); 149*a1a3b679SAndreas Boehler $this->assertFalse($this->propPatch->commit()); 150*a1a3b679SAndreas Boehler $result = $this->propPatch->getResult(); 151*a1a3b679SAndreas Boehler $this->assertEquals(['{DAV:}displayname' => 402], $result); 152*a1a3b679SAndreas Boehler 153*a1a3b679SAndreas Boehler } 154*a1a3b679SAndreas Boehler 155*a1a3b679SAndreas Boehler public function testSetRemainingResultCode() { 156*a1a3b679SAndreas Boehler 157*a1a3b679SAndreas Boehler $this->propPatch->setRemainingResultCode(204); 158*a1a3b679SAndreas Boehler $this->assertTrue($this->propPatch->commit()); 159*a1a3b679SAndreas Boehler $result = $this->propPatch->getResult(); 160*a1a3b679SAndreas Boehler $this->assertEquals(['{DAV:}displayname' => 204], $result); 161*a1a3b679SAndreas Boehler 162*a1a3b679SAndreas Boehler } 163*a1a3b679SAndreas Boehler 164*a1a3b679SAndreas Boehler public function testCommitNoHandler() { 165*a1a3b679SAndreas Boehler 166*a1a3b679SAndreas Boehler $this->assertFalse($this->propPatch->commit()); 167*a1a3b679SAndreas Boehler $result = $this->propPatch->getResult(); 168*a1a3b679SAndreas Boehler $this->assertEquals(['{DAV:}displayname' => 403], $result); 169*a1a3b679SAndreas Boehler 170*a1a3b679SAndreas Boehler } 171*a1a3b679SAndreas Boehler 172*a1a3b679SAndreas Boehler public function testHandlerNotCalled() { 173*a1a3b679SAndreas Boehler 174*a1a3b679SAndreas Boehler $hasRan = false; 175*a1a3b679SAndreas Boehler 176*a1a3b679SAndreas Boehler $this->propPatch->setResultCode('{DAV:}displayname', 402); 177*a1a3b679SAndreas Boehler $this->propPatch->handle('{DAV:}displayname', function($value) use (&$hasRan) { 178*a1a3b679SAndreas Boehler $hasRan = true; 179*a1a3b679SAndreas Boehler }); 180*a1a3b679SAndreas Boehler 181*a1a3b679SAndreas Boehler $this->propPatch->commit(); 182*a1a3b679SAndreas Boehler 183*a1a3b679SAndreas Boehler // The handler is not supposed to have ran 184*a1a3b679SAndreas Boehler $this->assertFalse($hasRan); 185*a1a3b679SAndreas Boehler 186*a1a3b679SAndreas Boehler } 187*a1a3b679SAndreas Boehler 188*a1a3b679SAndreas Boehler public function testDependencyFail() { 189*a1a3b679SAndreas Boehler 190*a1a3b679SAndreas Boehler $propPatch = new PropPatch([ 191*a1a3b679SAndreas Boehler '{DAV:}a' => 'foo', 192*a1a3b679SAndreas Boehler '{DAV:}b' => 'bar', 193*a1a3b679SAndreas Boehler ]); 194*a1a3b679SAndreas Boehler 195*a1a3b679SAndreas Boehler $calledA = false; 196*a1a3b679SAndreas Boehler $calledB = false; 197*a1a3b679SAndreas Boehler 198*a1a3b679SAndreas Boehler $propPatch->handle('{DAV:}a', function() use (&$calledA) { 199*a1a3b679SAndreas Boehler $calledA = true; 200*a1a3b679SAndreas Boehler return false; 201*a1a3b679SAndreas Boehler }); 202*a1a3b679SAndreas Boehler $propPatch->handle('{DAV:}b', function() use (&$calledB) { 203*a1a3b679SAndreas Boehler $calledB = true; 204*a1a3b679SAndreas Boehler return false; 205*a1a3b679SAndreas Boehler }); 206*a1a3b679SAndreas Boehler 207*a1a3b679SAndreas Boehler $result = $propPatch->commit(); 208*a1a3b679SAndreas Boehler $this->assertTrue($calledA); 209*a1a3b679SAndreas Boehler $this->assertFalse($calledB); 210*a1a3b679SAndreas Boehler 211*a1a3b679SAndreas Boehler $this->assertFalse($result); 212*a1a3b679SAndreas Boehler 213*a1a3b679SAndreas Boehler $this->assertEquals([ 214*a1a3b679SAndreas Boehler '{DAV:}a' => 403, 215*a1a3b679SAndreas Boehler '{DAV:}b' => 424, 216*a1a3b679SAndreas Boehler ], $propPatch->getResult()); 217*a1a3b679SAndreas Boehler 218*a1a3b679SAndreas Boehler } 219*a1a3b679SAndreas Boehler 220*a1a3b679SAndreas Boehler /** 221*a1a3b679SAndreas Boehler * @expectedException \UnexpectedValueException 222*a1a3b679SAndreas Boehler */ 223*a1a3b679SAndreas Boehler public function testHandleSingleBrokenResult() { 224*a1a3b679SAndreas Boehler 225*a1a3b679SAndreas Boehler $propPatch = new PropPatch([ 226*a1a3b679SAndreas Boehler '{DAV:}a' => 'foo', 227*a1a3b679SAndreas Boehler ]); 228*a1a3b679SAndreas Boehler 229*a1a3b679SAndreas Boehler $calledA = false; 230*a1a3b679SAndreas Boehler $calledB = false; 231*a1a3b679SAndreas Boehler 232*a1a3b679SAndreas Boehler $propPatch->handle('{DAV:}a', function() use (&$calledA) { 233*a1a3b679SAndreas Boehler return []; 234*a1a3b679SAndreas Boehler }); 235*a1a3b679SAndreas Boehler $propPatch->commit(); 236*a1a3b679SAndreas Boehler 237*a1a3b679SAndreas Boehler } 238*a1a3b679SAndreas Boehler 239*a1a3b679SAndreas Boehler public function testHandleMultiValueSuccess() { 240*a1a3b679SAndreas Boehler 241*a1a3b679SAndreas Boehler $propPatch = new PropPatch([ 242*a1a3b679SAndreas Boehler '{DAV:}a' => 'foo', 243*a1a3b679SAndreas Boehler '{DAV:}b' => 'bar', 244*a1a3b679SAndreas Boehler '{DAV:}c' => null, 245*a1a3b679SAndreas Boehler ]); 246*a1a3b679SAndreas Boehler 247*a1a3b679SAndreas Boehler $calledA = false; 248*a1a3b679SAndreas Boehler 249*a1a3b679SAndreas Boehler $propPatch->handle(['{DAV:}a', '{DAV:}b', '{DAV:}c'], function($properties) use (&$calledA) { 250*a1a3b679SAndreas Boehler $calledA = true; 251*a1a3b679SAndreas Boehler $this->assertEquals([ 252*a1a3b679SAndreas Boehler '{DAV:}a' => 'foo', 253*a1a3b679SAndreas Boehler '{DAV:}b' => 'bar', 254*a1a3b679SAndreas Boehler '{DAV:}c' => null, 255*a1a3b679SAndreas Boehler ], $properties); 256*a1a3b679SAndreas Boehler return true; 257*a1a3b679SAndreas Boehler }); 258*a1a3b679SAndreas Boehler $result = $propPatch->commit(); 259*a1a3b679SAndreas Boehler $this->assertTrue($calledA); 260*a1a3b679SAndreas Boehler $this->assertTrue($result); 261*a1a3b679SAndreas Boehler 262*a1a3b679SAndreas Boehler $this->assertEquals([ 263*a1a3b679SAndreas Boehler '{DAV:}a' => 200, 264*a1a3b679SAndreas Boehler '{DAV:}b' => 200, 265*a1a3b679SAndreas Boehler '{DAV:}c' => 204, 266*a1a3b679SAndreas Boehler ], $propPatch->getResult()); 267*a1a3b679SAndreas Boehler 268*a1a3b679SAndreas Boehler } 269*a1a3b679SAndreas Boehler 270*a1a3b679SAndreas Boehler 271*a1a3b679SAndreas Boehler public function testHandleMultiValueFail() { 272*a1a3b679SAndreas Boehler 273*a1a3b679SAndreas Boehler $propPatch = new PropPatch([ 274*a1a3b679SAndreas Boehler '{DAV:}a' => 'foo', 275*a1a3b679SAndreas Boehler '{DAV:}b' => 'bar', 276*a1a3b679SAndreas Boehler '{DAV:}c' => null, 277*a1a3b679SAndreas Boehler ]); 278*a1a3b679SAndreas Boehler 279*a1a3b679SAndreas Boehler $calledA = false; 280*a1a3b679SAndreas Boehler 281*a1a3b679SAndreas Boehler $propPatch->handle(['{DAV:}a', '{DAV:}b', '{DAV:}c'], function($properties) use (&$calledA) { 282*a1a3b679SAndreas Boehler $calledA = true; 283*a1a3b679SAndreas Boehler $this->assertEquals([ 284*a1a3b679SAndreas Boehler '{DAV:}a' => 'foo', 285*a1a3b679SAndreas Boehler '{DAV:}b' => 'bar', 286*a1a3b679SAndreas Boehler '{DAV:}c' => null, 287*a1a3b679SAndreas Boehler ], $properties); 288*a1a3b679SAndreas Boehler return false; 289*a1a3b679SAndreas Boehler }); 290*a1a3b679SAndreas Boehler $result = $propPatch->commit(); 291*a1a3b679SAndreas Boehler $this->assertTrue($calledA); 292*a1a3b679SAndreas Boehler $this->assertFalse($result); 293*a1a3b679SAndreas Boehler 294*a1a3b679SAndreas Boehler $this->assertEquals([ 295*a1a3b679SAndreas Boehler '{DAV:}a' => 403, 296*a1a3b679SAndreas Boehler '{DAV:}b' => 403, 297*a1a3b679SAndreas Boehler '{DAV:}c' => 403, 298*a1a3b679SAndreas Boehler ], $propPatch->getResult()); 299*a1a3b679SAndreas Boehler 300*a1a3b679SAndreas Boehler } 301*a1a3b679SAndreas Boehler 302*a1a3b679SAndreas Boehler public function testHandleMultiValueCustomResult() { 303*a1a3b679SAndreas Boehler 304*a1a3b679SAndreas Boehler $propPatch = new PropPatch([ 305*a1a3b679SAndreas Boehler '{DAV:}a' => 'foo', 306*a1a3b679SAndreas Boehler '{DAV:}b' => 'bar', 307*a1a3b679SAndreas Boehler '{DAV:}c' => null, 308*a1a3b679SAndreas Boehler ]); 309*a1a3b679SAndreas Boehler 310*a1a3b679SAndreas Boehler $calledA = false; 311*a1a3b679SAndreas Boehler 312*a1a3b679SAndreas Boehler $propPatch->handle(['{DAV:}a', '{DAV:}b', '{DAV:}c'], function($properties) use (&$calledA) { 313*a1a3b679SAndreas Boehler $calledA = true; 314*a1a3b679SAndreas Boehler $this->assertEquals([ 315*a1a3b679SAndreas Boehler '{DAV:}a' => 'foo', 316*a1a3b679SAndreas Boehler '{DAV:}b' => 'bar', 317*a1a3b679SAndreas Boehler '{DAV:}c' => null, 318*a1a3b679SAndreas Boehler ], $properties); 319*a1a3b679SAndreas Boehler 320*a1a3b679SAndreas Boehler return [ 321*a1a3b679SAndreas Boehler '{DAV:}a' => 201, 322*a1a3b679SAndreas Boehler '{DAV:}b' => 204, 323*a1a3b679SAndreas Boehler ]; 324*a1a3b679SAndreas Boehler return false; 325*a1a3b679SAndreas Boehler }); 326*a1a3b679SAndreas Boehler $result = $propPatch->commit(); 327*a1a3b679SAndreas Boehler $this->assertTrue($calledA); 328*a1a3b679SAndreas Boehler $this->assertFalse($result); 329*a1a3b679SAndreas Boehler 330*a1a3b679SAndreas Boehler $this->assertEquals([ 331*a1a3b679SAndreas Boehler '{DAV:}a' => 201, 332*a1a3b679SAndreas Boehler '{DAV:}b' => 204, 333*a1a3b679SAndreas Boehler '{DAV:}c' => 500, 334*a1a3b679SAndreas Boehler ], $propPatch->getResult()); 335*a1a3b679SAndreas Boehler 336*a1a3b679SAndreas Boehler } 337*a1a3b679SAndreas Boehler 338*a1a3b679SAndreas Boehler /** 339*a1a3b679SAndreas Boehler * @expectedException \UnexpectedValueException 340*a1a3b679SAndreas Boehler */ 341*a1a3b679SAndreas Boehler public function testHandleMultiValueBroken() { 342*a1a3b679SAndreas Boehler 343*a1a3b679SAndreas Boehler $propPatch = new PropPatch([ 344*a1a3b679SAndreas Boehler '{DAV:}a' => 'foo', 345*a1a3b679SAndreas Boehler '{DAV:}b' => 'bar', 346*a1a3b679SAndreas Boehler '{DAV:}c' => null, 347*a1a3b679SAndreas Boehler ]); 348*a1a3b679SAndreas Boehler 349*a1a3b679SAndreas Boehler $calledA = false; 350*a1a3b679SAndreas Boehler 351*a1a3b679SAndreas Boehler $propPatch->handle(['{DAV:}a', '{DAV:}b', '{DAV:}c'], function($properties) use (&$calledA) { 352*a1a3b679SAndreas Boehler return 'hi'; 353*a1a3b679SAndreas Boehler }); 354*a1a3b679SAndreas Boehler $propPatch->commit(); 355*a1a3b679SAndreas Boehler 356*a1a3b679SAndreas Boehler } 357*a1a3b679SAndreas Boehler} 358