xref: /plugin/davcal/vendor/sabre/dav/tests/Sabre/DAV/PropPatchTest.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
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