* * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 * * This code is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License, version 3, * along with this program. If not, see * */ namespace OCA\DAV\Tests\Unit\CardDAV; use OCA\DAV\CardDAV\CardDavBackend; use Sabre\DAV\PropPatch; use Test\TestCase; /** * Class CardDavBackendTest * * @group DB * * @package OCA\DAV\Tests\Unit\CardDAV */ class CardDavBackendTest extends TestCase { /** @var CardDavBackend */ private $backend; const UNIT_TEST_USER = 'carddav-unit-test'; public function setUp() { parent::setUp(); $principal = $this->getMockBuilder('OCA\DAV\Connector\Sabre\Principal') ->disableOriginalConstructor() ->setMethods(['getPrincipalByPath']) ->getMock(); $principal->method('getPrincipalByPath') ->willReturn([ 'uri' => 'principals/best-friend' ]); $db = \OC::$server->getDatabaseConnection(); $this->backend = new CardDavBackend($db, $principal); $this->tearDown(); } public function tearDown() { parent::tearDown(); if (is_null($this->backend)) { return; } $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER); foreach ($books as $book) { $this->backend->deleteAddressBook($book['id']); } } public function testAddressBookOperations() { // create a new address book $this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []); $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER); $this->assertEquals(1, count($books)); $this->assertEquals('Example', $books[0]['{DAV:}displayname']); // update it's display name $patch = new PropPatch([ '{DAV:}displayname' => 'Unit test', '{urn:ietf:params:xml:ns:carddav}addressbook-description' => 'Addressbook used for unit testing' ]); $this->backend->updateAddressBook($books[0]['id'], $patch); $patch->commit(); $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER); $this->assertEquals(1, count($books)); $this->assertEquals('Unit test', $books[0]['{DAV:}displayname']); $this->assertEquals('Addressbook used for unit testing', $books[0]['{urn:ietf:params:xml:ns:carddav}addressbook-description']); // delete the address book $this->backend->deleteAddressBook($books[0]['id']); $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER); $this->assertEquals(0, count($books)); } public function testCardOperations() { // create a new address book $this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []); $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER); $this->assertEquals(1, count($books)); $bookId = $books[0]['id']; // create a card $uri = $this->getUniqueID('card'); $this->backend->createCard($bookId, $uri, ''); // get all the cards $cards = $this->backend->getCards($bookId); $this->assertEquals(1, count($cards)); $this->assertEquals('', $cards[0]['carddata']); // get the cards $card = $this->backend->getCard($bookId, $uri); $this->assertNotNull($card); $this->assertArrayHasKey('id', $card); $this->assertArrayHasKey('uri', $card); $this->assertArrayHasKey('lastmodified', $card); $this->assertArrayHasKey('etag', $card); $this->assertArrayHasKey('size', $card); $this->assertEquals('', $card['carddata']); // update the card $this->backend->updateCard($bookId, $uri, '***'); $card = $this->backend->getCard($bookId, $uri); $this->assertEquals('***', $card['carddata']); // delete the card $this->backend->deleteCard($bookId, $uri); $cards = $this->backend->getCards($bookId); $this->assertEquals(0, count($cards)); } public function testMultiCard() { // create a new address book $this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []); $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER); $this->assertEquals(1, count($books)); $bookId = $books[0]['id']; // create a card $uri0 = $this->getUniqueID('card'); $this->backend->createCard($bookId, $uri0, ''); $uri1 = $this->getUniqueID('card'); $this->backend->createCard($bookId, $uri1, ''); $uri2 = $this->getUniqueID('card'); $this->backend->createCard($bookId, $uri2, ''); // get all the cards $cards = $this->backend->getCards($bookId); $this->assertEquals(3, count($cards)); $this->assertEquals('', $cards[0]['carddata']); $this->assertEquals('', $cards[1]['carddata']); $this->assertEquals('', $cards[2]['carddata']); // get the cards $cards = $this->backend->getMultipleCards($bookId, [$uri1, $uri2]); $this->assertEquals(2, count($cards)); foreach($cards as $card) { $this->assertArrayHasKey('id', $card); $this->assertArrayHasKey('uri', $card); $this->assertArrayHasKey('lastmodified', $card); $this->assertArrayHasKey('etag', $card); $this->assertArrayHasKey('size', $card); $this->assertEquals('', $card['carddata']); } // delete the card $this->backend->deleteCard($bookId, $uri0); $this->backend->deleteCard($bookId, $uri1); $this->backend->deleteCard($bookId, $uri2); $cards = $this->backend->getCards($bookId); $this->assertEquals(0, count($cards)); } public function testSyncSupport() { // create a new address book $this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []); $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER); $this->assertEquals(1, count($books)); $bookId = $books[0]['id']; // fist call without synctoken $changes = $this->backend->getChangesForAddressBook($bookId, '', 1); $syncToken = $changes['syncToken']; // add a change $uri0 = $this->getUniqueID('card'); $this->backend->createCard($bookId, $uri0, ''); // look for changes $changes = $this->backend->getChangesForAddressBook($bookId, $syncToken, 1); $this->assertEquals($uri0, $changes['added'][0]); } public function testSharing() { $this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []); $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER); $this->assertEquals(1, count($books)); $this->backend->updateShares('Example', [['href' => 'principal:principals/best-friend']], []); $shares = $this->backend->getShares('Example'); $this->assertEquals(1, count($shares)); $books = $this->backend->getAddressBooksForUser('principals/best-friend'); $this->assertEquals(1, count($books)); $this->backend->updateShares('Example', [], [['href' => 'principal:principals/best-friend']]); $shares = $this->backend->getShares('Example'); $this->assertEquals(0, count($shares)); $books = $this->backend->getAddressBooksForUser('principals/best-friend'); $this->assertEquals(0, count($books)); } }