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