xref: /plugin/davcal/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/AbstractPDOTest.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
1*a1a3b679SAndreas Boehler<?php
2*a1a3b679SAndreas Boehler
3*a1a3b679SAndreas Boehlernamespace Sabre\CardDAV\Backend;
4*a1a3b679SAndreas Boehler
5*a1a3b679SAndreas Boehleruse Sabre\CardDAV;
6*a1a3b679SAndreas Boehleruse Sabre\DAV\PropPatch;
7*a1a3b679SAndreas Boehler
8*a1a3b679SAndreas Boehlerabstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
9*a1a3b679SAndreas Boehler
10*a1a3b679SAndreas Boehler    /**
11*a1a3b679SAndreas Boehler     * @var CardDAV\Backend\PDO
12*a1a3b679SAndreas Boehler     */
13*a1a3b679SAndreas Boehler    protected $backend;
14*a1a3b679SAndreas Boehler
15*a1a3b679SAndreas Boehler    /**
16*a1a3b679SAndreas Boehler     * @abstract
17*a1a3b679SAndreas Boehler     * @return PDO
18*a1a3b679SAndreas Boehler     */
19*a1a3b679SAndreas Boehler    abstract function getPDO();
20*a1a3b679SAndreas Boehler
21*a1a3b679SAndreas Boehler    public function setUp() {
22*a1a3b679SAndreas Boehler
23*a1a3b679SAndreas Boehler        $pdo = $this->getPDO();
24*a1a3b679SAndreas Boehler        $this->backend = new PDO($pdo);
25*a1a3b679SAndreas Boehler        $pdo->exec('INSERT INTO addressbooks (principaluri, displayname, uri, description, synctoken) VALUES ("principals/user1", "book1", "book1", "addressbook 1", 1)');
26*a1a3b679SAndreas Boehler        $pdo->exec('INSERT INTO cards (addressbookid, carddata, uri, lastmodified, etag, size) VALUES (1, "card1", "card1", 0, "' . md5('card1') . '", 5)');
27*a1a3b679SAndreas Boehler
28*a1a3b679SAndreas Boehler    }
29*a1a3b679SAndreas Boehler
30*a1a3b679SAndreas Boehler    public function testGetAddressBooksForUser() {
31*a1a3b679SAndreas Boehler
32*a1a3b679SAndreas Boehler        $result = $this->backend->getAddressBooksForUser('principals/user1');
33*a1a3b679SAndreas Boehler
34*a1a3b679SAndreas Boehler        $expected = array(
35*a1a3b679SAndreas Boehler            array(
36*a1a3b679SAndreas Boehler                'id' => 1,
37*a1a3b679SAndreas Boehler                'uri' => 'book1',
38*a1a3b679SAndreas Boehler                'principaluri' => 'principals/user1',
39*a1a3b679SAndreas Boehler                '{DAV:}displayname' => 'book1',
40*a1a3b679SAndreas Boehler                '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
41*a1a3b679SAndreas Boehler                '{http://calendarserver.org/ns/}getctag' => 1,
42*a1a3b679SAndreas Boehler                '{http://sabredav.org/ns}sync-token' => "1"
43*a1a3b679SAndreas Boehler            )
44*a1a3b679SAndreas Boehler        );
45*a1a3b679SAndreas Boehler
46*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $result);
47*a1a3b679SAndreas Boehler
48*a1a3b679SAndreas Boehler    }
49*a1a3b679SAndreas Boehler
50*a1a3b679SAndreas Boehler    public function testUpdateAddressBookInvalidProp() {
51*a1a3b679SAndreas Boehler
52*a1a3b679SAndreas Boehler        $propPatch = new PropPatch([
53*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'updated',
54*a1a3b679SAndreas Boehler            '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'updated',
55*a1a3b679SAndreas Boehler            '{DAV:}foo' => 'bar',
56*a1a3b679SAndreas Boehler        ]);
57*a1a3b679SAndreas Boehler
58*a1a3b679SAndreas Boehler        $this->backend->updateAddressBook(1, $propPatch);
59*a1a3b679SAndreas Boehler        $result = $propPatch->commit();
60*a1a3b679SAndreas Boehler
61*a1a3b679SAndreas Boehler        $this->assertFalse($result);
62*a1a3b679SAndreas Boehler
63*a1a3b679SAndreas Boehler        $result = $this->backend->getAddressBooksForUser('principals/user1');
64*a1a3b679SAndreas Boehler
65*a1a3b679SAndreas Boehler        $expected = array(
66*a1a3b679SAndreas Boehler            array(
67*a1a3b679SAndreas Boehler                'id' => 1,
68*a1a3b679SAndreas Boehler                'uri' => 'book1',
69*a1a3b679SAndreas Boehler                'principaluri' => 'principals/user1',
70*a1a3b679SAndreas Boehler                '{DAV:}displayname' => 'book1',
71*a1a3b679SAndreas Boehler                '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
72*a1a3b679SAndreas Boehler                '{http://calendarserver.org/ns/}getctag' => 1,
73*a1a3b679SAndreas Boehler                '{http://sabredav.org/ns}sync-token' => 1
74*a1a3b679SAndreas Boehler            )
75*a1a3b679SAndreas Boehler        );
76*a1a3b679SAndreas Boehler
77*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $result);
78*a1a3b679SAndreas Boehler
79*a1a3b679SAndreas Boehler    }
80*a1a3b679SAndreas Boehler
81*a1a3b679SAndreas Boehler    public function testUpdateAddressBookNoProps() {
82*a1a3b679SAndreas Boehler
83*a1a3b679SAndreas Boehler        $propPatch = new PropPatch([
84*a1a3b679SAndreas Boehler        ]);
85*a1a3b679SAndreas Boehler
86*a1a3b679SAndreas Boehler        $this->backend->updateAddressBook(1, $propPatch);
87*a1a3b679SAndreas Boehler        $result = $propPatch->commit();
88*a1a3b679SAndreas Boehler        $this->assertTrue($result);
89*a1a3b679SAndreas Boehler
90*a1a3b679SAndreas Boehler        $result = $this->backend->getAddressBooksForUser('principals/user1');
91*a1a3b679SAndreas Boehler
92*a1a3b679SAndreas Boehler        $expected = array(
93*a1a3b679SAndreas Boehler            array(
94*a1a3b679SAndreas Boehler                'id' => 1,
95*a1a3b679SAndreas Boehler                'uri' => 'book1',
96*a1a3b679SAndreas Boehler                'principaluri' => 'principals/user1',
97*a1a3b679SAndreas Boehler                '{DAV:}displayname' => 'book1',
98*a1a3b679SAndreas Boehler                '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
99*a1a3b679SAndreas Boehler                '{http://calendarserver.org/ns/}getctag' => 1,
100*a1a3b679SAndreas Boehler                '{http://sabredav.org/ns}sync-token' => 1
101*a1a3b679SAndreas Boehler            )
102*a1a3b679SAndreas Boehler        );
103*a1a3b679SAndreas Boehler
104*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $result);
105*a1a3b679SAndreas Boehler
106*a1a3b679SAndreas Boehler
107*a1a3b679SAndreas Boehler    }
108*a1a3b679SAndreas Boehler
109*a1a3b679SAndreas Boehler    public function testUpdateAddressBookSuccess() {
110*a1a3b679SAndreas Boehler
111*a1a3b679SAndreas Boehler        $propPatch = new PropPatch([
112*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'updated',
113*a1a3b679SAndreas Boehler            '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'updated',
114*a1a3b679SAndreas Boehler        ]);
115*a1a3b679SAndreas Boehler
116*a1a3b679SAndreas Boehler        $this->backend->updateAddressBook(1, $propPatch);
117*a1a3b679SAndreas Boehler        $result = $propPatch->commit();
118*a1a3b679SAndreas Boehler
119*a1a3b679SAndreas Boehler        $this->assertTrue($result);
120*a1a3b679SAndreas Boehler
121*a1a3b679SAndreas Boehler        $result = $this->backend->getAddressBooksForUser('principals/user1');
122*a1a3b679SAndreas Boehler
123*a1a3b679SAndreas Boehler        $expected = array(
124*a1a3b679SAndreas Boehler            array(
125*a1a3b679SAndreas Boehler                'id' => 1,
126*a1a3b679SAndreas Boehler                'uri' => 'book1',
127*a1a3b679SAndreas Boehler                'principaluri' => 'principals/user1',
128*a1a3b679SAndreas Boehler                '{DAV:}displayname' => 'updated',
129*a1a3b679SAndreas Boehler                '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'updated',
130*a1a3b679SAndreas Boehler                '{http://calendarserver.org/ns/}getctag' => 2,
131*a1a3b679SAndreas Boehler                '{http://sabredav.org/ns}sync-token' => 2
132*a1a3b679SAndreas Boehler            )
133*a1a3b679SAndreas Boehler        );
134*a1a3b679SAndreas Boehler
135*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $result);
136*a1a3b679SAndreas Boehler
137*a1a3b679SAndreas Boehler
138*a1a3b679SAndreas Boehler    }
139*a1a3b679SAndreas Boehler
140*a1a3b679SAndreas Boehler    public function testDeleteAddressBook() {
141*a1a3b679SAndreas Boehler
142*a1a3b679SAndreas Boehler        $this->backend->deleteAddressBook(1);
143*a1a3b679SAndreas Boehler
144*a1a3b679SAndreas Boehler        $this->assertEquals(array(), $this->backend->getAddressBooksForUser('principals/user1'));
145*a1a3b679SAndreas Boehler
146*a1a3b679SAndreas Boehler    }
147*a1a3b679SAndreas Boehler
148*a1a3b679SAndreas Boehler    /**
149*a1a3b679SAndreas Boehler     * @expectedException Sabre\DAV\Exception\BadRequest
150*a1a3b679SAndreas Boehler     */
151*a1a3b679SAndreas Boehler    public function testCreateAddressBookUnsupportedProp() {
152*a1a3b679SAndreas Boehler
153*a1a3b679SAndreas Boehler        $this->backend->createAddressBook('principals/user1','book2', array(
154*a1a3b679SAndreas Boehler            '{DAV:}foo' => 'bar',
155*a1a3b679SAndreas Boehler        ));
156*a1a3b679SAndreas Boehler
157*a1a3b679SAndreas Boehler    }
158*a1a3b679SAndreas Boehler
159*a1a3b679SAndreas Boehler    public function testCreateAddressBookSuccess() {
160*a1a3b679SAndreas Boehler
161*a1a3b679SAndreas Boehler        $this->backend->createAddressBook('principals/user1','book2', array(
162*a1a3b679SAndreas Boehler            '{DAV:}displayname' => 'book2',
163*a1a3b679SAndreas Boehler            '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 2',
164*a1a3b679SAndreas Boehler        ));
165*a1a3b679SAndreas Boehler
166*a1a3b679SAndreas Boehler        $expected = array(
167*a1a3b679SAndreas Boehler            array(
168*a1a3b679SAndreas Boehler                'id' => 1,
169*a1a3b679SAndreas Boehler                'uri' => 'book1',
170*a1a3b679SAndreas Boehler                'principaluri' => 'principals/user1',
171*a1a3b679SAndreas Boehler                '{DAV:}displayname' => 'book1',
172*a1a3b679SAndreas Boehler                '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
173*a1a3b679SAndreas Boehler                '{http://calendarserver.org/ns/}getctag' => 1,
174*a1a3b679SAndreas Boehler                '{http://sabredav.org/ns}sync-token' => 1,
175*a1a3b679SAndreas Boehler            ),
176*a1a3b679SAndreas Boehler            array(
177*a1a3b679SAndreas Boehler                'id' => 2,
178*a1a3b679SAndreas Boehler                'uri' => 'book2',
179*a1a3b679SAndreas Boehler                'principaluri' => 'principals/user1',
180*a1a3b679SAndreas Boehler                '{DAV:}displayname' => 'book2',
181*a1a3b679SAndreas Boehler                '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 2',
182*a1a3b679SAndreas Boehler                '{http://calendarserver.org/ns/}getctag' => 1,
183*a1a3b679SAndreas Boehler                '{http://sabredav.org/ns}sync-token' => 1,
184*a1a3b679SAndreas Boehler            )
185*a1a3b679SAndreas Boehler        );
186*a1a3b679SAndreas Boehler        $result = $this->backend->getAddressBooksForUser('principals/user1');
187*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $result);
188*a1a3b679SAndreas Boehler
189*a1a3b679SAndreas Boehler    }
190*a1a3b679SAndreas Boehler
191*a1a3b679SAndreas Boehler    public function testGetCards() {
192*a1a3b679SAndreas Boehler
193*a1a3b679SAndreas Boehler        $result = $this->backend->getCards(1);
194*a1a3b679SAndreas Boehler
195*a1a3b679SAndreas Boehler        $expected = array(
196*a1a3b679SAndreas Boehler            array(
197*a1a3b679SAndreas Boehler                'id' => 1,
198*a1a3b679SAndreas Boehler                'uri' => 'card1',
199*a1a3b679SAndreas Boehler                'lastmodified' => 0,
200*a1a3b679SAndreas Boehler                'etag' => '"' . md5('card1') . '"',
201*a1a3b679SAndreas Boehler                'size' => 5
202*a1a3b679SAndreas Boehler            )
203*a1a3b679SAndreas Boehler        );
204*a1a3b679SAndreas Boehler
205*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $result);
206*a1a3b679SAndreas Boehler
207*a1a3b679SAndreas Boehler    }
208*a1a3b679SAndreas Boehler
209*a1a3b679SAndreas Boehler    public function testGetCard() {
210*a1a3b679SAndreas Boehler
211*a1a3b679SAndreas Boehler        $result = $this->backend->getCard(1,'card1');
212*a1a3b679SAndreas Boehler
213*a1a3b679SAndreas Boehler        $expected = array(
214*a1a3b679SAndreas Boehler            'id' => 1,
215*a1a3b679SAndreas Boehler            'uri' => 'card1',
216*a1a3b679SAndreas Boehler            'carddata' => 'card1',
217*a1a3b679SAndreas Boehler            'lastmodified' => 0,
218*a1a3b679SAndreas Boehler            'etag' => '"' . md5('card1') . '"',
219*a1a3b679SAndreas Boehler            'size' => 5
220*a1a3b679SAndreas Boehler        );
221*a1a3b679SAndreas Boehler
222*a1a3b679SAndreas Boehler        $this->assertEquals($expected, $result);
223*a1a3b679SAndreas Boehler
224*a1a3b679SAndreas Boehler    }
225*a1a3b679SAndreas Boehler
226*a1a3b679SAndreas Boehler    /**
227*a1a3b679SAndreas Boehler     * @depends testGetCard
228*a1a3b679SAndreas Boehler     */
229*a1a3b679SAndreas Boehler    public function testCreateCard() {
230*a1a3b679SAndreas Boehler
231*a1a3b679SAndreas Boehler        $result = $this->backend->createCard(1, 'card2', 'data2');
232*a1a3b679SAndreas Boehler        $this->assertEquals('"' . md5('data2') . '"', $result);
233*a1a3b679SAndreas Boehler        $result = $this->backend->getCard(1,'card2');
234*a1a3b679SAndreas Boehler        $this->assertEquals(2, $result['id']);
235*a1a3b679SAndreas Boehler        $this->assertEquals('card2', $result['uri']);
236*a1a3b679SAndreas Boehler        $this->assertEquals('data2', $result['carddata']);
237*a1a3b679SAndreas Boehler
238*a1a3b679SAndreas Boehler    }
239*a1a3b679SAndreas Boehler
240*a1a3b679SAndreas Boehler    /**
241*a1a3b679SAndreas Boehler     * @depends testCreateCard
242*a1a3b679SAndreas Boehler     */
243*a1a3b679SAndreas Boehler    public function testGetMultiple() {
244*a1a3b679SAndreas Boehler
245*a1a3b679SAndreas Boehler        $result = $this->backend->createCard(1, 'card2', 'data2');
246*a1a3b679SAndreas Boehler        $result = $this->backend->createCard(1, 'card3', 'data3');
247*a1a3b679SAndreas Boehler        $check = [
248*a1a3b679SAndreas Boehler            [
249*a1a3b679SAndreas Boehler                'id' => 1,
250*a1a3b679SAndreas Boehler                'uri' => 'card1',
251*a1a3b679SAndreas Boehler                'carddata' => 'card1',
252*a1a3b679SAndreas Boehler                'lastmodified' => 0,
253*a1a3b679SAndreas Boehler            ],
254*a1a3b679SAndreas Boehler            [
255*a1a3b679SAndreas Boehler                'id' => 2,
256*a1a3b679SAndreas Boehler                'uri' => 'card2',
257*a1a3b679SAndreas Boehler                'carddata' => 'data2',
258*a1a3b679SAndreas Boehler                'lastmodified' => time(),
259*a1a3b679SAndreas Boehler            ],
260*a1a3b679SAndreas Boehler            [
261*a1a3b679SAndreas Boehler                'id' => 3,
262*a1a3b679SAndreas Boehler                'uri' => 'card3',
263*a1a3b679SAndreas Boehler                'carddata' => 'data3',
264*a1a3b679SAndreas Boehler                'lastmodified' => time(),
265*a1a3b679SAndreas Boehler            ],
266*a1a3b679SAndreas Boehler        ];
267*a1a3b679SAndreas Boehler
268*a1a3b679SAndreas Boehler        $result = $this->backend->getMultipleCards(1, ['card1','card2','card3']);
269*a1a3b679SAndreas Boehler
270*a1a3b679SAndreas Boehler        foreach($check as $index=>$node) {
271*a1a3b679SAndreas Boehler
272*a1a3b679SAndreas Boehler            foreach($node as $k=>$v) {
273*a1a3b679SAndreas Boehler
274*a1a3b679SAndreas Boehler                if ($k!=='lastmodified') {
275*a1a3b679SAndreas Boehler                    $this->assertEquals($v, $result[$index][$k]);
276*a1a3b679SAndreas Boehler                } else {
277*a1a3b679SAndreas Boehler                    $this->assertTrue(isset($result[$index][$k]));
278*a1a3b679SAndreas Boehler                }
279*a1a3b679SAndreas Boehler
280*a1a3b679SAndreas Boehler            }
281*a1a3b679SAndreas Boehler
282*a1a3b679SAndreas Boehler        }
283*a1a3b679SAndreas Boehler
284*a1a3b679SAndreas Boehler
285*a1a3b679SAndreas Boehler    }
286*a1a3b679SAndreas Boehler
287*a1a3b679SAndreas Boehler    /**
288*a1a3b679SAndreas Boehler     * @depends testGetCard
289*a1a3b679SAndreas Boehler     */
290*a1a3b679SAndreas Boehler    public function testUpdateCard() {
291*a1a3b679SAndreas Boehler
292*a1a3b679SAndreas Boehler        $result = $this->backend->updateCard(1, 'card1', 'newdata');
293*a1a3b679SAndreas Boehler        $this->assertEquals('"' . md5('newdata') . '"', $result);
294*a1a3b679SAndreas Boehler
295*a1a3b679SAndreas Boehler        $result = $this->backend->getCard(1,'card1');
296*a1a3b679SAndreas Boehler        $this->assertEquals(1, $result['id']);
297*a1a3b679SAndreas Boehler        $this->assertEquals('newdata', $result['carddata']);
298*a1a3b679SAndreas Boehler
299*a1a3b679SAndreas Boehler    }
300*a1a3b679SAndreas Boehler
301*a1a3b679SAndreas Boehler    /**
302*a1a3b679SAndreas Boehler     * @depends testGetCard
303*a1a3b679SAndreas Boehler     */
304*a1a3b679SAndreas Boehler    public function testDeleteCard() {
305*a1a3b679SAndreas Boehler
306*a1a3b679SAndreas Boehler        $this->backend->deleteCard(1, 'card1');
307*a1a3b679SAndreas Boehler        $result = $this->backend->getCard(1,'card1');
308*a1a3b679SAndreas Boehler        $this->assertFalse($result);
309*a1a3b679SAndreas Boehler
310*a1a3b679SAndreas Boehler    }
311*a1a3b679SAndreas Boehler
312*a1a3b679SAndreas Boehler    function testGetChanges() {
313*a1a3b679SAndreas Boehler
314*a1a3b679SAndreas Boehler        $backend = $this->backend;
315*a1a3b679SAndreas Boehler        $id = $backend->createAddressBook(
316*a1a3b679SAndreas Boehler            'principals/user1',
317*a1a3b679SAndreas Boehler            'bla',
318*a1a3b679SAndreas Boehler            []
319*a1a3b679SAndreas Boehler        );
320*a1a3b679SAndreas Boehler        $result = $backend->getChangesForAddressBook($id, null, 1);
321*a1a3b679SAndreas Boehler
322*a1a3b679SAndreas Boehler        $this->assertEquals([
323*a1a3b679SAndreas Boehler            'syncToken' => 1,
324*a1a3b679SAndreas Boehler            "added"     => [],
325*a1a3b679SAndreas Boehler            'modified'  => [],
326*a1a3b679SAndreas Boehler            'deleted'   => [],
327*a1a3b679SAndreas Boehler        ], $result);
328*a1a3b679SAndreas Boehler
329*a1a3b679SAndreas Boehler        $currentToken = $result['syncToken'];
330*a1a3b679SAndreas Boehler
331*a1a3b679SAndreas Boehler        $dummyCard = "BEGIN:VCARD\r\nEND:VCARD\r\n";
332*a1a3b679SAndreas Boehler
333*a1a3b679SAndreas Boehler        $backend->createCard($id, "card1.ics", $dummyCard);
334*a1a3b679SAndreas Boehler        $backend->createCard($id, "card2.ics", $dummyCard);
335*a1a3b679SAndreas Boehler        $backend->createCard($id, "card3.ics", $dummyCard);
336*a1a3b679SAndreas Boehler        $backend->updateCard($id, "card1.ics", $dummyCard);
337*a1a3b679SAndreas Boehler        $backend->deleteCard($id, "card2.ics");
338*a1a3b679SAndreas Boehler
339*a1a3b679SAndreas Boehler        $result = $backend->getChangesForAddressBook($id, $currentToken, 1);
340*a1a3b679SAndreas Boehler
341*a1a3b679SAndreas Boehler        $this->assertEquals([
342*a1a3b679SAndreas Boehler            'syncToken' => 6,
343*a1a3b679SAndreas Boehler            'modified'  => ["card1.ics"],
344*a1a3b679SAndreas Boehler            'deleted'   => ["card2.ics"],
345*a1a3b679SAndreas Boehler            "added"     => ["card3.ics"],
346*a1a3b679SAndreas Boehler        ], $result);
347*a1a3b679SAndreas Boehler
348*a1a3b679SAndreas Boehler    }
349*a1a3b679SAndreas Boehler}
350*a1a3b679SAndreas Boehler
351