dropTables([ 'addressbooks', 'cards', 'addressbookchanges', ]); $this->createSchema('addressbooks'); $pdo = $this->getPDO(); $this->backend = new PDO($pdo); $pdo->exec("INSERT INTO addressbooks (principaluri, displayname, uri, description, synctoken) VALUES ('principals/user1', 'book1', 'book1', 'addressbook 1', 1)"); $pdo->exec("INSERT INTO cards (addressbookid, carddata, uri, lastmodified, etag, size) VALUES (1, 'card1', 'card1', 0, '".md5('card1')."', 5)"); } public function testGetAddressBooksForUser() { $result = $this->backend->getAddressBooksForUser('principals/user1'); $expected = [ [ 'id' => 1, 'uri' => 'book1', 'principaluri' => 'principals/user1', '{DAV:}displayname' => 'book1', '{'.CardDAV\Plugin::NS_CARDDAV.'}addressbook-description' => 'addressbook 1', '{http://calendarserver.org/ns/}getctag' => 1, '{http://sabredav.org/ns}sync-token' => 1, ], ]; $this->assertEquals($expected, $result); } public function testUpdateAddressBookInvalidProp() { $propPatch = new PropPatch([ '{DAV:}displayname' => 'updated', '{'.CardDAV\Plugin::NS_CARDDAV.'}addressbook-description' => 'updated', '{DAV:}foo' => 'bar', ]); $this->backend->updateAddressBook(1, $propPatch); $result = $propPatch->commit(); $this->assertFalse($result); $result = $this->backend->getAddressBooksForUser('principals/user1'); $expected = [ [ 'id' => 1, 'uri' => 'book1', 'principaluri' => 'principals/user1', '{DAV:}displayname' => 'book1', '{'.CardDAV\Plugin::NS_CARDDAV.'}addressbook-description' => 'addressbook 1', '{http://calendarserver.org/ns/}getctag' => 1, '{http://sabredav.org/ns}sync-token' => 1, ], ]; $this->assertEquals($expected, $result); } public function testUpdateAddressBookNoProps() { $propPatch = new PropPatch([ ]); $this->backend->updateAddressBook(1, $propPatch); $result = $propPatch->commit(); $this->assertTrue($result); $result = $this->backend->getAddressBooksForUser('principals/user1'); $expected = [ [ 'id' => 1, 'uri' => 'book1', 'principaluri' => 'principals/user1', '{DAV:}displayname' => 'book1', '{'.CardDAV\Plugin::NS_CARDDAV.'}addressbook-description' => 'addressbook 1', '{http://calendarserver.org/ns/}getctag' => 1, '{http://sabredav.org/ns}sync-token' => 1, ], ]; $this->assertEquals($expected, $result); } public function testUpdateAddressBookSuccess() { $propPatch = new PropPatch([ '{DAV:}displayname' => 'updated', '{'.CardDAV\Plugin::NS_CARDDAV.'}addressbook-description' => 'updated', ]); $this->backend->updateAddressBook(1, $propPatch); $result = $propPatch->commit(); $this->assertTrue($result); $result = $this->backend->getAddressBooksForUser('principals/user1'); $expected = [ [ 'id' => 1, 'uri' => 'book1', 'principaluri' => 'principals/user1', '{DAV:}displayname' => 'updated', '{'.CardDAV\Plugin::NS_CARDDAV.'}addressbook-description' => 'updated', '{http://calendarserver.org/ns/}getctag' => 2, '{http://sabredav.org/ns}sync-token' => 2, ], ]; $this->assertEquals($expected, $result); } public function testDeleteAddressBook() { $this->backend->deleteAddressBook(1); $this->assertEquals([], $this->backend->getAddressBooksForUser('principals/user1')); } public function testCreateAddressBookUnsupportedProp() { $this->expectException('Sabre\DAV\Exception\BadRequest'); $this->backend->createAddressBook('principals/user1', 'book2', [ '{DAV:}foo' => 'bar', ]); } public function testCreateAddressBookSuccess() { $this->backend->createAddressBook('principals/user1', 'book2', [ '{DAV:}displayname' => 'book2', '{'.CardDAV\Plugin::NS_CARDDAV.'}addressbook-description' => 'addressbook 2', ]); $expected = [ [ 'id' => 1, 'uri' => 'book1', 'principaluri' => 'principals/user1', '{DAV:}displayname' => 'book1', '{'.CardDAV\Plugin::NS_CARDDAV.'}addressbook-description' => 'addressbook 1', '{http://calendarserver.org/ns/}getctag' => 1, '{http://sabredav.org/ns}sync-token' => 1, ], [ 'id' => 2, 'uri' => 'book2', 'principaluri' => 'principals/user1', '{DAV:}displayname' => 'book2', '{'.CardDAV\Plugin::NS_CARDDAV.'}addressbook-description' => 'addressbook 2', '{http://calendarserver.org/ns/}getctag' => 1, '{http://sabredav.org/ns}sync-token' => 1, ], ]; $result = $this->backend->getAddressBooksForUser('principals/user1'); $this->assertEquals($expected, $result); } public function testGetCards() { $result = $this->backend->getCards(1); $expected = [ [ 'id' => 1, 'uri' => 'card1', 'lastmodified' => 0, 'etag' => '"'.md5('card1').'"', 'size' => 5, ], ]; $this->assertEquals($expected, $result); } public function testGetCard() { $result = $this->backend->getCard(1, 'card1'); $expected = [ 'id' => 1, 'uri' => 'card1', 'carddata' => 'card1', 'lastmodified' => 0, 'etag' => '"'.md5('card1').'"', 'size' => 5, ]; if (is_resource($result['carddata'])) { $result['carddata'] = stream_get_contents($result['carddata']); } $this->assertEquals($expected, $result); } /** * @depends testGetCard */ public function testCreateCard() { $result = $this->backend->createCard(1, 'card2', 'data2'); $this->assertEquals('"'.md5('data2').'"', $result); $result = $this->backend->getCard(1, 'card2'); $this->assertEquals(2, $result['id']); $this->assertEquals('card2', $result['uri']); if (is_resource($result['carddata'])) { $result['carddata'] = stream_get_contents($result['carddata']); } $this->assertEquals('data2', $result['carddata']); } /** * @depends testCreateCard */ public function testGetMultiple() { $result = $this->backend->createCard(1, 'card2', 'data2'); $result = $this->backend->createCard(1, 'card3', 'data3'); $check = [ [ 'id' => 1, 'uri' => 'card1', 'carddata' => 'card1', 'lastmodified' => 0, ], [ 'id' => 2, 'uri' => 'card2', 'carddata' => 'data2', 'lastmodified' => time(), ], [ 'id' => 3, 'uri' => 'card3', 'carddata' => 'data3', 'lastmodified' => time(), ], ]; $result = $this->backend->getMultipleCards(1, ['card1', 'card2', 'card3']); foreach ($check as $index => $node) { foreach ($node as $k => $v) { $expected = $v; $actual = $result[$index][$k]; switch ($k) { case 'lastmodified': $this->assertIsInt($actual); break; case 'carddata': if (is_resource($actual)) { $actual = stream_get_contents($actual); } // no break intended. default: $this->assertEquals($expected, $actual); break; } } } } /** * @depends testGetCard */ public function testUpdateCard() { $result = $this->backend->updateCard(1, 'card1', 'newdata'); $this->assertEquals('"'.md5('newdata').'"', $result); $result = $this->backend->getCard(1, 'card1'); $this->assertEquals(1, $result['id']); if (is_resource($result['carddata'])) { $result['carddata'] = stream_get_contents($result['carddata']); } $this->assertEquals('newdata', $result['carddata']); } /** * @depends testGetCard */ public function testDeleteCard() { $this->backend->deleteCard(1, 'card1'); $result = $this->backend->getCard(1, 'card1'); $this->assertFalse($result); } public function testGetChanges() { $backend = $this->backend; $id = $backend->createAddressBook( 'principals/user1', 'bla', [] ); $result = $backend->getChangesForAddressBook($id, null, 1); $this->assertEquals([ 'syncToken' => 1, 'added' => [], 'modified' => [], 'deleted' => [], ], $result); $currentToken = $result['syncToken']; $dummyCard = "BEGIN:VCARD\r\nEND:VCARD\r\n"; $backend->createCard($id, 'card1.ics', $dummyCard); $backend->createCard($id, 'card2.ics', $dummyCard); $backend->createCard($id, 'card3.ics', $dummyCard); $backend->updateCard($id, 'card1.ics', $dummyCard); $backend->deleteCard($id, 'card2.ics'); $result = $backend->getChangesForAddressBook($id, $currentToken, 1); $this->assertEquals([ 'syncToken' => 6, 'modified' => ['card1.ics'], 'deleted' => ['card2.ics'], 'added' => ['card3.ics'], ], $result); } }