BackendTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * @copyright Copyright (c) 2019, Thomas Citharel
  5. * @copyright Copyright (c) 2019, Georg Ehrke
  6. *
  7. * @author Thomas Citharel <tcit@tcit.fr>
  8. * @author Georg Ehrke <oc.list@georgehrke.com>
  9. *
  10. * @license AGPL-3.0
  11. *
  12. * This code is free software: you can redistribute it and/or modify
  13. * it under the terms of the GNU Affero General Public License, version 3,
  14. * as published by the Free Software Foundation.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU Affero General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU Affero General Public License, version 3,
  22. * along with this program. If not, see <http://www.gnu.org/licenses/>
  23. *
  24. */
  25. namespace OCA\DAV\Tests\unit\CalDAV\Reminder;
  26. use OCP\DB\QueryBuilder\IQueryBuilder;
  27. use OCP\AppFramework\Utility\ITimeFactory;
  28. use OCA\DAV\CalDAV\Reminder\Backend as ReminderBackend;
  29. use Test\TestCase;
  30. class BackendTest extends TestCase {
  31. /**
  32. * Reminder Backend
  33. *
  34. * @var ReminderBackend|\PHPUnit\Framework\MockObject\MockObject
  35. */
  36. private $reminderBackend;
  37. /** @var ITimeFactory|\PHPUnit\Framework\MockObject\MockObject */
  38. private $timeFactory;
  39. public function setUp() {
  40. parent::setUp();
  41. $query = self::$realDatabase->getQueryBuilder();
  42. $query->delete('calendar_reminders')->execute();
  43. $query->delete('calendarobjects')->execute();
  44. $query->delete('calendars')->execute();
  45. $this->timeFactory = $this->createMock(ITimeFactory::class);
  46. $this->reminderBackend = new ReminderBackend(self::$realDatabase, $this->timeFactory);
  47. $this->createRemindersTestSet();
  48. }
  49. protected function tearDown() {
  50. $query = self::$realDatabase->getQueryBuilder();
  51. $query->delete('calendar_reminders')->execute();
  52. $query->delete('calendarobjects')->execute();
  53. $query->delete('calendars')->execute();
  54. }
  55. public function testCleanRemindersForEvent(): void {
  56. $query = self::$realDatabase->getQueryBuilder();
  57. $rows = $query->select('*')
  58. ->from('calendar_reminders')
  59. ->execute()
  60. ->fetchAll();
  61. $this->assertCount(4, $rows);
  62. $this->reminderBackend->cleanRemindersForEvent(1);
  63. $query = self::$realDatabase->getQueryBuilder();
  64. $rows = $query->select('*')
  65. ->from('calendar_reminders')
  66. ->execute()
  67. ->fetchAll();
  68. $this->assertCount(2, $rows);
  69. }
  70. public function testCleanRemindersForCalendar(): void {
  71. $query = self::$realDatabase->getQueryBuilder();
  72. $rows = $query->select('*')
  73. ->from('calendar_reminders')
  74. ->execute()
  75. ->fetchAll();
  76. $this->assertCount(4, $rows);
  77. $this->reminderBackend->cleanRemindersForCalendar(1);
  78. $query = self::$realDatabase->getQueryBuilder();
  79. $rows = $query->select('*')
  80. ->from('calendar_reminders')
  81. ->execute()
  82. ->fetchAll();
  83. $this->assertCount(1, $rows);
  84. }
  85. public function testRemoveReminder(): void {
  86. $query = self::$realDatabase->getQueryBuilder();
  87. $rows = $query->select('*')
  88. ->from('calendar_reminders')
  89. ->execute()
  90. ->fetchAll();
  91. $this->assertCount(4, $rows);
  92. $this->reminderBackend->removeReminder((int) $rows[3]['id']);
  93. $query = self::$realDatabase->getQueryBuilder();
  94. $rows = $query->select('*')
  95. ->from('calendar_reminders')
  96. ->execute()
  97. ->fetchAll();
  98. $this->assertCount(3, $rows);
  99. }
  100. public function testGetRemindersToProcess(): void {
  101. $this->timeFactory->expects($this->exactly(1))
  102. ->method('getTime')
  103. ->with()
  104. ->willReturn(123457);
  105. $rows = $this->reminderBackend->getRemindersToProcess();
  106. $this->assertCount(2, $rows);
  107. unset($rows[0]['id']);
  108. unset($rows[1]['id']);
  109. $this->assertEquals($rows[0], [
  110. 'calendar_id' => 1,
  111. 'object_id' => 1,
  112. 'uid' => 'asd',
  113. 'is_recurring' => false,
  114. 'recurrence_id' => 123458,
  115. 'is_recurrence_exception' => false,
  116. 'event_hash' => 'asd123',
  117. 'alarm_hash' => 'asd567',
  118. 'type' => 'EMAIL',
  119. 'is_relative' => true,
  120. 'notification_date' => 123456,
  121. 'is_repeat_based' => false,
  122. 'calendardata' => 'Calendar data 123',
  123. 'displayname' => 'Displayname 123',
  124. 'principaluri' => 'principals/users/user001',
  125. ]);
  126. $this->assertEquals($rows[1], [
  127. 'calendar_id' => 1,
  128. 'object_id' => 1,
  129. 'uid' => 'asd',
  130. 'is_recurring' => false,
  131. 'recurrence_id' => 123458,
  132. 'is_recurrence_exception' => false,
  133. 'event_hash' => 'asd123',
  134. 'alarm_hash' => 'asd567',
  135. 'type' => 'AUDIO',
  136. 'is_relative' => true,
  137. 'notification_date' => 123456,
  138. 'is_repeat_based' => false,
  139. 'calendardata' => 'Calendar data 123',
  140. 'displayname' => 'Displayname 123',
  141. 'principaluri' => 'principals/users/user001',
  142. ]);
  143. }
  144. public function testGetAllScheduledRemindersForEvent(): void {
  145. $rows = $this->reminderBackend->getAllScheduledRemindersForEvent(1);
  146. $this->assertCount(2, $rows);
  147. unset($rows[0]['id']);
  148. unset($rows[1]['id']);
  149. $this->assertEquals($rows[0], [
  150. 'calendar_id' => 1,
  151. 'object_id' => 1,
  152. 'uid' => 'asd',
  153. 'is_recurring' => false,
  154. 'recurrence_id' => 123458,
  155. 'is_recurrence_exception' => false,
  156. 'event_hash' => 'asd123',
  157. 'alarm_hash' => 'asd567',
  158. 'type' => 'EMAIL',
  159. 'is_relative' => true,
  160. 'notification_date' => 123456,
  161. 'is_repeat_based' => false,
  162. ]);
  163. $this->assertEquals($rows[1], [
  164. 'calendar_id' => 1,
  165. 'object_id' => 1,
  166. 'uid' => 'asd',
  167. 'is_recurring' => false,
  168. 'recurrence_id' => 123458,
  169. 'is_recurrence_exception' => false,
  170. 'event_hash' => 'asd123',
  171. 'alarm_hash' => 'asd567',
  172. 'type' => 'AUDIO',
  173. 'is_relative' => true,
  174. 'notification_date' => 123456,
  175. 'is_repeat_based' => false,
  176. ]);
  177. }
  178. public function testInsertReminder(): void {
  179. $query = self::$realDatabase->getQueryBuilder();
  180. $rows = $query->select('*')
  181. ->from('calendar_reminders')
  182. ->execute()
  183. ->fetchAll();
  184. $this->assertCount(4, $rows);
  185. $this->reminderBackend->insertReminder(42, 1337, 'uid99', true, 12345678,
  186. true, 'hash99', 'hash42', 'AUDIO', false, 12345670, false);
  187. $query = self::$realDatabase->getQueryBuilder();
  188. $rows = $query->select('*')
  189. ->from('calendar_reminders')
  190. ->execute()
  191. ->fetchAll();
  192. $this->assertCount(5, $rows);
  193. unset($rows[4]['id']);
  194. $this->assertEquals($rows[4], [
  195. 'calendar_id' => '42',
  196. 'object_id' => '1337',
  197. 'is_recurring' => '1',
  198. 'uid' => 'uid99',
  199. 'recurrence_id' => '12345678',
  200. 'is_recurrence_exception' => '1',
  201. 'event_hash' => 'hash99',
  202. 'alarm_hash' => 'hash42',
  203. 'type' => 'AUDIO',
  204. 'is_relative' => '0',
  205. 'notification_date' => '12345670',
  206. 'is_repeat_based' => '0',
  207. ]);
  208. }
  209. public function testUpdateReminder() {
  210. $query = self::$realDatabase->getQueryBuilder();
  211. $rows = $query->select('*')
  212. ->from('calendar_reminders')
  213. ->execute()
  214. ->fetchAll();
  215. $this->assertCount(4, $rows);
  216. $this->assertEquals($rows[3]['notification_date'], 123600);
  217. $reminderId = (int) $rows[3]['id'];
  218. $newNotificationDate = 123700;
  219. $this->reminderBackend->updateReminder($reminderId, $newNotificationDate);
  220. $query = self::$realDatabase->getQueryBuilder();
  221. $row = $query->select('notification_date')
  222. ->from('calendar_reminders')
  223. ->where($query->expr()->eq('id', $query->createNamedParameter($reminderId)))
  224. ->execute()
  225. ->fetch();
  226. $this->assertEquals((int) $row['notification_date'], 123700);
  227. }
  228. private function createRemindersTestSet(): void {
  229. $query = self::$realDatabase->getQueryBuilder();
  230. $query->insert('calendars')
  231. ->values([
  232. 'id' => $query->createNamedParameter(1),
  233. 'principaluri' => $query->createNamedParameter('principals/users/user001'),
  234. 'displayname' => $query->createNamedParameter('Displayname 123'),
  235. ])
  236. ->execute();
  237. $query = self::$realDatabase->getQueryBuilder();
  238. $query->insert('calendars')
  239. ->values([
  240. 'id' => $query->createNamedParameter(99),
  241. 'principaluri' => $query->createNamedParameter('principals/users/user002'),
  242. 'displayname' => $query->createNamedParameter('Displayname 99'),
  243. ])
  244. ->execute();
  245. $query = self::$realDatabase->getQueryBuilder();
  246. $query->insert('calendarobjects')
  247. ->values([
  248. 'id' => $query->createNamedParameter(1),
  249. 'calendardata' => $query->createNamedParameter('Calendar data 123'),
  250. 'calendarid' => $query->createNamedParameter(1),
  251. 'size' => $query->createNamedParameter(42),
  252. ])
  253. ->execute();
  254. $query = self::$realDatabase->getQueryBuilder();
  255. $query->insert('calendarobjects')
  256. ->values([
  257. 'id' => $query->createNamedParameter(2),
  258. 'calendardata' => $query->createNamedParameter('Calendar data 456'),
  259. 'calendarid' => $query->createNamedParameter(1),
  260. 'size' => $query->createNamedParameter(42),
  261. ])
  262. ->execute();
  263. $query = self::$realDatabase->getQueryBuilder();
  264. $query->insert('calendarobjects')
  265. ->values([
  266. 'id' => $query->createNamedParameter(10),
  267. 'calendardata' => $query->createNamedParameter('Calendar data 789'),
  268. 'calendarid' => $query->createNamedParameter(99),
  269. 'size' => $query->createNamedParameter(42),
  270. ])
  271. ->execute();
  272. $query = self::$realDatabase->getQueryBuilder();
  273. $query->insert('calendar_reminders')
  274. ->values([
  275. 'calendar_id' => $query->createNamedParameter(1),
  276. 'object_id' => $query->createNamedParameter(1),
  277. 'uid' => $query->createNamedParameter('asd'),
  278. 'is_recurring' => $query->createNamedParameter(0),
  279. 'recurrence_id' => $query->createNamedParameter(123458),
  280. 'is_recurrence_exception' => $query->createNamedParameter(0),
  281. 'event_hash' => $query->createNamedParameter('asd123'),
  282. 'alarm_hash' => $query->createNamedParameter('asd567'),
  283. 'type' => $query->createNamedParameter('EMAIL'),
  284. 'is_relative' => $query->createNamedParameter(1),
  285. 'notification_date' => $query->createNamedParameter(123456),
  286. 'is_repeat_based' => $query->createNamedParameter(0),
  287. ])
  288. ->execute();
  289. $query = self::$realDatabase->getQueryBuilder();
  290. $query->insert('calendar_reminders')
  291. ->values([
  292. 'calendar_id' => $query->createNamedParameter(1),
  293. 'object_id' => $query->createNamedParameter(1),
  294. 'uid' => $query->createNamedParameter('asd'),
  295. 'is_recurring' => $query->createNamedParameter(0),
  296. 'recurrence_id' => $query->createNamedParameter(123458),
  297. 'is_recurrence_exception' => $query->createNamedParameter(0),
  298. 'event_hash' => $query->createNamedParameter('asd123'),
  299. 'alarm_hash' => $query->createNamedParameter('asd567'),
  300. 'type' => $query->createNamedParameter('AUDIO'),
  301. 'is_relative' => $query->createNamedParameter(1),
  302. 'notification_date' => $query->createNamedParameter(123456),
  303. 'is_repeat_based' => $query->createNamedParameter(0),
  304. ])
  305. ->execute();
  306. $query = self::$realDatabase->getQueryBuilder();
  307. $query->insert('calendar_reminders')
  308. ->values([
  309. 'calendar_id' => $query->createNamedParameter(1),
  310. 'object_id' => $query->createNamedParameter(2),
  311. 'uid' => $query->createNamedParameter('asd'),
  312. 'is_recurring' => $query->createNamedParameter(0),
  313. 'recurrence_id' => $query->createNamedParameter(123900),
  314. 'is_recurrence_exception' => $query->createNamedParameter(0),
  315. 'event_hash' => $query->createNamedParameter('asd123'),
  316. 'alarm_hash' => $query->createNamedParameter('asd567'),
  317. 'type' => $query->createNamedParameter('EMAIL'),
  318. 'is_relative' => $query->createNamedParameter(1),
  319. 'notification_date' => $query->createNamedParameter(123499),
  320. 'is_repeat_based' => $query->createNamedParameter(0),
  321. ])
  322. ->execute();
  323. $query = self::$realDatabase->getQueryBuilder();
  324. $query->insert('calendar_reminders')
  325. ->values([
  326. 'calendar_id' => $query->createNamedParameter(99),
  327. 'object_id' => $query->createNamedParameter(10),
  328. 'uid' => $query->createNamedParameter('asd'),
  329. 'is_recurring' => $query->createNamedParameter(0),
  330. 'recurrence_id' => $query->createNamedParameter(123900),
  331. 'is_recurrence_exception' => $query->createNamedParameter(0),
  332. 'event_hash' => $query->createNamedParameter('asd123'),
  333. 'alarm_hash' => $query->createNamedParameter('asd567'),
  334. 'type' => $query->createNamedParameter('DISPLAY'),
  335. 'is_relative' => $query->createNamedParameter(1),
  336. 'notification_date' => $query->createNamedParameter(123600),
  337. 'is_repeat_based' => $query->createNamedParameter(0),
  338. ])
  339. ->execute();
  340. }
  341. }