tilia-vobject 4.0.0.pre.alpha2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (193) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.rubocop.yml +32 -0
  4. data/.simplecov +4 -0
  5. data/.travis.yml +3 -0
  6. data/CHANGELOG.sabre.md +626 -0
  7. data/CONTRIBUTING.md +25 -0
  8. data/Gemfile +17 -0
  9. data/Gemfile.lock +68 -0
  10. data/LICENSE +27 -0
  11. data/LICENSE.sabre +27 -0
  12. data/README.md +63 -0
  13. data/Rakefile +17 -0
  14. data/bin/vobject +7 -0
  15. data/lib/tilia/v_object/birthday_calendar_generator.rb +142 -0
  16. data/lib/tilia/v_object/cli.rb +582 -0
  17. data/lib/tilia/v_object/component/available.rb +107 -0
  18. data/lib/tilia/v_object/component/v_alarm.rb +114 -0
  19. data/lib/tilia/v_object/component/v_availability.rb +128 -0
  20. data/lib/tilia/v_object/component/v_calendar.rb +468 -0
  21. data/lib/tilia/v_object/component/v_card.rb +457 -0
  22. data/lib/tilia/v_object/component/v_event.rb +127 -0
  23. data/lib/tilia/v_object/component/v_free_busy.rb +81 -0
  24. data/lib/tilia/v_object/component/v_journal.rb +75 -0
  25. data/lib/tilia/v_object/component/v_time_zone.rb +51 -0
  26. data/lib/tilia/v_object/component/v_todo.rb +147 -0
  27. data/lib/tilia/v_object/component.rb +591 -0
  28. data/lib/tilia/v_object/date_time_parser.rb +486 -0
  29. data/lib/tilia/v_object/document.rb +218 -0
  30. data/lib/tilia/v_object/element_list.rb +18 -0
  31. data/lib/tilia/v_object/eof_exception.rb +8 -0
  32. data/lib/tilia/v_object/free_busy_data.rb +149 -0
  33. data/lib/tilia/v_object/free_busy_generator.rb +465 -0
  34. data/lib/tilia/v_object/i_tip/broker.rb +909 -0
  35. data/lib/tilia/v_object/i_tip/i_tip_exception.rb +9 -0
  36. data/lib/tilia/v_object/i_tip/message.rb +109 -0
  37. data/lib/tilia/v_object/i_tip/same_organizer_for_all_components_exception.rb +13 -0
  38. data/lib/tilia/v_object/i_tip.rb +10 -0
  39. data/lib/tilia/v_object/node.rb +192 -0
  40. data/lib/tilia/v_object/parameter.rb +327 -0
  41. data/lib/tilia/v_object/parse_exception.rb +7 -0
  42. data/lib/tilia/v_object/parser/json.rb +149 -0
  43. data/lib/tilia/v_object/parser/mime_dir.rb +543 -0
  44. data/lib/tilia/v_object/parser/parser.rb +61 -0
  45. data/lib/tilia/v_object/parser/xml/element/key_value.rb +60 -0
  46. data/lib/tilia/v_object/parser/xml/element.rb +11 -0
  47. data/lib/tilia/v_object/parser/xml.rb +322 -0
  48. data/lib/tilia/v_object/parser.rb +10 -0
  49. data/lib/tilia/v_object/property/binary.rb +96 -0
  50. data/lib/tilia/v_object/property/boolean.rb +57 -0
  51. data/lib/tilia/v_object/property/flat_text.rb +52 -0
  52. data/lib/tilia/v_object/property/float_value.rb +107 -0
  53. data/lib/tilia/v_object/property/i_calendar/cal_address.rb +49 -0
  54. data/lib/tilia/v_object/property/i_calendar/date.rb +15 -0
  55. data/lib/tilia/v_object/property/i_calendar/date_time.rb +330 -0
  56. data/lib/tilia/v_object/property/i_calendar/duration.rb +65 -0
  57. data/lib/tilia/v_object/property/i_calendar/period.rb +124 -0
  58. data/lib/tilia/v_object/property/i_calendar/recur.rb +173 -0
  59. data/lib/tilia/v_object/property/i_calendar.rb +14 -0
  60. data/lib/tilia/v_object/property/integer_value.rb +60 -0
  61. data/lib/tilia/v_object/property/text.rb +352 -0
  62. data/lib/tilia/v_object/property/time.rb +85 -0
  63. data/lib/tilia/v_object/property/unknown.rb +30 -0
  64. data/lib/tilia/v_object/property/uri.rb +78 -0
  65. data/lib/tilia/v_object/property/utc_offset.rb +56 -0
  66. data/lib/tilia/v_object/property/v_card/date.rb +31 -0
  67. data/lib/tilia/v_object/property/v_card/date_and_or_time.rb +343 -0
  68. data/lib/tilia/v_object/property/v_card/date_time.rb +22 -0
  69. data/lib/tilia/v_object/property/v_card/language_tag.rb +41 -0
  70. data/lib/tilia/v_object/property/v_card/time_stamp.rb +74 -0
  71. data/lib/tilia/v_object/property/v_card.rb +13 -0
  72. data/lib/tilia/v_object/property.rb +532 -0
  73. data/lib/tilia/v_object/reader.rb +73 -0
  74. data/lib/tilia/v_object/recur/event_iterator.rb +417 -0
  75. data/lib/tilia/v_object/recur/no_instances_exception.rb +11 -0
  76. data/lib/tilia/v_object/recur/r_date_iterator.rb +138 -0
  77. data/lib/tilia/v_object/recur/r_rule_iterator.rb +717 -0
  78. data/lib/tilia/v_object/recur.rb +10 -0
  79. data/lib/tilia/v_object/settings.rb +32 -0
  80. data/lib/tilia/v_object/splitter/i_calendar.rb +95 -0
  81. data/lib/tilia/v_object/splitter/splitter_interface.rb +31 -0
  82. data/lib/tilia/v_object/splitter/v_card.rb +56 -0
  83. data/lib/tilia/v_object/splitter.rb +9 -0
  84. data/lib/tilia/v_object/string_util.rb +58 -0
  85. data/lib/tilia/v_object/time_zone_data/exchange_zones.rb +96 -0
  86. data/lib/tilia/v_object/time_zone_data/lotus_zones.rb +104 -0
  87. data/lib/tilia/v_object/time_zone_data/php_zones.rb +49 -0
  88. data/lib/tilia/v_object/time_zone_data/windows_zones.rb +121 -0
  89. data/lib/tilia/v_object/time_zone_data.rb +10 -0
  90. data/lib/tilia/v_object/time_zone_util.rb +213 -0
  91. data/lib/tilia/v_object/uuid_util.rb +51 -0
  92. data/lib/tilia/v_object/v_card_converter.rb +354 -0
  93. data/lib/tilia/v_object/version.rb +9 -0
  94. data/lib/tilia/v_object/writer.rb +56 -0
  95. data/lib/tilia/v_object.rb +45 -0
  96. data/lib/tilia/vobject.rb +1 -0
  97. data/resources/schema/xcal.rng +1192 -0
  98. data/resources/schema/xcard.rng +388 -0
  99. data/test/test_helper.rb +56 -0
  100. data/test/v_object/attach_issue_test.rb +19 -0
  101. data/test/v_object/birthday_calendar_generator_test.rb +463 -0
  102. data/test/v_object/cli_mock.rb +19 -0
  103. data/test/v_object/cli_test.rb +460 -0
  104. data/test/v_object/component/available_test.rb +59 -0
  105. data/test/v_object/component/v_alarm_test.rb +160 -0
  106. data/test/v_object/component/v_availability_test.rb +388 -0
  107. data/test/v_object/component/v_calendar_test.rb +646 -0
  108. data/test/v_object/component/v_card_test.rb +258 -0
  109. data/test/v_object/component/v_event_test.rb +85 -0
  110. data/test/v_object/component/v_free_busy_test.rb +59 -0
  111. data/test/v_object/component/v_journal_test.rb +85 -0
  112. data/test/v_object/component/v_time_zone_test.rb +47 -0
  113. data/test/v_object/component/v_todo_test.rb +172 -0
  114. data/test/v_object/component_test.rb +419 -0
  115. data/test/v_object/date_time_parser_test.rb +526 -0
  116. data/test/v_object/document_test.rb +71 -0
  117. data/test/v_object/element_list_test.rb +27 -0
  118. data/test/v_object/em_client_test.rb +53 -0
  119. data/test/v_object/empty_parameter_test.rb +65 -0
  120. data/test/v_object/empty_value_issue_test.rb +25 -0
  121. data/test/v_object/fake_component.rb +21 -0
  122. data/test/v_object/free_busy_data_test.rb +285 -0
  123. data/test/v_object/free_busy_generator_test.rb +637 -0
  124. data/test/v_object/google_colon_escaping_test.rb +27 -0
  125. data/test/v_object/i_calendar/attach_parse_test.rb +24 -0
  126. data/test/v_object/i_tip/broker_attendee_reply_test.rb +1042 -0
  127. data/test/v_object/i_tip/broker_delete_event_test.rb +175 -0
  128. data/test/v_object/i_tip/broker_new_event_test.rb +440 -0
  129. data/test/v_object/i_tip/broker_process_message_test.rb +153 -0
  130. data/test/v_object/i_tip/broker_process_reply_test.rb +402 -0
  131. data/test/v_object/i_tip/broker_tester.rb +71 -0
  132. data/test/v_object/i_tip/broker_update_event_test.rb +763 -0
  133. data/test/v_object/i_tip/evolution_test.rb +2644 -0
  134. data/test/v_object/i_tip/message_test.rb +25 -0
  135. data/test/v_object/issue153.vcf +352 -0
  136. data/test/v_object/issue153_test.rb +12 -0
  137. data/test/v_object/issue26_test.rb +25 -0
  138. data/test/v_object/issue36_work_around_test.rb +37 -0
  139. data/test/v_object/issue40_test.rb +26 -0
  140. data/test/v_object/issue64.vcf +351 -0
  141. data/test/v_object/issue64_test.rb +17 -0
  142. data/test/v_object/issue96_test.rb +22 -0
  143. data/test/v_object/issue_undefined_index_test.rb +24 -0
  144. data/test/v_object/j_cal_test.rb +150 -0
  145. data/test/v_object/j_card_test.rb +192 -0
  146. data/test/v_object/line_folding_issue_test.rb +19 -0
  147. data/test/v_object/mock_document.rb +6 -0
  148. data/test/v_object/parameter_test.rb +109 -0
  149. data/test/v_object/parser/json_test.rb +370 -0
  150. data/test/v_object/parser/mime_dir_test.rb +14 -0
  151. data/test/v_object/parser/quoted_printable_test.rb +78 -0
  152. data/test/v_object/parser/xml_test.rb +2563 -0
  153. data/test/v_object/property/binary_test.rb +12 -0
  154. data/test/v_object/property/boolean_test.rb +18 -0
  155. data/test/v_object/property/compound_test.rb +43 -0
  156. data/test/v_object/property/float_test.rb +20 -0
  157. data/test/v_object/property/i_calendar/cal_address_test.rb +26 -0
  158. data/test/v_object/property/i_calendar/date_time_test.rb +303 -0
  159. data/test/v_object/property/i_calendar/duration_test.rb +14 -0
  160. data/test/v_object/property/i_calendar/recur_test.rb +39 -0
  161. data/test/v_object/property/text_test.rb +81 -0
  162. data/test/v_object/property/v_card/date_and_or_time_test.rb +205 -0
  163. data/test/v_object/property/v_card/language_tag_test.rb +35 -0
  164. data/test/v_object/property_test.rb +338 -0
  165. data/test/v_object/reader_test.rb +403 -0
  166. data/test/v_object/recur/event_iterator/by_month_in_daily_test.rb +52 -0
  167. data/test/v_object/recur/event_iterator/by_set_pos_hang_test.rb +55 -0
  168. data/test/v_object/recur/event_iterator/expand_floating_times_test.rb +109 -0
  169. data/test/v_object/recur/event_iterator/fifth_tuesday_problem_test.rb +45 -0
  170. data/test/v_object/recur/event_iterator/incorrect_expand_test.rb +53 -0
  171. data/test/v_object/recur/event_iterator/infinite_loop_problem_test.rb +75 -0
  172. data/test/v_object/recur/event_iterator/issue48_test.rb +43 -0
  173. data/test/v_object/recur/event_iterator/issue50_test.rb +123 -0
  174. data/test/v_object/recur/event_iterator/main_test.rb +1222 -0
  175. data/test/v_object/recur/event_iterator/missing_overridden_test.rb +55 -0
  176. data/test/v_object/recur/event_iterator/no_instances_test.rb +32 -0
  177. data/test/v_object/recur/event_iterator/override_first_event_test.rb +106 -0
  178. data/test/v_object/recur/r_date_iterator_test.rb +44 -0
  179. data/test/v_object/recur/r_rule_iterator_test.rb +608 -0
  180. data/test/v_object/recurrence_iterator/UntilRespectsTimezoneTest.ics +39 -0
  181. data/test/v_object/slash_r_test.rb +15 -0
  182. data/test/v_object/splitter/i_calendar_test.rb +299 -0
  183. data/test/v_object/splitter/v_card_test.rb +173 -0
  184. data/test/v_object/string_util_test.rb +37 -0
  185. data/test/v_object/test_case.rb +42 -0
  186. data/test/v_object/time_zone_util_test.rb +271 -0
  187. data/test/v_object/uuid_util_test.rb +18 -0
  188. data/test/v_object/v_card21_test.rb +43 -0
  189. data/test/v_object/v_card_converter_test.rb +419 -0
  190. data/test/v_object/version_test.rb +15 -0
  191. data/test/v_object/writer_test.rb +33 -0
  192. data/tilia-vobject.gemspec +17 -0
  193. metadata +308 -0
@@ -0,0 +1,637 @@
1
+ require 'test_helper'
2
+ require 'v_object/test_case'
3
+
4
+ module Tilia
5
+ module VObject
6
+ class FreeBusyGeneratorTest < TestCase
7
+ # This function takes a list of objects (icalendar objects), and turns
8
+ # them into a freebusy report.
9
+ #
10
+ # Then it takes the expected output and compares it to what we actually
11
+ # got.
12
+ #
13
+ # It only generates the freebusy report for the following time-range:
14
+ # 2011-01-01 11:00:00 until 2011-01-03 11:11:11
15
+ #
16
+ # @param string expected
17
+ # @param array input
18
+ # @param string|null time_zone
19
+ # @param string vavailability
20
+ # @return void
21
+ def assert_free_busy_report(expected, input, time_zone = nil, vavailability = nil)
22
+ utc = ActiveSupport::TimeZone.new('UTC')
23
+ gen = Tilia::VObject::FreeBusyGenerator.new(
24
+ utc.parse('20110101T110000Z'),
25
+ utc.parse('20110103T110000Z'),
26
+ input,
27
+ time_zone
28
+ )
29
+
30
+ if vavailability
31
+ if vavailability.is_a?(String)
32
+ vavailability = Tilia::VObject::Reader.read(vavailability)
33
+ end
34
+ gen.v_availability = vavailability
35
+ end
36
+
37
+ output = gen.result
38
+
39
+ # Removing DTSTAMP because it changes every time.
40
+ output['VFREEBUSY'].delete('DTSTAMP')
41
+
42
+ expected = <<ICS
43
+ BEGIN:VCALENDAR
44
+ VERSION:2.0
45
+ BEGIN:VFREEBUSY
46
+ DTSTART:20110101T110000Z
47
+ DTEND:20110103T110000Z
48
+ #{expected}
49
+ END:VFREEBUSY
50
+ END:VCALENDAR
51
+ ICS
52
+
53
+ assert_v_obj_equals(expected, output)
54
+ end
55
+
56
+ def test_generator_base_object
57
+ obj = Tilia::VObject::Component::VCalendar.new
58
+ obj['METHOD'] = 'PUBLISH'
59
+
60
+ gen = Tilia::VObject::FreeBusyGenerator.new
61
+ gen.objects = []
62
+ gen.base_object = obj
63
+
64
+ result = gen.result
65
+
66
+ assert_equal('PUBLISH', result['METHOD'].value)
67
+ end
68
+
69
+ def test_invalid_arg
70
+ assert_raises(ArgumentError) do
71
+ Tilia::VObject::FreeBusyGenerator.new(
72
+ Time.zone.parse('2012-01-01'),
73
+ Time.zone.parse('2012-12-31'),
74
+ Class.new
75
+ )
76
+ end
77
+ end
78
+
79
+ def test_simple
80
+ blob = <<ICS
81
+ BEGIN:VCALENDAR
82
+ BEGIN:VEVENT
83
+ UID:foobar
84
+ DTSTART:20110101T120000Z
85
+ DTEND:20110101T130000Z
86
+ END:VEVENT
87
+ END:VCALENDAR
88
+ ICS
89
+
90
+ assert_free_busy_report(
91
+ 'FREEBUSY:20110101T120000Z/20110101T130000Z',
92
+ blob
93
+ )
94
+ end
95
+
96
+ # Testing TRANSP:OPAQUE
97
+ def test_opaque
98
+ blob = <<ICS
99
+ BEGIN:VCALENDAR
100
+ BEGIN:VEVENT
101
+ UID:foobar2
102
+ TRANSP:OPAQUE
103
+ DTSTART:20110101T130000Z
104
+ DTEND:20110101T140000Z
105
+ END:VEVENT
106
+ END:VCALENDAR
107
+ ICS
108
+ assert_free_busy_report(
109
+ 'FREEBUSY:20110101T130000Z/20110101T140000Z',
110
+ blob
111
+ )
112
+ end
113
+
114
+ # Testing TRANSP:TRANSPARENT
115
+ def test_transparent
116
+ # transparent, hidden
117
+ blob = <<ICS
118
+ BEGIN:VCALENDAR
119
+ BEGIN:VEVENT
120
+ UID:foobar3
121
+ TRANSP:TRANSPARENT
122
+ DTSTART:20110101T140000Z
123
+ DTEND:20110101T150000Z
124
+ END:VEVENT
125
+ END:VCALENDAR
126
+ ICS
127
+
128
+ assert_free_busy_report(
129
+ '',
130
+ blob
131
+ )
132
+ end
133
+
134
+ # Testing STATUS:CANCELLED
135
+ def test_cancelled
136
+ # transparent, hidden
137
+ blob = <<ICS
138
+ BEGIN:VCALENDAR
139
+ BEGIN:VEVENT
140
+ UID:foobar4
141
+ STATUS:CANCELLED
142
+ DTSTART:20110101T160000Z
143
+ DTEND:20110101T170000Z
144
+ END:VEVENT
145
+ END:VCALENDAR
146
+ ICS
147
+
148
+ assert_free_busy_report(
149
+ '',
150
+ blob
151
+ )
152
+ end
153
+
154
+ # Testing STATUS:TENTATIVE
155
+ def test_tentative
156
+ # tentative, shows up
157
+ blob = <<ICS
158
+ BEGIN:VCALENDAR
159
+ BEGIN:VEVENT
160
+ UID:foobar5
161
+ STATUS:TENTATIVE
162
+ DTSTART:20110101T180000Z
163
+ DTEND:20110101T190000Z
164
+ END:VEVENT
165
+ END:VCALENDAR
166
+ ICS
167
+
168
+ assert_free_busy_report(
169
+ 'FREEBUSY;FBTYPE=BUSY-TENTATIVE:20110101T180000Z/20110101T190000Z',
170
+ blob
171
+ )
172
+ end
173
+
174
+ # Testing an event that falls outside of the report time-range.
175
+ def test_outside_time_range
176
+ # outside of time-range, hidden
177
+ blob = <<ICS
178
+ BEGIN:VCALENDAR
179
+ BEGIN:VEVENT
180
+ UID:foobar6
181
+ DTSTART:20110101T090000Z
182
+ DTEND:20110101T100000Z
183
+ END:VEVENT
184
+ END:VCALENDAR
185
+ ICS
186
+
187
+ assert_free_busy_report(
188
+ '',
189
+ blob
190
+ )
191
+ end
192
+
193
+ # Testing an event that falls outside of the report time-range.
194
+ def test_outside_time_range2
195
+ # outside of time-range, hidden
196
+ blob = <<ICS
197
+ BEGIN:VCALENDAR
198
+ BEGIN:VEVENT
199
+ UID:foobar7
200
+ DTSTART:20110104T090000Z
201
+ DTEND:20110104T100000Z
202
+ END:VEVENT
203
+ END:VCALENDAR
204
+ ICS
205
+
206
+ assert_free_busy_report(
207
+ '',
208
+ blob
209
+ )
210
+ end
211
+
212
+ # Testing an event that uses DURATION
213
+ def test_duration
214
+ # using duration, shows up
215
+ blob = <<ICS
216
+ BEGIN:VCALENDAR
217
+ BEGIN:VEVENT
218
+ UID:foobar8
219
+ DTSTART:20110101T190000Z
220
+ DURATION:PT1H
221
+ END:VEVENT
222
+ END:VCALENDAR
223
+ ICS
224
+
225
+ assert_free_busy_report(
226
+ 'FREEBUSY:20110101T190000Z/20110101T200000Z',
227
+ blob
228
+ )
229
+ end
230
+
231
+ # Testing an all-day event
232
+ def test_all_day
233
+ # Day-long event, shows up
234
+ blob = <<ICS
235
+ BEGIN:VCALENDAR
236
+ BEGIN:VEVENT
237
+ UID:foobar9
238
+ DTSTART;VALUE=DATE:20110102
239
+ END:VEVENT
240
+ END:VCALENDAR
241
+ ICS
242
+
243
+ assert_free_busy_report(
244
+ 'FREEBUSY:20110102T000000Z/20110103T000000Z',
245
+ blob
246
+ )
247
+ end
248
+
249
+ # Testing an event that has no end or duration.
250
+ def test_no_duration
251
+ # No duration, does not show up
252
+ blob = <<ICS
253
+ BEGIN:VCALENDAR
254
+ BEGIN:VEVENT
255
+ UID:foobar10
256
+ DTSTART:20110101T200000Z
257
+ END:VEVENT
258
+ END:VCALENDAR
259
+ ICS
260
+
261
+ assert_free_busy_report(
262
+ '',
263
+ blob
264
+ )
265
+ end
266
+
267
+ # Testing feeding the freebusy generator an object instead of a string.
268
+ def test_object
269
+ # encoded as object, shows up
270
+ blob = <<ICS
271
+ BEGIN:VCALENDAR
272
+ BEGIN:VEVENT
273
+ UID:foobar11
274
+ DTSTART:20110101T210000Z
275
+ DURATION:PT1H
276
+ END:VEVENT
277
+ END:VCALENDAR
278
+ ICS
279
+
280
+ assert_free_busy_report(
281
+ 'FREEBUSY:20110101T210000Z/20110101T220000Z',
282
+ Tilia::VObject::Reader.read(blob)
283
+ )
284
+ end
285
+
286
+ # Testing feeding VFREEBUSY objects instead of VEVENT
287
+ def test_v_free_busy
288
+ # Freebusy. Some parts show up
289
+ blob = <<ICS
290
+ BEGIN:VCALENDAR
291
+ BEGIN:VFREEBUSY
292
+ FREEBUSY:20110103T010000Z/20110103T020000Z
293
+ FREEBUSY;FBTYPE=FREE:20110103T020000Z/20110103T030000Z
294
+ FREEBUSY:20110103T030000Z/20110103T040000Z,20110103T040000Z/20110103T050000Z
295
+ FREEBUSY:20120101T000000Z/20120101T010000Z
296
+ FREEBUSY:20110103T050000Z/PT1H
297
+ END:VFREEBUSY
298
+ END:VCALENDAR
299
+ ICS
300
+
301
+ assert_free_busy_report(
302
+ "FREEBUSY:20110103T010000Z/20110103T020000Z\n" \
303
+ 'FREEBUSY:20110103T030000Z/20110103T060000Z',
304
+ blob
305
+ )
306
+ end
307
+
308
+ def test_yearly_recurrence
309
+ # Yearly recurrence rule, shows up
310
+ blob = <<ICS
311
+ BEGIN:VCALENDAR
312
+ BEGIN:VEVENT
313
+ UID:foobar13
314
+ DTSTART:20100101T220000Z
315
+ DTEND:20100101T230000Z
316
+ RRULE:FREQ=YEARLY
317
+ END:VEVENT
318
+ END:VCALENDAR
319
+ ICS
320
+
321
+ assert_free_busy_report(
322
+ 'FREEBUSY:20110101T220000Z/20110101T230000Z',
323
+ blob
324
+ )
325
+ end
326
+
327
+ def test_yearly_recurrence_duration
328
+ # Yearly recurrence rule + duration, shows up
329
+ blob = <<ICS
330
+ BEGIN:VCALENDAR
331
+ BEGIN:VEVENT
332
+ UID:foobar14
333
+ DTSTART:20100101T230000Z
334
+ DURATION:PT1H
335
+ RRULE:FREQ=YEARLY
336
+ END:VEVENT
337
+ END:VCALENDAR
338
+ ICS
339
+
340
+ assert_free_busy_report(
341
+ 'FREEBUSY:20110101T230000Z/20110102T000000Z',
342
+ blob
343
+ )
344
+ end
345
+
346
+ def test_floating_time
347
+ # Floating time, no timezone
348
+ blob = <<ICS
349
+ BEGIN:VCALENDAR
350
+ BEGIN:VEVENT
351
+ UID:foobar
352
+ DTSTART:20110101T120000
353
+ DTEND:20110101T130000
354
+ END:VEVENT
355
+ END:VCALENDAR
356
+ ICS
357
+
358
+ assert_free_busy_report(
359
+ 'FREEBUSY:20110101T120000Z/20110101T130000Z',
360
+ blob
361
+ )
362
+ end
363
+
364
+ def test_floating_time_reference_time_zone
365
+ # Floating time + reference timezone
366
+ blob = <<ICS
367
+ BEGIN:VCALENDAR
368
+ BEGIN:VEVENT
369
+ UID:foobar
370
+ DTSTART:20110101T120000
371
+ DTEND:20110101T130000
372
+ END:VEVENT
373
+ END:VCALENDAR
374
+ ICS
375
+
376
+ assert_free_busy_report(
377
+ 'FREEBUSY:20110101T170000Z/20110101T180000Z',
378
+ blob,
379
+ ActiveSupport::TimeZone.new('America/Toronto')
380
+ )
381
+ end
382
+
383
+ def test_all_day2
384
+ # All-day event, slightly outside of the VFREEBUSY range.
385
+ blob = <<ICS
386
+ BEGIN:VCALENDAR
387
+ BEGIN:VEVENT
388
+ UID:foobar
389
+ DTSTART;VALUE=DATE:20110101
390
+ END:VEVENT
391
+ END:VCALENDAR
392
+ ICS
393
+
394
+ assert_free_busy_report(
395
+ 'FREEBUSY:20110101T110000Z/20110102T000000Z',
396
+ blob
397
+ )
398
+ end
399
+
400
+ def test_all_day_reference_time_zone
401
+ # All-day event + reference timezone
402
+ blob = <<ICS
403
+ BEGIN:VCALENDAR
404
+ BEGIN:VEVENT
405
+ UID:foobar
406
+ DTSTART;VALUE=DATE:20110101
407
+ END:VEVENT
408
+ END:VCALENDAR
409
+ ICS
410
+
411
+ assert_free_busy_report(
412
+ 'FREEBUSY:20110101T110000Z/20110102T050000Z',
413
+ blob,
414
+ ActiveSupport::TimeZone.new('America/Toronto')
415
+ )
416
+ end
417
+
418
+ def test_no_valid_instances
419
+ # Recurrence rule with no valid instances
420
+ blob = <<ICS
421
+ BEGIN:VCALENDAR
422
+ BEGIN:VEVENT
423
+ UID:foobar
424
+ DTSTART:20110101T100000Z
425
+ DTEND:20110103T120000Z
426
+ RRULE:FREQ=WEEKLY;COUNT=1
427
+ EXDATE:20110101T100000Z
428
+ END:VEVENT
429
+ END:VCALENDAR
430
+ ICS
431
+
432
+ assert_free_busy_report(
433
+ '',
434
+ blob
435
+ )
436
+ end
437
+
438
+ # This VAVAILABILITY object overlaps with the time-range, but we're just
439
+ # busy the entire time.
440
+ def test_v_availability_simple
441
+ blob = <<ICS
442
+ BEGIN:VCALENDAR
443
+ BEGIN:VEVENT
444
+ UID:lalala
445
+ DTSTART:20110101T120000Z
446
+ DTEND:20110101T130000Z
447
+ END:VEVENT
448
+ END:VCALENDAR
449
+ ICS
450
+
451
+ vavail = <<ICS
452
+ BEGIN:VCALENDAR
453
+ BEGIN:VAVAILABILITY
454
+ DTSTART:20110101T000000Z
455
+ DTEND:20120101T000000Z
456
+ BEGIN:AVAILABLE
457
+ DTSTART:20110101T000000Z
458
+ DTEND:20110101T010000Z
459
+ END:AVAILABLE
460
+ END:VAVAILABILITY
461
+ END:VCALENDAR
462
+ ICS
463
+
464
+ assert_free_busy_report(
465
+ "FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20110101T110000Z/20110101T120000Z\n" \
466
+ "FREEBUSY:20110101T120000Z/20110101T130000Z\n" \
467
+ 'FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20110101T130000Z/20110103T110000Z',
468
+ blob,
469
+ nil,
470
+ vavail
471
+ )
472
+ end
473
+
474
+ # This VAVAILABILITY object does not overlap at all with the freebusy
475
+ # report, so it should be ignored.
476
+ def test_v_availability_irrelevant
477
+ blob = <<ICS
478
+ BEGIN:VCALENDAR
479
+ BEGIN:VEVENT
480
+ UID:lalala
481
+ DTSTART:20110101T120000Z
482
+ DTEND:20110101T130000Z
483
+ END:VEVENT
484
+ END:VCALENDAR
485
+ ICS
486
+
487
+ vavail = <<ICS
488
+ BEGIN:VCALENDAR
489
+ BEGIN:VAVAILABILITY
490
+ DTSTART:20150101T000000Z
491
+ DTEND:20160101T000000Z
492
+ BEGIN:AVAILABLE
493
+ DTSTART:20150101T000000Z
494
+ DTEND:20150101T010000Z
495
+ END:AVAILABLE
496
+ END:VAVAILABILITY
497
+ END:VCALENDAR
498
+ ICS
499
+
500
+ assert_free_busy_report(
501
+ 'FREEBUSY:20110101T120000Z/20110101T130000Z',
502
+ blob,
503
+ nil,
504
+ vavail
505
+ )
506
+ end
507
+
508
+ # This VAVAILABILITY object has a 9am-5pm AVAILABLE object for office
509
+ # hours.
510
+ def test_v_availability_office_hours
511
+ blob = <<ICS
512
+ BEGIN:VCALENDAR
513
+ BEGIN:VEVENT
514
+ UID:lalala
515
+ DTSTART:20110101T120000Z
516
+ DTEND:20110101T130000Z
517
+ END:VEVENT
518
+ END:VCALENDAR
519
+ ICS
520
+
521
+ vavail = <<ICS
522
+ BEGIN:VCALENDAR
523
+ BEGIN:VAVAILABILITY
524
+ DTSTART:20100101T000000Z
525
+ DTEND:20120101T000000Z
526
+ BUSYTYPE:BUSY-TENTATIVE
527
+ BEGIN:AVAILABLE
528
+ DTSTART:20101213T090000Z
529
+ DTEND:20101213T170000Z
530
+ RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
531
+ END:AVAILABLE
532
+ END:VAVAILABILITY
533
+ END:VCALENDAR
534
+ ICS
535
+
536
+ assert_free_busy_report(
537
+ "FREEBUSY;FBTYPE=BUSY-TENTATIVE:20110101T110000Z/20110101T120000Z\n" \
538
+ "FREEBUSY:20110101T120000Z/20110101T130000Z\n" \
539
+ "FREEBUSY;FBTYPE=BUSY-TENTATIVE:20110101T130000Z/20110103T090000Z\n",
540
+ blob,
541
+ nil,
542
+ vavail
543
+ )
544
+ end
545
+
546
+ # This test has the same office hours, but has a vacation blocked off for
547
+ # the relevant time, using a higher priority. (lower number).
548
+ def test_v_availability_office_hours_vacation
549
+ blob = <<ICS
550
+ BEGIN:VCALENDAR
551
+ BEGIN:VEVENT
552
+ UID:lalala
553
+ DTSTART:20110101T120000Z
554
+ DTEND:20110101T130000Z
555
+ END:VEVENT
556
+ END:VCALENDAR
557
+ ICS
558
+
559
+ vavail = <<ICS
560
+ BEGIN:VCALENDAR
561
+ BEGIN:VAVAILABILITY
562
+ DTSTART:20100101T000000Z
563
+ DTEND:20120101T000000Z
564
+ BUSYTYPE:BUSY-TENTATIVE
565
+ PRIORITY:2
566
+ BEGIN:AVAILABLE
567
+ DTSTART:20101213T090000Z
568
+ DTEND:20101213T170000Z
569
+ RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
570
+ END:AVAILABLE
571
+ END:VAVAILABILITY
572
+ BEGIN:VAVAILABILITY
573
+ PRIORITY:1
574
+ DTSTART:20101214T000000Z
575
+ DTEND:20110107T000000Z
576
+ BUSYTYPE:BUSY
577
+ END:VAVAILABILITY
578
+ END:VCALENDAR
579
+ ICS
580
+
581
+ assert_free_busy_report(
582
+ 'FREEBUSY:20110101T110000Z/20110103T110000Z',
583
+ blob,
584
+ nil,
585
+ vavail
586
+ )
587
+ end
588
+
589
+ # This test has the same input as the last, except somebody mixed up the
590
+ # PRIORITY values.
591
+ #
592
+ # The end-result is that the vacation VAVAILABILITY is completely ignored.
593
+ def test_v_availability_office_hours_vacation2
594
+ blob = <<ICS
595
+ BEGIN:VCALENDAR
596
+ BEGIN:VEVENT
597
+ UID:lalala
598
+ DTSTART:20110101T120000Z
599
+ DTEND:20110101T130000Z
600
+ END:VEVENT
601
+ END:VCALENDAR
602
+ ICS
603
+
604
+ vavail = <<ICS
605
+ BEGIN:VCALENDAR
606
+ BEGIN:VAVAILABILITY
607
+ DTSTART:20100101T000000Z
608
+ DTEND:20120101T000000Z
609
+ BUSYTYPE:BUSY-TENTATIVE
610
+ PRIORITY:1
611
+ BEGIN:AVAILABLE
612
+ DTSTART:20101213T090000Z
613
+ DTEND:20101213T170000Z
614
+ RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
615
+ END:AVAILABLE
616
+ END:VAVAILABILITY
617
+ BEGIN:VAVAILABILITY
618
+ PRIORITY:2
619
+ DTSTART:20101214T000000Z
620
+ DTEND:20110107T000000Z
621
+ BUSYTYPE:BUSY
622
+ END:VAVAILABILITY
623
+ END:VCALENDAR
624
+ ICS
625
+
626
+ assert_free_busy_report(
627
+ "FREEBUSY;FBTYPE=BUSY-TENTATIVE:20110101T110000Z/20110101T120000Z\n" \
628
+ "FREEBUSY:20110101T120000Z/20110101T130000Z\n" \
629
+ "FREEBUSY;FBTYPE=BUSY-TENTATIVE:20110101T130000Z/20110103T090000Z\n",
630
+ blob,
631
+ nil,
632
+ vavail
633
+ )
634
+ end
635
+ end
636
+ end
637
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+
3
+ module Tilia
4
+ module VObject
5
+ # Google produces vcards with a weird escaping of urls.
6
+ #
7
+ # VObject will provide a workaround for this, so end-user still get expected
8
+ # values.
9
+ class GoogleColonEscapingTest < Minitest::Test
10
+ def test_decode
11
+ vcard = <<VCF
12
+ BEGIN:VCARD
13
+ VERSION:3.0
14
+ FN:Evert Pot
15
+ N:Pot;Evert;;;
16
+ EMAIL;TYPE=INTERNET;TYPE=WORK:evert@fruux.com
17
+ BDAY:1985-04-07
18
+ item7.URL:http\://www.rooftopsolutions.nl/
19
+ END:VCARD
20
+ VCF
21
+
22
+ vobj = Tilia::VObject::Reader.read(vcard)
23
+ assert_equal('http://www.rooftopsolutions.nl/', vobj['URL'].value)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+
3
+ module Tilia
4
+ module VObject
5
+ class AttachParseTest < Minitest::Test
6
+ # See issue #128 for more info.
7
+ def test_parse_attach
8
+ vcal = <<ICS
9
+ BEGIN:VCALENDAR
10
+ BEGIN:VEVENT
11
+ ATTACH;FMTTYPE=application/postscript:ftp://example.com/pub/reports/r-960812.ps
12
+ END:VEVENT
13
+ END:VCALENDAR
14
+ ICS
15
+
16
+ vcal = Tilia::VObject::Reader.read(vcal)
17
+ prop = vcal['VEVENT']['ATTACH']
18
+
19
+ assert_kind_of(Tilia::VObject::Property::Uri, prop)
20
+ assert_equal('ftp://example.com/pub/reports/r-960812.ps', prop.value)
21
+ end
22
+ end
23
+ end
24
+ end