/tests/Sabre/CardDAV/Backend/AbstractPDOTest.php

https://github.com/fruux/sabre-dav · PHP · 373 lines · 263 code · 91 blank · 19 comment · 5 complexity · a94d7e4c049c4a7252d7fab980cffeee MD5 · raw file

  1. <?php declare (strict_types=1);
  2. namespace Sabre\CardDAV\Backend;
  3. use Sabre\CardDAV;
  4. use Sabre\DAV\PropPatch;
  5. abstract class AbstractPDOTest extends \PHPUnit\Framework\TestCase {
  6. use \Sabre\DAV\DbTestHelperTrait;
  7. /**
  8. * @var CardDAV\Backend\PDO
  9. */
  10. protected $backend;
  11. function setUp() {
  12. $this->dropTables([
  13. 'addressbooks',
  14. 'cards',
  15. 'addressbookchanges',
  16. ]);
  17. $this->createSchema('addressbooks');
  18. $pdo = $this->getPDO();
  19. $this->backend = new PDO($pdo);
  20. $pdo->exec("INSERT INTO addressbooks (principaluri, displayname, uri, description, synctoken) VALUES ('principals/user1', 'book1', 'book1', 'addressbook 1', 1)");
  21. $pdo->exec("INSERT INTO cards (addressbookid, carddata, uri, lastmodified, etag, size) VALUES (1, 'card1', 'card1', 0, '" . md5('card1') . "', 5)");
  22. }
  23. function testGetAddressBooksForUser() {
  24. $result = $this->backend->getAddressBooksForUser('principals/user1');
  25. $expected = [
  26. [
  27. 'id' => 1,
  28. 'uri' => 'book1',
  29. 'principaluri' => 'principals/user1',
  30. '{DAV:}displayname' => 'book1',
  31. '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
  32. '{http://calendarserver.org/ns/}getctag' => 1,
  33. '{http://sabredav.org/ns}sync-token' => 1
  34. ]
  35. ];
  36. $this->assertEquals($expected, $result);
  37. }
  38. function testUpdateAddressBookInvalidProp() {
  39. $propPatch = new PropPatch([
  40. '{DAV:}displayname' => 'updated',
  41. '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'updated',
  42. '{DAV:}foo' => 'bar',
  43. ]);
  44. $this->backend->updateAddressBook(1, $propPatch);
  45. $result = $propPatch->commit();
  46. $this->assertFalse($result);
  47. $result = $this->backend->getAddressBooksForUser('principals/user1');
  48. $expected = [
  49. [
  50. 'id' => 1,
  51. 'uri' => 'book1',
  52. 'principaluri' => 'principals/user1',
  53. '{DAV:}displayname' => 'book1',
  54. '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
  55. '{http://calendarserver.org/ns/}getctag' => 1,
  56. '{http://sabredav.org/ns}sync-token' => 1
  57. ]
  58. ];
  59. $this->assertEquals($expected, $result);
  60. }
  61. function testUpdateAddressBookNoProps() {
  62. $propPatch = new PropPatch([
  63. ]);
  64. $this->backend->updateAddressBook(1, $propPatch);
  65. $result = $propPatch->commit();
  66. $this->assertTrue($result);
  67. $result = $this->backend->getAddressBooksForUser('principals/user1');
  68. $expected = [
  69. [
  70. 'id' => 1,
  71. 'uri' => 'book1',
  72. 'principaluri' => 'principals/user1',
  73. '{DAV:}displayname' => 'book1',
  74. '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
  75. '{http://calendarserver.org/ns/}getctag' => 1,
  76. '{http://sabredav.org/ns}sync-token' => 1
  77. ]
  78. ];
  79. $this->assertEquals($expected, $result);
  80. }
  81. function testUpdateAddressBookSuccess() {
  82. $propPatch = new PropPatch([
  83. '{DAV:}displayname' => 'updated',
  84. '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'updated',
  85. ]);
  86. $this->backend->updateAddressBook(1, $propPatch);
  87. $result = $propPatch->commit();
  88. $this->assertTrue($result);
  89. $result = $this->backend->getAddressBooksForUser('principals/user1');
  90. $expected = [
  91. [
  92. 'id' => 1,
  93. 'uri' => 'book1',
  94. 'principaluri' => 'principals/user1',
  95. '{DAV:}displayname' => 'updated',
  96. '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'updated',
  97. '{http://calendarserver.org/ns/}getctag' => 2,
  98. '{http://sabredav.org/ns}sync-token' => 2
  99. ]
  100. ];
  101. $this->assertEquals($expected, $result);
  102. }
  103. function testDeleteAddressBook() {
  104. $this->backend->deleteAddressBook(1);
  105. $this->assertEquals([], $this->backend->getAddressBooksForUser('principals/user1'));
  106. }
  107. /**
  108. * @expectedException Sabre\DAV\Exception\BadRequest
  109. */
  110. function testCreateAddressBookUnsupportedProp() {
  111. $this->backend->createAddressBook('principals/user1', 'book2', [
  112. '{DAV:}foo' => 'bar',
  113. ]);
  114. }
  115. function testCreateAddressBookSuccess() {
  116. $this->backend->createAddressBook('principals/user1', 'book2', [
  117. '{DAV:}displayname' => 'book2',
  118. '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 2',
  119. ]);
  120. $expected = [
  121. [
  122. 'id' => 1,
  123. 'uri' => 'book1',
  124. 'principaluri' => 'principals/user1',
  125. '{DAV:}displayname' => 'book1',
  126. '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
  127. '{http://calendarserver.org/ns/}getctag' => 1,
  128. '{http://sabredav.org/ns}sync-token' => 1,
  129. ],
  130. [
  131. 'id' => 2,
  132. 'uri' => 'book2',
  133. 'principaluri' => 'principals/user1',
  134. '{DAV:}displayname' => 'book2',
  135. '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 2',
  136. '{http://calendarserver.org/ns/}getctag' => 1,
  137. '{http://sabredav.org/ns}sync-token' => 1,
  138. ]
  139. ];
  140. $result = $this->backend->getAddressBooksForUser('principals/user1');
  141. $this->assertEquals($expected, $result);
  142. }
  143. function testGetCards() {
  144. $result = $this->backend->getCards(1);
  145. $expected = [
  146. [
  147. 'id' => 1,
  148. 'uri' => 'card1',
  149. 'lastmodified' => 0,
  150. 'etag' => '"' . md5('card1') . '"',
  151. 'size' => 5
  152. ]
  153. ];
  154. $this->assertEquals($expected, $result);
  155. }
  156. function testGetCard() {
  157. $result = $this->backend->getCard(1, 'card1');
  158. $expected = [
  159. 'id' => 1,
  160. 'uri' => 'card1',
  161. 'carddata' => 'card1',
  162. 'lastmodified' => 0,
  163. 'etag' => '"' . md5('card1') . '"',
  164. 'size' => 5
  165. ];
  166. if (is_resource($result['carddata'])) {
  167. $result['carddata'] = stream_get_contents($result['carddata']);
  168. }
  169. $this->assertEquals($expected, $result);
  170. }
  171. /**
  172. * @depends testGetCard
  173. */
  174. function testCreateCard() {
  175. $result = $this->backend->createCard(1, 'card2', 'data2');
  176. $this->assertEquals('"' . md5('data2') . '"', $result);
  177. $result = $this->backend->getCard(1, 'card2');
  178. $this->assertEquals(2, $result['id']);
  179. $this->assertEquals('card2', $result['uri']);
  180. if (is_resource($result['carddata'])) {
  181. $result['carddata'] = stream_get_contents($result['carddata']);
  182. }
  183. $this->assertEquals('data2', $result['carddata']);
  184. }
  185. /**
  186. * @depends testCreateCard
  187. */
  188. function testGetMultiple() {
  189. $result = $this->backend->createCard(1, 'card2', 'data2');
  190. $result = $this->backend->createCard(1, 'card3', 'data3');
  191. $check = [
  192. [
  193. 'id' => 1,
  194. 'uri' => 'card1',
  195. 'carddata' => 'card1',
  196. 'lastmodified' => 0,
  197. ],
  198. [
  199. 'id' => 2,
  200. 'uri' => 'card2',
  201. 'carddata' => 'data2',
  202. 'lastmodified' => time(),
  203. ],
  204. [
  205. 'id' => 3,
  206. 'uri' => 'card3',
  207. 'carddata' => 'data3',
  208. 'lastmodified' => time(),
  209. ],
  210. ];
  211. $result = $this->backend->getMultipleCards(1, ['card1', 'card2', 'card3']);
  212. foreach ($check as $index => $node) {
  213. foreach ($node as $k => $v) {
  214. $expected = $v;
  215. $actual = $result[$index][$k];
  216. switch ($k) {
  217. case 'lastmodified' :
  218. $this->assertInternalType('int', $actual);
  219. break;
  220. case 'carddata' :
  221. if (is_resource($actual)) {
  222. $actual = stream_get_contents($actual);
  223. }
  224. // No break intended.
  225. default :
  226. $this->assertEquals($expected, $actual);
  227. break;
  228. }
  229. }
  230. }
  231. }
  232. /**
  233. * @depends testGetCard
  234. */
  235. function testUpdateCard() {
  236. $result = $this->backend->updateCard(1, 'card1', 'newdata');
  237. $this->assertEquals('"' . md5('newdata') . '"', $result);
  238. $result = $this->backend->getCard(1, 'card1');
  239. $this->assertEquals(1, $result['id']);
  240. if (is_resource($result['carddata'])) {
  241. $result['carddata'] = stream_get_contents($result['carddata']);
  242. }
  243. $this->assertEquals('newdata', $result['carddata']);
  244. }
  245. /**
  246. * @depends testGetCard
  247. */
  248. function testDeleteCard() {
  249. $this->backend->deleteCard(1, 'card1');
  250. $result = $this->backend->getCard(1, 'card1');
  251. $this->assertFalse($result);
  252. }
  253. function testGetChanges() {
  254. $backend = $this->backend;
  255. $id = $backend->createAddressBook(
  256. 'principals/user1',
  257. 'bla',
  258. []
  259. );
  260. $result = $backend->getChangesForAddressBook($id, null, 1);
  261. $this->assertEquals([
  262. 'syncToken' => 1,
  263. "added" => [],
  264. 'modified' => [],
  265. 'deleted' => [],
  266. ], $result);
  267. $currentToken = $result['syncToken'];
  268. $dummyCard = "BEGIN:VCARD\r\nEND:VCARD\r\n";
  269. $backend->createCard($id, "card1.ics", $dummyCard);
  270. $backend->createCard($id, "card2.ics", $dummyCard);
  271. $backend->createCard($id, "card3.ics", $dummyCard);
  272. $backend->updateCard($id, "card1.ics", $dummyCard);
  273. $backend->deleteCard($id, "card2.ics");
  274. $result = $backend->getChangesForAddressBook($id, $currentToken, 1);
  275. $this->assertEquals([
  276. 'syncToken' => 6,
  277. 'modified' => ["card1.ics"],
  278. 'deleted' => ["card2.ics"],
  279. "added" => ["card3.ics"],
  280. ], $result);
  281. }
  282. }