From b2976eb72c0700fa94dbcbebf9a2afa8c5c06a86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Thu, 21 Jan 2016 14:42:05 +0100 Subject: [PATCH] Unit testing migration logic --- apps/dav/appinfo/application.php | 3 +- apps/dav/lib/migration/addressbookadapter.php | 87 +++++++++++++++++++ .../dav/lib/migration/migrateaddressbooks.php | 60 ++++--------- .../unit/migration/migrateaddressbooktest.php | 70 +++++++++++++++ 4 files changed, 176 insertions(+), 44 deletions(-) create mode 100644 apps/dav/lib/migration/addressbookadapter.php create mode 100644 apps/dav/tests/unit/migration/migrateaddressbooktest.php diff --git a/apps/dav/appinfo/application.php b/apps/dav/appinfo/application.php index b771bf2b3a..07905db736 100644 --- a/apps/dav/appinfo/application.php +++ b/apps/dav/appinfo/application.php @@ -24,6 +24,7 @@ use OCA\DAV\CardDAV\ContactsManager; use OCA\DAV\CardDAV\SyncJob; use OCA\DAV\CardDAV\SyncService; use OCA\DAV\HookManager; +use OCA\Dav\Migration\AddressBookAdapter; use OCA\Dav\Migration\MigrateAddressbooks; use \OCP\AppFramework\App; use OCP\AppFramework\IAppContainer; @@ -79,7 +80,7 @@ class Application extends App { /** @var IAppContainer $c */ $db = $c->getServer()->getDatabaseConnection(); return new MigrateAddressbooks( - $db, + new AddressBookAdapter($db), $c->query('CardDavBackend') ); }); diff --git a/apps/dav/lib/migration/addressbookadapter.php b/apps/dav/lib/migration/addressbookadapter.php new file mode 100644 index 0000000000..025aa07a55 --- /dev/null +++ b/apps/dav/lib/migration/addressbookadapter.php @@ -0,0 +1,87 @@ +dbConnection = $dbConnection; + $this->sourceBookTable = $sourceBookTable; + $this->sourceCardsTable = $sourceCardsTable; + } + + /** + * @param string $user + * @param \Closure $callBack + */ + public function foreachBook($user, \Closure $callBack) { + // get all addressbooks of that user + $query = $this->dbConnection->getQueryBuilder(); + $stmt = $query->select()->from($this->sourceBookTable) + ->where($query->expr()->eq('user', $query->createNamedParameter($user))) + ->execute(); + + while($row = $stmt->fetch()) { + $callBack($row); + } + } + + public function setup() { + if (!$this->dbConnection->tableExists($this->sourceBookTable)) { + throw new \DomainException('Contacts tables are missing. Nothing to do.'); + } + } + + /** + * @param int $addressBookId + * @param \Closure $callBack + */ + public function foreachCard($addressBookId, \Closure $callBack) { + $query = $this->dbConnection->getQueryBuilder(); + $stmt = $query->select()->from($this->sourceCardsTable) + ->where($query->expr()->eq('addressbookid', $query->createNamedParameter($addressBookId))) + ->execute(); + + while($row = $stmt->fetch()) { + $callBack($row); + } + } + + /** + * @param int $addressBookId + * @return array + */ + public function getShares($addressBookId) { + $query = $this->dbConnection->getQueryBuilder(); + $shares = $query->select()->from('share') + ->where($query->expr()->eq('item_source', $query->createNamedParameter($addressBookId))) + ->andWhere($query->expr()->eq('item_type', $query->expr()->literal('addressbook'))) + ->andWhere($query->expr()->in('share_type', [ $query->expr()->literal(0), $query->expr()->literal(1)])) + ->execute() + ->fetchAll(); + + return $shares; + } +} diff --git a/apps/dav/lib/migration/migrateaddressbooks.php b/apps/dav/lib/migration/migrateaddressbooks.php index 3bc255571e..0dad649569 100644 --- a/apps/dav/lib/migration/migrateaddressbooks.php +++ b/apps/dav/lib/migration/migrateaddressbooks.php @@ -4,9 +4,6 @@ namespace OCA\Dav\Migration; use OCA\DAV\CardDAV\AddressBook; use OCA\DAV\CardDAV\CardDavBackend; -use OCP\IConfig; -use OCP\IDBConnection; -use OCP\ILogger; use Sabre\CardDAV\Plugin; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; @@ -15,47 +12,33 @@ use Symfony\Component\Console\Output\OutputInterface; class MigrateAddressbooks { - /** @var \OCP\IDBConnection */ - protected $dbConnection; + /** @var AddressBookAdapter */ + protected $adapter; /** @var CardDavBackend */ private $backend; /** - * @param IDBConnection $dbConnection - * @param IConfig $config - * @param ILogger $logger + * @param AddressBookAdapter $adapter + * @param CardDavBackend $backend */ - function __construct(IDBConnection $dbConnection, + function __construct(AddressBookAdapter $adapter, CardDavBackend $backend ) { - $this->dbConnection = $dbConnection; + $this->adapter = $adapter; $this->backend = $backend; } - private function verifyPreconditions() { - if (!$this->dbConnection->tableExists('contacts_addressbooks')) { - throw new \DomainException('Contacts tables are missing. Nothing to do.'); - } - } - /** * @param string $user */ public function migrateForUser($user) { - // get all addressbooks of that user - $query = $this->dbConnection->getQueryBuilder(); - $books = $query->select()->from('contacts_addressbooks') - ->where($query->expr()->eq('user', $query->createNamedParameter($user))) - ->execute() - ->fetchAll(); - - $principal = "principals/users/$user"; - foreach($books as $book) { + $this->adapter->foreachBook($user, function($book) use ($user) { + $principal = "principals/users/$user"; $knownBooks = $this->backend->getAddressBooksByUri($principal, $book['uri']); if (!is_null($knownBooks)) { - continue; + return; } $newId = $this->backend->createAddressBook($principal, $book['uri'], [ @@ -65,11 +48,11 @@ class MigrateAddressbooks { $this->migrateBook($book['id'], $newId); $this->migrateShares($book['id'], $newId); - } + }); } public function setup() { - $this->verifyPreconditions(); + $this->adapter->setup(); } /** @@ -77,15 +60,9 @@ class MigrateAddressbooks { * @param int $newAddressBookId */ private function migrateBook($addressBookId, $newAddressBookId) { - $query = $this->dbConnection->getQueryBuilder(); - $cards = $query->select()->from('contacts_cards') - ->where($query->expr()->eq('addressbookid', $query->createNamedParameter($addressBookId))) - ->execute() - ->fetchAll(); - - foreach ($cards as $card) { + $this->adapter->foreachCard($addressBookId, function($card) use ($newAddressBookId) { $this->backend->createCard($newAddressBookId, $card['uri'], $card['carddata']); - } + }); } /** @@ -93,13 +70,10 @@ class MigrateAddressbooks { * @param int $newAddressBookId */ private function migrateShares($addressBookId, $newAddressBookId) { - $query = $this->dbConnection->getQueryBuilder(); - $shares = $query->select()->from('share') - ->where($query->expr()->eq('item_source', $query->createNamedParameter($addressBookId))) - ->andWhere($query->expr()->eq('item_type', $query->expr()->literal('addressbook'))) - ->andWhere($query->expr()->in('share_type', [ $query->expr()->literal(0), $query->expr()->literal(1)])) - ->execute() - ->fetchAll(); + $shares =$this->adapter->getShares($addressBookId); + if (empty($shares)) { + return; + } $add = array_map(function($s) { $prefix = 'principal:principals/users/'; diff --git a/apps/dav/tests/unit/migration/migrateaddressbooktest.php b/apps/dav/tests/unit/migration/migrateaddressbooktest.php new file mode 100644 index 0000000000..1b27536ce3 --- /dev/null +++ b/apps/dav/tests/unit/migration/migrateaddressbooktest.php @@ -0,0 +1,70 @@ + + * + * @copyright Copyright (c) 2016, 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\Migration; + +use OCA\DAV\CardDAV\CardDavBackend; +use OCA\Dav\Migration\AddressBookAdapter; +use Test\TestCase; + +class MigrateAddressbookTest extends TestCase { + + public function testMigration() { + /** @var AddressBookAdapter | \PHPUnit_Framework_MockObject_MockObject $adapter */ + $adapter = $this->mockAdapter(); + + /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $cardDav */ + $cardDav = $this->getMockBuilder('\OCA\Dav\CardDAV\CardDAVBackend')->disableOriginalConstructor()->getMock(); + $cardDav->method('createAddressBook')->willReturn(666); + $cardDav->expects($this->once())->method('createAddressBook')->with('principals/users/test01', 'test_contacts'); + $cardDav->expects($this->once())->method('createCard')->with(666, '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.vcf', 'BEGIN:VCARD'); + + $m = new \OCA\Dav\Migration\MigrateAddressbooks($adapter, $cardDav); + $m->migrateForUser('test01'); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function mockAdapter($shares = []) { + $adapter = $this->getMockBuilder('\OCA\Dav\Migration\AddressBookAdapter')->disableOriginalConstructor()->getMock(); + $adapter->method('foreachBook')->willReturnCallback(function ($user, \Closure $callBack) { + $callBack([ + 'id' => 0, + 'userid' => $user, + 'displayname' => 'Test Contacts', + 'uri' => 'test_contacts', + 'description' => 'Contacts to test with', + 'ctag' => 1234567890, + 'active' => 1 + ]); + }); + $adapter->method('foreachCard')->willReturnCallback(function ($addressBookId, \Closure $callBack) { + $callBack([ + 'userid' => $addressBookId, + 'uri' => '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.vcf', + 'carddata' => 'BEGIN:VCARD' + ]); + }); + $adapter->method('getShares')->willReturn($shares); + return $adapter; + } + +}