PageRenderTime 31ms CodeModel.GetById 39ms RepoModel.GetById 0ms app.codeStats 1ms

/tests/tine20/Calendar/Backend/SqlTest.php

https://github.com/tine20/Tine-2.0-Open-Source-Groupware-and-CRM
PHP | 317 lines | 251 code | 36 blank | 30 comment | 3 complexity | 4fdf799ab0ff2644a47e1e265cc936d1 MD5 | raw file
  1. <?php
  2. /**
  3. * Tine 2.0 - http://www.tine20.org
  4. *
  5. * @package Calendar
  6. * @license http://www.gnu.org/licenses/agpl.html AGPL Version 3
  7. * @copyright Copyright (c) 2009-2014 Metaways Infosystems GmbH (http://www.metaways.de)
  8. * @author Cornelius Weiss <c.weiss@metaways.de>
  9. */
  10. /**
  11. * Test class for Calendar_Backend_Sql
  12. *
  13. * @package Calendar
  14. */
  15. class Calendar_Backend_SqlTest extends Calendar_TestCase
  16. {
  17. public function testCreateEvent()
  18. {
  19. $event = $this->_getEvent();
  20. $event->creation_time = Tinebase_DateTime::now();
  21. $persistentEvent = $this->_backend->create($event);
  22. $event->attendee->cal_event_id = $persistentEvent->getId();
  23. foreach ($event->attendee as $attender) {
  24. $this->_backend->createAttendee($attender);
  25. }
  26. $loadedPersitentEvent = $this->_backend->get($persistentEvent->getId());
  27. $this->assertEquals($event->summary, $loadedPersitentEvent->summary);
  28. $this->_assertAttendee($event->attendee, $loadedPersitentEvent->attendee);
  29. return $loadedPersitentEvent;
  30. }
  31. public function testUpdateEvent()
  32. {
  33. $event = $this->_getEvent();
  34. $persistentEvent = $this->_backend->create($event);
  35. $event->attendee->cal_event_id = $persistentEvent->getId();
  36. foreach ($event->attendee as $attender) {
  37. $this->_backend->createAttendee($attender);
  38. }
  39. $persistentEvent->dtstart->addHour(3);
  40. $persistentEvent->dtend->addHour(3);
  41. $persistentEvent->summary = 'Robert Lembke:';
  42. $persistentEvent->description = 'Wer spät zu Bett geht und früh heraus muß, weiß, woher das Wort Morgengrauen kommt';
  43. $updatedEvent = $this->_backend->update($persistentEvent);
  44. $loadedPersitentEvent = $this->_backend->get($persistentEvent->getId());
  45. $this->assertEquals($loadedPersitentEvent->summary, $updatedEvent->summary);
  46. $this->assertTrue($loadedPersitentEvent->dtstart->equals($updatedEvent->dtstart));
  47. $this->_assertAttendee($loadedPersitentEvent->attendee, $updatedEvent->attendee);
  48. }
  49. public function testGetEvent()
  50. {
  51. $event = $this->_getEvent();
  52. $persistentEvent = $this->_backend->create($event);
  53. $event->attendee->cal_event_id = $persistentEvent->getId();
  54. foreach ($event->attendee as $attender) {
  55. $this->_backend->createAttendee($attender);
  56. }
  57. $loadedEvent = $this->_backend->get($persistentEvent->getId());
  58. $this->assertEquals($event->summary, $loadedEvent->summary);
  59. $this->_assertAttendee($event->attendee, $loadedEvent->attendee);
  60. }
  61. public function testDeleteEvent()
  62. {
  63. $event = $this->_getEvent();
  64. $persistentEvent = $this->_backend->create($event);
  65. $this->_backend->delete($persistentEvent->getId());
  66. $attendeeBackend = new Calendar_Backend_Sql_Attendee($this->_backend->getAdapter());
  67. $this->assertEquals(0, count($attendeeBackend->getMultipleByProperty($persistentEvent->getId(), 'cal_event_id')));
  68. $this->expectException('Tinebase_Exception_NotFound');
  69. $loadedEvent = $this->_backend->get($persistentEvent->getId());
  70. }
  71. /**
  72. * test search events
  73. */
  74. public function testSearchEvents()
  75. {
  76. $from = '2009-04-03 00:00:00';
  77. $until = '2009-04-10 23:59:59';
  78. $events = new Tinebase_Record_RecordSet('Calendar_Model_Event', array(
  79. array(
  80. 'dtstart' => '2009-04-02 22:00:00',
  81. 'dtend' => '2009-04-02 23:59:59',
  82. 'summary' => 'non recur event ending before search period => should _not_ be found',
  83. 'attendee' => $this->_getAttendee(),
  84. 'container_id' => $this->_getTestCalendar()->getId(),
  85. 'organizer' => Tinebase_Core::getUser()->getId(),
  86. 'uid' => Calendar_Model_Event::generateUID(),
  87. Tinebase_Model_Grants::GRANT_READ => true,
  88. ),
  89. array(
  90. 'dtstart' => '2009-04-02 23:30:00',
  91. 'dtend' => '2009-04-03 00:30:00',
  92. 'summary' => 'non recur event ending within search period => should be found',
  93. 'attendee' => $this->_getAttendee(),
  94. 'container_id' => $this->_getTestCalendar()->getId(),
  95. 'organizer' => Tinebase_Core::getUser()->getId(),
  96. 'uid' => Calendar_Model_Event::generateUID(),
  97. Tinebase_Model_Grants::GRANT_READ => true
  98. ),
  99. array(
  100. 'dtstart' => '2009-04-06 12:00:00',
  101. 'dtend' => '2009-04-07 12:00:00',
  102. 'summary' => 'non recur event completly within search period => should be found',
  103. 'attendee' => $this->_getAttendee(),
  104. 'container_id' => $this->_getTestCalendar()->getId(),
  105. 'organizer' => Tinebase_Core::getUser()->getId(),
  106. 'uid' => Calendar_Model_Event::generateUID(),
  107. Tinebase_Model_Grants::GRANT_READ => true
  108. ),
  109. array(
  110. 'dtstart' => '2009-04-10 23:30:00',
  111. 'dtend' => '2009-04-11 00:30:00',
  112. 'summary' => 'non recur event starting within search period => should be found',
  113. 'attendee' => $this->_getAttendee(),
  114. 'container_id' => $this->_getTestCalendar()->getId(),
  115. 'organizer' => Tinebase_Core::getUser()->getId(),
  116. 'uid' => Calendar_Model_Event::generateUID(),
  117. Tinebase_Model_Grants::GRANT_READ => true
  118. ),
  119. array(
  120. 'dtstart' => '2009-04-11 00:00:00',
  121. 'dtend' => '2009-04-11 02:00:00',
  122. 'summary' => 'non recur event starting after search period => should _not_ be found',
  123. 'attendee' => $this->_getAttendee(),
  124. 'container_id' => $this->_getTestCalendar()->getId(),
  125. 'organizer' => Tinebase_Core::getUser()->getId(),
  126. 'uid' => Calendar_Model_Event::generateUID(),
  127. Tinebase_Model_Grants::GRANT_READ => true
  128. ),
  129. array(
  130. 'dtstart' => '2009-03-27 22:00:00',
  131. 'dtend' => '2009-03-27 23:59:59',
  132. 'rrule' => 'FREQ=DAILY;INTERVAL=1;UNTIL=2009-04-02 23:59:59',
  133. 'summary' => 'recur event ending before search period => should _not_ be found',
  134. 'attendee' => $this->_getAttendee(),
  135. 'container_id' => $this->_getTestCalendar()->getId(),
  136. 'organizer' => Tinebase_Core::getUser()->getId(),
  137. 'uid' => Calendar_Model_Event::generateUID(),
  138. 'rrule_until' => '2009-04-02 23:59:59',
  139. Tinebase_Model_Grants::GRANT_READ => true,
  140. 'originator_tz' => Tinebase_Core::getUserTimezone()
  141. ),
  142. array(
  143. 'dtstart' => '2009-03-27 22:00:00',
  144. 'dtend' => '2009-03-27 23:59:59',
  145. 'rrule' => 'FREQ=DAILY;INTERVAL=1;UNTIL=2009-04-05 23:59:59',
  146. 'summary' => 'recur event ending within search period => should be found',
  147. 'attendee' => $this->_getAttendee(),
  148. 'container_id' => $this->_getTestCalendar()->getId(),
  149. 'organizer' => Tinebase_Core::getUser()->getId(),
  150. 'uid' => Calendar_Model_Event::generateUID(),
  151. 'rrule_until' => '2009-04-05 23:59:59',
  152. Tinebase_Model_Grants::GRANT_READ => true,
  153. 'originator_tz' => Tinebase_Core::getUserTimezone()
  154. ),
  155. array(
  156. 'dtstart' => '2009-04-03 22:00:00',
  157. 'dtend' => '2009-04-03 23:59:59',
  158. 'rrule' => 'FREQ=DAILY;INTERVAL=1;UNTIL=2009-04-06 23:59:59',
  159. 'summary' => 'recur event completly within search period => should be found',
  160. 'attendee' => $this->_getAttendee(),
  161. 'container_id' => $this->_getTestCalendar()->getId(),
  162. 'organizer' => Tinebase_Core::getUser()->getId(),
  163. 'uid' => Calendar_Model_Event::generateUID(),
  164. 'rrule_until' => '2009-04-06 23:59:59',
  165. Tinebase_Model_Grants::GRANT_READ => true,
  166. 'originator_tz' => Tinebase_Core::getUserTimezone()
  167. ),
  168. array(
  169. 'dtstart' => '2009-04-03 22:00:00',
  170. 'dtend' => '2009-04-03 23:59:59',
  171. 'rrule' => 'FREQ=DAILY;INTERVAL=1;UNTIL=2009-04-12 23:59:59',
  172. 'summary' => 'recur event starting within search period => should be found',
  173. 'attendee' => $this->_getAttendee(),
  174. 'container_id' => $this->_getTestCalendar()->getId(),
  175. 'organizer' => Tinebase_Core::getUser()->getId(),
  176. 'uid' => Calendar_Model_Event::generateUID(),
  177. 'rrule_until' => '2009-04-12 23:59:59',
  178. Tinebase_Model_Grants::GRANT_READ => true,
  179. 'originator_tz' => Tinebase_Core::getUserTimezone()
  180. ),
  181. array(
  182. 'dtstart' => '2009-04-11 00:00:00',
  183. 'dtend' => '2009-04-11 02:00:00',
  184. 'rrule' => 'FREQ=DAILY;INTERVAL=1;UNTIL=2009-04-15 02:00:00',
  185. 'summary' => 'recur event starting after search period => should _not_ be found',
  186. 'attendee' => $this->_getAttendee(),
  187. 'container_id' => $this->_getTestCalendar()->getId(),
  188. 'organizer' => Tinebase_Core::getUser()->getId(),
  189. 'uid' => Calendar_Model_Event::generateUID(),
  190. 'rrule_until' => '2009-04-15 02:00:00',
  191. Tinebase_Model_Grants::GRANT_READ => true,
  192. 'originator_tz' => Tinebase_Core::getUserTimezone()
  193. )
  194. ));
  195. foreach ($events as $event) {
  196. $persistentEvent = $this->_backend->create($event);
  197. $event->attendee->cal_event_id = $persistentEvent->getId();
  198. foreach ($event->attendee as $attender) {
  199. $this->_backend->createAttendee($attender);
  200. }
  201. }
  202. $filter = new Calendar_Model_EventFilter(array(
  203. array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_getTestCalendar()->getId()),
  204. array('field' => 'period' , 'operator' => 'within', 'value' => array(
  205. 'from' => $from,
  206. 'until' => $until
  207. )),
  208. ));
  209. $eventsFound = $this->_backend->search($filter, new Tinebase_Model_Pagination());
  210. $eventsFoundIds = $eventsFound->getArrayOfIds();
  211. foreach ($events as $event) {
  212. $eventId = $event->getId();
  213. if (strpos($event->summary, '_not_') === false) {
  214. $this->assertTrue(in_array($eventId, $eventsFoundIds), 'The following event is missing in the search result :' . print_r($event->toArray(), true));
  215. } else {
  216. $this->assertFalse(in_array($eventId, $eventsFoundIds), 'The following event is in the search result, but should not be :' . print_r($event->toArray(), true));
  217. }
  218. }
  219. $expectedAttendee = $this->_getAttendee();
  220. foreach ($eventsFound as $fetchedEvent) {
  221. $this->_assertAttendee($expectedAttendee, $fetchedEvent->attendee);
  222. }
  223. }
  224. public function testExDate()
  225. {
  226. $event = $this->_getEvent();
  227. $event->rrule = 'FREQ=WEEKLY;INTERVAL=1;UNTIL=2009-05-20 23:59:59';
  228. $event->exdate = array(
  229. new Tinebase_DateTime('2009-04-29 06:00:00'),
  230. new Tinebase_DateTime('2009-05-06 06:00:00'),
  231. );
  232. $persistentEvent = $this->_backend->create($event);
  233. $this->assertEquals(2, count($persistentEvent->exdate), 'We put in two exdates, we should get out two exdates!');
  234. foreach ($persistentEvent->exdate as $exdate) {
  235. $this->assertTrue($exdate->equals($event->exdate[0]) || $exdate->equals($event->exdate[1]), 'exdates mismatch');
  236. }
  237. }
  238. /**
  239. * asserts attendee
  240. *
  241. * @param Tinebase_Record_RecordSet $_expected
  242. * @param Tinebase_Record_RecordSet $_actual
  243. */
  244. protected function _assertAttendee($_expected, $_actual)
  245. {
  246. $this->assertEquals(count($_expected), count($_actual));
  247. }
  248. /**
  249. * testDeleteDuplicateEvents
  250. *
  251. * @see 0008182: event with lots of exceptions breaks calendar sync
  252. */
  253. public function testDeleteDuplicateEvents()
  254. {
  255. $this->_backend->deleteByProperty('Wakeup', 'summary');
  256. $event1 = $this->testCreateEvent();
  257. sleep(1);
  258. $event2 = $this->testCreateEvent();
  259. sleep(1);
  260. $event3 = $this->testCreateEvent();
  261. $filter = new Calendar_Model_EventFilter(array(array(
  262. 'field' => 'summary',
  263. 'operator' => 'equals',
  264. 'value' => 'Wakeup',
  265. )));
  266. $deletedDuplicates = $this->_backend->deleteDuplicateEvents($filter, FALSE);
  267. $this->assertGreaterThan(1, $deletedDuplicates);
  268. $this->_backend->get($event1->getId());
  269. $this->assertEquals(0, $event1->is_deleted);
  270. }
  271. /**
  272. * testIncreaseSeqForContainerId
  273. */
  274. public function testIncreaseSeqsForContainerId()
  275. {
  276. $event = $this->testCreateEvent();
  277. $this->_backend->increaseSeqsForContainerId($event->container_id);
  278. $updatedEvent = $this->_backend->get($event->getId());
  279. $this->assertEquals($event->seq + 1, $updatedEvent->seq);
  280. }
  281. }