FreeBusyGeneratorTest.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. <?php
  2. namespace Sabre\VObject;
  3. class FreeBusyGeneratorTest extends \PHPUnit_Framework_TestCase {
  4. function getInput() {
  5. $tests = array();
  6. $blob = <<<ICS
  7. BEGIN:VCALENDAR
  8. BEGIN:VEVENT
  9. UID:foobar
  10. DTSTART:20110101T120000Z
  11. DTEND:20110101T130000Z
  12. END:VEVENT
  13. END:VCALENDAR
  14. ICS;
  15. $tests[] = array(
  16. $blob,
  17. "20110101T120000Z/20110101T130000Z"
  18. );
  19. // opaque, shows up
  20. $blob = <<<ICS
  21. BEGIN:VCALENDAR
  22. BEGIN:VEVENT
  23. UID:foobar2
  24. TRANSP:OPAQUE
  25. DTSTART:20110101T130000Z
  26. DTEND:20110101T140000Z
  27. END:VEVENT
  28. END:VCALENDAR
  29. ICS;
  30. $tests[] = array(
  31. $blob,
  32. "20110101T130000Z/20110101T140000Z"
  33. );
  34. // transparent, hidden
  35. $blob = <<<ICS
  36. BEGIN:VCALENDAR
  37. BEGIN:VEVENT
  38. UID:foobar3
  39. TRANSP:TRANSPARENT
  40. DTSTART:20110101T140000Z
  41. DTEND:20110101T150000Z
  42. END:VEVENT
  43. END:VCALENDAR
  44. ICS;
  45. $tests[] = array(
  46. $blob,
  47. null,
  48. );
  49. // cancelled, hidden
  50. $blob = <<<ICS
  51. BEGIN:VCALENDAR
  52. BEGIN:VEVENT
  53. UID:foobar4
  54. STATUS:CANCELLED
  55. DTSTART:20110101T160000Z
  56. DTEND:20110101T170000Z
  57. END:VEVENT
  58. END:VCALENDAR
  59. ICS;
  60. $tests[] = array(
  61. $blob,
  62. null,
  63. );
  64. // tentative, shows up
  65. $blob = <<<ICS
  66. BEGIN:VCALENDAR
  67. BEGIN:VEVENT
  68. UID:foobar5
  69. STATUS:TENTATIVE
  70. DTSTART:20110101T180000Z
  71. DTEND:20110101T190000Z
  72. END:VEVENT
  73. END:VCALENDAR
  74. ICS;
  75. $tests[] = array(
  76. $blob,
  77. '20110101T180000Z/20110101T190000Z',
  78. );
  79. // outside of time-range, hidden
  80. $blob = <<<ICS
  81. BEGIN:VCALENDAR
  82. BEGIN:VEVENT
  83. UID:foobar6
  84. DTSTART:20110101T090000Z
  85. DTEND:20110101T100000Z
  86. END:VEVENT
  87. END:VCALENDAR
  88. ICS;
  89. $tests[] = array(
  90. $blob,
  91. null,
  92. );
  93. // outside of time-range, hidden
  94. $blob = <<<ICS
  95. BEGIN:VCALENDAR
  96. BEGIN:VEVENT
  97. UID:foobar7
  98. DTSTART:20110104T090000Z
  99. DTEND:20110104T100000Z
  100. END:VEVENT
  101. END:VCALENDAR
  102. ICS;
  103. $tests[] = array(
  104. $blob,
  105. null,
  106. );
  107. // using duration, shows up
  108. $blob = <<<ICS
  109. BEGIN:VCALENDAR
  110. BEGIN:VEVENT
  111. UID:foobar8
  112. DTSTART:20110101T190000Z
  113. DURATION:PT1H
  114. END:VEVENT
  115. END:VCALENDAR
  116. ICS;
  117. $tests[] = array(
  118. $blob,
  119. '20110101T190000Z/20110101T200000Z',
  120. );
  121. // Day-long event, shows up
  122. $blob = <<<ICS
  123. BEGIN:VCALENDAR
  124. BEGIN:VEVENT
  125. UID:foobar9
  126. DTSTART;VALUE=DATE:20110102
  127. END:VEVENT
  128. END:VCALENDAR
  129. ICS;
  130. $tests[] = array(
  131. $blob,
  132. '20110102T000000Z/20110103T000000Z',
  133. );
  134. // No duration, does not show up
  135. $blob = <<<ICS
  136. BEGIN:VCALENDAR
  137. BEGIN:VEVENT
  138. UID:foobar10
  139. DTSTART:20110101T200000Z
  140. END:VEVENT
  141. END:VCALENDAR
  142. ICS;
  143. $tests[] = array(
  144. $blob,
  145. null,
  146. );
  147. // encoded as object, shows up
  148. $blob = <<<ICS
  149. BEGIN:VCALENDAR
  150. BEGIN:VEVENT
  151. UID:foobar11
  152. DTSTART:20110101T210000Z
  153. DURATION:PT1H
  154. END:VEVENT
  155. END:VCALENDAR
  156. ICS;
  157. $tests[] = array(
  158. Reader::read($blob),
  159. '20110101T210000Z/20110101T220000Z',
  160. );
  161. // Freebusy. Some parts show up
  162. $blob = <<<ICS
  163. BEGIN:VCALENDAR
  164. BEGIN:VFREEBUSY
  165. FREEBUSY:20110103T010000Z/20110103T020000Z
  166. FREEBUSY;FBTYPE=FREE:20110103T020000Z/20110103T030000Z
  167. FREEBUSY:20110103T030000Z/20110103T040000Z,20110103T040000Z/20110103T050000Z
  168. FREEBUSY:20120101T000000Z/20120101T010000Z
  169. FREEBUSY:20110103T050000Z/PT1H
  170. END:VFREEBUSY
  171. END:VCALENDAR
  172. ICS;
  173. $tests[] = array(
  174. Reader::read($blob),
  175. array(
  176. '20110103T010000Z/20110103T020000Z',
  177. '20110103T030000Z/20110103T040000Z',
  178. '20110103T040000Z/20110103T050000Z',
  179. '20110103T050000Z/20110103T060000Z',
  180. )
  181. );
  182. // Yearly recurrence rule, shows up
  183. $blob = <<<ICS
  184. BEGIN:VCALENDAR
  185. BEGIN:VEVENT
  186. UID:foobar13
  187. DTSTART:20100101T220000Z
  188. DTEND:20100101T230000Z
  189. RRULE:FREQ=YEARLY
  190. END:VEVENT
  191. END:VCALENDAR
  192. ICS;
  193. $tests[] = array(
  194. Reader::read($blob),
  195. '20110101T220000Z/20110101T230000Z',
  196. );
  197. // Yearly recurrence rule + duration, shows up
  198. $blob = <<<ICS
  199. BEGIN:VCALENDAR
  200. BEGIN:VEVENT
  201. UID:foobar14
  202. DTSTART:20100101T230000Z
  203. DURATION:PT1H
  204. RRULE:FREQ=YEARLY
  205. END:VEVENT
  206. END:VCALENDAR
  207. ICS;
  208. $tests[] = array(
  209. Reader::read($blob),
  210. '20110101T230000Z/20110102T000000Z',
  211. );
  212. // Floating time, no timezone
  213. $blob = <<<ICS
  214. BEGIN:VCALENDAR
  215. BEGIN:VEVENT
  216. UID:foobar
  217. DTSTART:20110101T120000
  218. DTEND:20110101T130000
  219. END:VEVENT
  220. END:VCALENDAR
  221. ICS;
  222. $tests[] = array(
  223. $blob,
  224. "20110101T120000Z/20110101T130000Z"
  225. );
  226. // Floating time + reference timezone
  227. $blob = <<<ICS
  228. BEGIN:VCALENDAR
  229. BEGIN:VEVENT
  230. UID:foobar
  231. DTSTART:20110101T120000
  232. DTEND:20110101T130000
  233. END:VEVENT
  234. END:VCALENDAR
  235. ICS;
  236. $tests[] = array(
  237. $blob,
  238. "20110101T170000Z/20110101T180000Z",
  239. new \DateTimeZone('America/Toronto')
  240. );
  241. // All-day event
  242. $blob = <<<ICS
  243. BEGIN:VCALENDAR
  244. BEGIN:VEVENT
  245. UID:foobar
  246. DTSTART;VALUE=DATE:20110101
  247. END:VEVENT
  248. END:VCALENDAR
  249. ICS;
  250. $tests[] = array(
  251. $blob,
  252. "20110101T000000Z/20110102T000000Z"
  253. );
  254. // All-day event + reference timezone
  255. $blob = <<<ICS
  256. BEGIN:VCALENDAR
  257. BEGIN:VEVENT
  258. UID:foobar
  259. DTSTART;VALUE=DATE:20110101
  260. END:VEVENT
  261. END:VCALENDAR
  262. ICS;
  263. $tests[] = array(
  264. $blob,
  265. "20110101T050000Z/20110102T050000Z",
  266. new \DateTimeZone('America/Toronto')
  267. );
  268. // Recurrence rule with no valid instances
  269. $blob = <<<ICS
  270. BEGIN:VCALENDAR
  271. BEGIN:VEVENT
  272. UID:foobar
  273. DTSTART:20110101T100000Z
  274. DTEND:20110103T120000Z
  275. RRULE:FREQ=WEEKLY;COUNT=1
  276. EXDATE:20110101T100000Z
  277. END:VEVENT
  278. END:VCALENDAR
  279. ICS;
  280. $tests[] = array(
  281. $blob,
  282. array()
  283. );
  284. return $tests;
  285. }
  286. /**
  287. * @dataProvider getInput
  288. */
  289. function testGenerator($input, $expected, $timeZone = null) {
  290. $gen = new FreeBusyGenerator(
  291. new \DateTime('20110101T110000Z', new \DateTimeZone('UTC')),
  292. new \DateTime('20110103T110000Z', new \DateTimeZone('UTC')),
  293. $input,
  294. $timeZone
  295. );
  296. $result = $gen->getResult();
  297. $expected = (array)$expected;
  298. $freebusy = $result->VFREEBUSY->select('FREEBUSY');
  299. foreach($freebusy as $fb) {
  300. $this->assertContains((string)$fb, $expected, "$fb did not appear in our list of expected freebusy strings. This is concerning!");
  301. $k = array_search((string)$fb, $expected);
  302. unset($expected[$k]);
  303. }
  304. $this->assertTrue(
  305. count($expected) === 0,
  306. 'There were elements in the expected array that were not found in the output: ' . "\n" . print_r($expected,true) . "\n" . $result->serialize()
  307. );
  308. }
  309. function testGeneratorBaseObject() {
  310. $obj = new Component\VCalendar();
  311. $obj->METHOD = 'PUBLISH';
  312. $gen = new FreeBusyGenerator();
  313. $gen->setObjects(array());
  314. $gen->setBaseObject($obj);
  315. $result = $gen->getResult();
  316. $this->assertEquals('PUBLISH', $result->METHOD->getValue());
  317. }
  318. /**
  319. * @expectedException InvalidArgumentException
  320. */
  321. function testInvalidArg() {
  322. $gen = new FreeBusyGenerator(
  323. new \DateTime('2012-01-01'),
  324. new \DateTime('2012-12-31'),
  325. new \StdClass()
  326. );
  327. }
  328. }