AddressBookImplTest.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <?php
  2. /**
  3. * @author Björn Schießle <bjoern@schiessle.org>
  4. * @author Joas Schilling <nickvergessen@owncloud.com>
  5. * @author Thomas Müller <thomas.mueller@tmit.eu>
  6. *
  7. * @copyright Copyright (c) 2016, ownCloud, Inc.
  8. * @license AGPL-3.0
  9. *
  10. * This code is free software: you can redistribute it and/or modify
  11. * it under the terms of the GNU Affero General Public License, version 3,
  12. * as published by the Free Software Foundation.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU Affero General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Affero General Public License, version 3,
  20. * along with this program. If not, see <http://www.gnu.org/licenses/>
  21. *
  22. */
  23. namespace OCA\DAV\Tests\unit\CardDAV;
  24. use OCA\DAV\CardDAV\AddressBook;
  25. use OCA\DAV\CardDAV\AddressBookImpl;
  26. use OCA\DAV\CardDAV\CardDavBackend;
  27. use Sabre\VObject\Component\VCard;
  28. use Sabre\VObject\Property\Text;
  29. use Test\TestCase;
  30. class AddressBookImplTest extends TestCase {
  31. /** @var AddressBookImpl */
  32. private $addressBookImpl;
  33. /** @var array */
  34. private $addressBookInfo;
  35. /** @var AddressBook | \PHPUnit_Framework_MockObject_MockObject */
  36. private $addressBook;
  37. /** @var \OCP\IURLGenerator | \PHPUnit_Framework_MockObject_MockObject */
  38. private $urlGenerator;
  39. /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject */
  40. private $backend;
  41. /** @var VCard | \PHPUnit_Framework_MockObject_MockObject */
  42. private $vCard;
  43. public function setUp() {
  44. parent::setUp();
  45. $this->addressBookInfo = [
  46. 'id' => 42,
  47. '{DAV:}displayname' => 'display name'
  48. ];
  49. $this->addressBook = $this->getMockBuilder('OCA\DAV\CardDAV\AddressBook')
  50. ->disableOriginalConstructor()->getMock();
  51. $this->backend = $this->getMockBuilder('\OCA\DAV\CardDAV\CardDavBackend')
  52. ->disableOriginalConstructor()->getMock();
  53. $this->vCard = $this->getMock('Sabre\VObject\Component\VCard');
  54. $this->urlGenerator = $this->getMock('OCP\IURLGenerator');
  55. $this->addressBookImpl = new AddressBookImpl(
  56. $this->addressBook,
  57. $this->addressBookInfo,
  58. $this->backend,
  59. $this->urlGenerator
  60. );
  61. }
  62. public function testGetKey() {
  63. $this->assertSame($this->addressBookInfo['id'],
  64. $this->addressBookImpl->getKey());
  65. }
  66. public function testGetDisplayName() {
  67. $this->assertSame($this->addressBookInfo['{DAV:}displayname'],
  68. $this->addressBookImpl->getDisplayName());
  69. }
  70. public function testSearch() {
  71. /** @var \PHPUnit_Framework_MockObject_MockObject | AddressBookImpl $addressBookImpl */
  72. $addressBookImpl = $this->getMockBuilder('OCA\DAV\CardDAV\AddressBookImpl')
  73. ->setConstructorArgs(
  74. [
  75. $this->addressBook,
  76. $this->addressBookInfo,
  77. $this->backend,
  78. $this->urlGenerator,
  79. ]
  80. )
  81. ->setMethods(['vCard2Array', 'readCard'])
  82. ->getMock();
  83. $pattern = 'pattern';
  84. $searchProperties = 'properties';
  85. $this->backend->expects($this->once())->method('search')
  86. ->with($this->addressBookInfo['id'], $pattern, $searchProperties)
  87. ->willReturn(
  88. [
  89. ['uri' => 'foo.vcf', 'carddata' => 'cardData1'],
  90. ['uri' => 'bar.vcf', 'carddata' => 'cardData2']
  91. ]
  92. );
  93. $addressBookImpl->expects($this->exactly(2))->method('readCard')
  94. ->willReturn($this->vCard);
  95. $addressBookImpl->expects($this->exactly(2))->method('vCard2Array')
  96. ->withConsecutive(
  97. ['foo.vcf', $this->vCard],
  98. ['bar.vcf', $this->vCard]
  99. )->willReturn('vCard');
  100. $result = $addressBookImpl->search($pattern, $searchProperties, []);
  101. $this->assertTrue((is_array($result)));
  102. $this->assertSame(2, count($result));
  103. }
  104. /**
  105. * @dataProvider dataTestCreate
  106. *
  107. * @param array $properties
  108. */
  109. public function testCreate($properties) {
  110. $uid = 'uid';
  111. /** @var \PHPUnit_Framework_MockObject_MockObject | AddressBookImpl $addressBookImpl */
  112. $addressBookImpl = $this->getMockBuilder('OCA\DAV\CardDAV\AddressBookImpl')
  113. ->setConstructorArgs(
  114. [
  115. $this->addressBook,
  116. $this->addressBookInfo,
  117. $this->backend,
  118. $this->urlGenerator,
  119. ]
  120. )
  121. ->setMethods(['vCard2Array', 'createUid', 'createEmptyVCard'])
  122. ->getMock();
  123. $addressBookImpl->expects($this->once())->method('createUid')
  124. ->willReturn($uid);
  125. $addressBookImpl->expects($this->once())->method('createEmptyVCard')
  126. ->with($uid)->willReturn($this->vCard);
  127. $this->vCard->expects($this->exactly(count($properties)))
  128. ->method('createProperty');
  129. $this->backend->expects($this->once())->method('createCard');
  130. $this->backend->expects($this->never())->method('updateCard');
  131. $this->backend->expects($this->never())->method('getCard');
  132. $addressBookImpl->expects($this->once())->method('vCard2Array')
  133. ->with('uid.vcf', $this->vCard)->willReturn(true);
  134. $this->assertTrue($addressBookImpl->createOrUpdate($properties));
  135. }
  136. public function dataTestCreate() {
  137. return [
  138. [[]],
  139. [['FN' => 'John Doe']]
  140. ];
  141. }
  142. public function testUpdate() {
  143. $uid = 'uid';
  144. $uri = 'bla.vcf';
  145. $properties = ['URI' => $uri, 'UID' => $uid, 'FN' => 'John Doe'];
  146. /** @var \PHPUnit_Framework_MockObject_MockObject | AddressBookImpl $addressBookImpl */
  147. $addressBookImpl = $this->getMockBuilder('OCA\DAV\CardDAV\AddressBookImpl')
  148. ->setConstructorArgs(
  149. [
  150. $this->addressBook,
  151. $this->addressBookInfo,
  152. $this->backend,
  153. $this->urlGenerator,
  154. ]
  155. )
  156. ->setMethods(['vCard2Array', 'createUid', 'createEmptyVCard', 'readCard'])
  157. ->getMock();
  158. $addressBookImpl->expects($this->never())->method('createUid');
  159. $addressBookImpl->expects($this->never())->method('createEmptyVCard');
  160. $this->backend->expects($this->once())->method('getCard')
  161. ->with($this->addressBookInfo['id'], $uri)
  162. ->willReturn(['carddata' => 'data']);
  163. $addressBookImpl->expects($this->once())->method('readCard')
  164. ->with('data')->willReturn($this->vCard);
  165. $this->vCard->expects($this->exactly(count($properties)))
  166. ->method('createProperty');
  167. $this->backend->expects($this->never())->method('createCard');
  168. $this->backend->expects($this->once())->method('updateCard');
  169. $addressBookImpl->expects($this->once())->method('vCard2Array')
  170. ->with($uri, $this->vCard)->willReturn(true);
  171. $this->assertTrue($addressBookImpl->createOrUpdate($properties));
  172. }
  173. /**
  174. * @dataProvider dataTestGetPermissions
  175. *
  176. * @param array $permissions
  177. * @param int $expected
  178. */
  179. public function testGetPermissions($permissions, $expected) {
  180. $this->addressBook->expects($this->once())->method('getACL')
  181. ->willReturn($permissions);
  182. $this->assertSame($expected,
  183. $this->addressBookImpl->getPermissions()
  184. );
  185. }
  186. public function dataTestGetPermissions() {
  187. return [
  188. [[], 0],
  189. [[['privilege' => '{DAV:}read']], 1],
  190. [[['privilege' => '{DAV:}write']], 6],
  191. [[['privilege' => '{DAV:}all']], 31],
  192. [[['privilege' => '{DAV:}read'],['privilege' => '{DAV:}write']], 7],
  193. [[['privilege' => '{DAV:}read'],['privilege' => '{DAV:}all']], 31],
  194. [[['privilege' => '{DAV:}all'],['privilege' => '{DAV:}write']], 31],
  195. [[['privilege' => '{DAV:}read'],['privilege' => '{DAV:}write'],['privilege' => '{DAV:}all']], 31],
  196. [[['privilege' => '{DAV:}all'],['privilege' => '{DAV:}read'],['privilege' => '{DAV:}write']], 31],
  197. ];
  198. }
  199. public function testDelete() {
  200. $cardId = 1;
  201. $cardUri = 'cardUri';
  202. $this->backend->expects($this->once())->method('getCardUri')
  203. ->with($cardId)->willReturn($cardUri);
  204. $this->backend->expects($this->once())->method('deleteCard')
  205. ->with($this->addressBookInfo['id'], $cardUri)
  206. ->willReturn(true);
  207. $this->assertTrue($this->addressBookImpl->delete($cardId));
  208. }
  209. public function testReadCard() {
  210. $vCard = new VCard();
  211. $vCard->add(new Text($vCard, 'UID', 'uid'));
  212. $vCardSerialized = $vCard->serialize();
  213. $result = $this->invokePrivate($this->addressBookImpl, 'readCard', [$vCardSerialized]);
  214. $resultSerialized = $result->serialize();
  215. $this->assertSame($vCardSerialized, $resultSerialized);
  216. }
  217. public function testCreateUid() {
  218. /** @var \PHPUnit_Framework_MockObject_MockObject | AddressBookImpl $addressBookImpl */
  219. $addressBookImpl = $this->getMockBuilder('OCA\DAV\CardDAV\AddressBookImpl')
  220. ->setConstructorArgs(
  221. [
  222. $this->addressBook,
  223. $this->addressBookInfo,
  224. $this->backend,
  225. $this->urlGenerator,
  226. ]
  227. )
  228. ->setMethods(['getUid'])
  229. ->getMock();
  230. $addressBookImpl->expects($this->at(0))->method('getUid')->willReturn('uid0');
  231. $addressBookImpl->expects($this->at(1))->method('getUid')->willReturn('uid1');
  232. // simulate that 'uid0' already exists, so the second uid will be returned
  233. $this->backend->expects($this->exactly(2))->method('getContact')
  234. ->willReturnCallback(
  235. function($id, $uid) {
  236. return ($uid === 'uid0.vcf');
  237. }
  238. );
  239. $this->assertSame('uid1',
  240. $this->invokePrivate($addressBookImpl, 'createUid', [])
  241. );
  242. }
  243. public function testCreateEmptyVCard() {
  244. $uid = 'uid';
  245. $expectedVCard = new VCard();
  246. $expectedVCard->add(new Text($expectedVCard, 'UID', $uid));
  247. $expectedVCardSerialized = $expectedVCard->serialize();
  248. $result = $this->invokePrivate($this->addressBookImpl, 'createEmptyVCard', [$uid]);
  249. $resultSerialized = $result->serialize();
  250. $this->assertSame($expectedVCardSerialized, $resultSerialized);
  251. }
  252. }