11import { parse } from '../../lib/calendar/vcal' ;
22import { getOccurencesBetween } from '../../lib/calendar/recurring' ;
33
4+ const stringifyResult = ( result ) => {
5+ return result . map ( ( { utcStart, utcEnd, occurrenceNumber } ) => {
6+ return `${ utcStart . toISOString ( ) } - ${ utcEnd . toISOString ( ) } | ${ occurrenceNumber } ` ;
7+ } ) ;
8+ } ;
9+
10+ const stringifyResultFull = ( result ) => {
11+ return result . map ( ( { localStart, localEnd, utcStart, utcEnd, occurrenceNumber } ) => {
12+ return `${ localStart . toISOString ( ) } - ${ localEnd . toISOString ( ) } | ${ utcStart . toISOString ( ) } - ${ utcEnd . toISOString ( ) } | ${ occurrenceNumber } ` ;
13+ } ) ;
14+ } ;
15+
16+ const stringifyResultSimple = ( result ) => {
17+ return result . map ( ( { utcStart, utcEnd } ) => {
18+ return `${ utcStart . toISOString ( ) } - ${ utcEnd . toISOString ( ) } ` ;
19+ } ) ;
20+ } ;
21+
422describe ( 'recurring' , ( ) => {
523 const component = {
624 dtstart : {
@@ -32,12 +50,7 @@ describe('recurring', () => {
3250 it ( 'should get initial occurrences between a range' , ( ) => {
3351 const result = getOccurencesBetween ( component , Date . UTC ( 2018 , 1 , 1 ) , Date . UTC ( 2019 , 1 , 3 ) ) ;
3452
35- expect (
36- result . map (
37- ( [ start , end , occurrenceNumber ] ) =>
38- `${ new Date ( start ) . toISOString ( ) } - ${ new Date ( end ) . toISOString ( ) } | ${ occurrenceNumber } `
39- )
40- ) . toEqual ( [
53+ expect ( stringifyResult ( result ) ) . toEqual ( [
4154 '2019-01-30T01:30:00.000Z - 2019-01-30T02:30:00.000Z | 1' ,
4255 '2019-01-31T01:30:00.000Z - 2019-01-31T02:30:00.000Z | 2' ,
4356 '2019-02-01T01:30:00.000Z - 2019-02-01T02:30:00.000Z | 3' ,
@@ -48,12 +61,7 @@ describe('recurring', () => {
4861 it ( 'should get occurrences between a range' , ( ) => {
4962 const result = getOccurencesBetween ( component , Date . UTC ( 2019 , 2 , 1 ) , Date . UTC ( 2019 , 2 , 3 ) ) ;
5063
51- expect (
52- result . map (
53- ( [ start , end , occurrenceNumber ] ) =>
54- `${ new Date ( start ) . toISOString ( ) } - ${ new Date ( end ) . toISOString ( ) } | ${ occurrenceNumber } `
55- )
56- ) . toEqual ( [
64+ expect ( stringifyResult ( result ) ) . toEqual ( [
5765 '2019-03-01T01:30:00.000Z - 2019-03-01T02:30:00.000Z | 31' ,
5866 '2019-03-02T01:30:00.000Z - 2019-03-02T02:30:00.000Z | 32'
5967 ] ) ;
@@ -62,12 +70,10 @@ describe('recurring', () => {
6270 it ( 'should get occurrences between a dst range' , ( ) => {
6371 const result = getOccurencesBetween ( component , Date . UTC ( 2019 , 9 , 26 ) , Date . UTC ( 2019 , 9 , 29 ) ) ;
6472
65- expect (
66- result . map ( ( [ start , end ] ) => `${ new Date ( start ) . toISOString ( ) } - ${ new Date ( end ) . toISOString ( ) } ` )
67- ) . toEqual ( [
68- '2019-10-26T00:30:00.000Z - 2019-10-26T01:30:00.000Z' ,
69- '2019-10-27T01:30:00.000Z - 2019-10-27T02:30:00.000Z' ,
70- '2019-10-28T01:30:00.000Z - 2019-10-28T02:30:00.000Z'
73+ expect ( stringifyResultFull ( result ) ) . toEqual ( [
74+ '2019-10-26T02:30:00.000Z - 2019-10-26T03:30:00.000Z | 2019-10-26T00:30:00.000Z - 2019-10-26T01:30:00.000Z | 270' ,
75+ '2019-10-27T02:30:00.000Z - 2019-10-27T03:30:00.000Z | 2019-10-27T01:30:00.000Z - 2019-10-27T02:30:00.000Z | 271' ,
76+ '2019-10-28T02:30:00.000Z - 2019-10-28T03:30:00.000Z | 2019-10-28T01:30:00.000Z - 2019-10-28T02:30:00.000Z | 272'
7177 ] ) ;
7278 } ) ;
7379
@@ -82,12 +88,7 @@ describe('recurring', () => {
8288 const cache = { } ;
8389 const result1 = getOccurencesBetween ( component , Date . UTC ( 2019 , 2 , 1 ) , Date . UTC ( 2019 , 2 , 3 ) , cache ) ;
8490 const result2 = getOccurencesBetween ( component , Date . UTC ( 2031 , 2 , 1 ) , Date . UTC ( 2031 , 2 , 3 ) , cache ) ;
85- expect (
86- result2 . map (
87- ( [ start , end , occurrenceNumber ] ) =>
88- `${ new Date ( start ) . toISOString ( ) } - ${ new Date ( end ) . toISOString ( ) } | ${ occurrenceNumber } `
89- )
90- ) . toEqual ( [
91+ expect ( stringifyResult ( result2 ) ) . toEqual ( [
9192 '2031-03-01T01:30:00.000Z - 2031-03-01T02:30:00.000Z | 4414' ,
9293 '2031-03-02T01:30:00.000Z - 2031-03-02T02:30:00.000Z | 4415'
9394 ] ) ;
@@ -102,9 +103,7 @@ RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TU,WE,TH,FR,SA;COUNT=3
102103END:VEVENT` ) ;
103104 const cache = { } ;
104105 const result = getOccurencesBetween ( component , Date . UTC ( 2020 , 0 , 1 ) , Date . UTC ( 2020 , 2 , 1 ) , cache ) ;
105- expect (
106- result . map ( ( [ start , end ] ) => `${ new Date ( start ) . toISOString ( ) } - ${ new Date ( end ) . toISOString ( ) } ` )
107- ) . toEqual ( [
106+ expect ( stringifyResultSimple ( result ) ) . toEqual ( [
108107 '2020-01-29T00:00:00.000Z - 2020-01-29T00:00:00.000Z' ,
109108 '2020-01-30T00:00:00.000Z - 2020-01-30T00:00:00.000Z' ,
110109 '2020-01-31T00:00:00.000Z - 2020-01-31T00:00:00.000Z'
@@ -120,9 +119,7 @@ RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TU,WE,TH,FR,SA;UNTIL=20200131
120119END:VEVENT` ) ;
121120 const cache = { } ;
122121 const result = getOccurencesBetween ( component , Date . UTC ( 2020 , 0 , 1 ) , Date . UTC ( 2020 , 2 , 1 ) , cache ) ;
123- expect (
124- result . map ( ( [ start , end ] ) => `${ new Date ( start ) . toISOString ( ) } - ${ new Date ( end ) . toISOString ( ) } ` )
125- ) . toEqual ( [
122+ expect ( stringifyResultSimple ( result ) ) . toEqual ( [
126123 '2020-01-29T00:00:00.000Z - 2020-01-29T00:00:00.000Z' ,
127124 '2020-01-30T00:00:00.000Z - 2020-01-30T00:00:00.000Z' ,
128125 '2020-01-31T00:00:00.000Z - 2020-01-31T00:00:00.000Z'
@@ -138,9 +135,7 @@ RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TU,WE,TH,FR,SA;UNTIL=20200131T235959Z
138135END:VEVENT` ) ;
139136 const cache = { } ;
140137 const result = getOccurencesBetween ( component , Date . UTC ( 2020 , 0 , 1 ) , Date . UTC ( 2020 , 2 , 1 ) , cache ) ;
141- expect (
142- result . map ( ( [ start , end ] ) => `${ new Date ( start ) . toISOString ( ) } - ${ new Date ( end ) . toISOString ( ) } ` )
143- ) . toEqual ( [
138+ expect ( stringifyResultSimple ( result ) ) . toEqual ( [
144139 '2020-01-29T13:00:00.000Z - 2020-01-29T13:30:00.000Z' ,
145140 '2020-01-30T13:00:00.000Z - 2020-01-30T13:30:00.000Z' ,
146141 '2020-01-31T13:00:00.000Z - 2020-01-31T13:30:00.000Z'
@@ -156,9 +151,7 @@ RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TU,WE,TH,FR,SA;UNTIL=20200201T105959Z
156151END:VEVENT` ) ;
157152 const cache = { } ;
158153 const result = getOccurencesBetween ( component , Date . UTC ( 2020 , 0 , 1 ) , Date . UTC ( 2020 , 2 , 1 ) , cache ) ;
159- expect (
160- result . map ( ( [ start , end ] ) => `${ new Date ( start ) . toISOString ( ) } - ${ new Date ( end ) . toISOString ( ) } ` )
161- ) . toEqual ( [
154+ expect ( stringifyResultSimple ( result ) ) . toEqual ( [
162155 '2020-01-29T11:00:00.000Z - 2020-01-29T12:30:00.000Z' ,
163156 '2020-01-30T11:00:00.000Z - 2020-01-30T12:30:00.000Z' ,
164157 '2020-01-31T11:00:00.000Z - 2020-01-31T12:30:00.000Z'
@@ -175,13 +168,71 @@ END:VEVENT
175168` ) ;
176169 const cache = { } ;
177170 const result = getOccurencesBetween ( component , Date . UTC ( 2020 , 0 , 1 ) , Date . UTC ( 2021 , 2 , 1 ) , cache ) ;
178- expect (
179- result . map ( ( [ start , end ] ) => `${ new Date ( start ) . toISOString ( ) } - ${ new Date ( end ) . toISOString ( ) } ` )
180- ) . toEqual ( [
171+ expect ( stringifyResultSimple ( result ) ) . toEqual ( [
181172 '2020-01-26T00:00:00.000Z - 2020-01-26T00:00:00.000Z' ,
182173 '2020-02-01T00:00:00.000Z - 2020-02-01T00:00:00.000Z' ,
183174 '2020-02-02T00:00:00.000Z - 2020-02-02T00:00:00.000Z' ,
184175 '2020-02-08T00:00:00.000Z - 2020-02-08T00:00:00.000Z'
185176 ] ) ;
186177 } ) ;
178+
179+ fit ( 'should fill occurrences for an event with an exdate' , ( ) => {
180+ const component = parse ( `
181+ BEGIN:VEVENT
182+ RRULE:FREQ=DAILY;COUNT=6
183+ DTSTART;TZID=Europe/Zurich:20200309T043000
184+ DTEND;TZID=Europe/Zurich:20200309T063000
185+ EXDATE;TZID=Europe/Zurich:20200311T043000
186+ EXDATE;TZID=Europe/Zurich:20200313T043000
187+ END:VEVENT
188+ ` ) ;
189+ const cache = { } ;
190+ const result = getOccurencesBetween ( component , Date . UTC ( 2020 , 0 , 1 ) , Date . UTC ( 2021 , 4 , 1 ) , cache ) ;
191+ expect ( stringifyResultSimple ( result ) ) . toEqual ( [
192+ '2020-03-09T03:30:00.000Z - 2020-03-09T05:30:00.000Z' ,
193+ '2020-03-10T03:30:00.000Z - 2020-03-10T05:30:00.000Z' ,
194+ '2020-03-12T03:30:00.000Z - 2020-03-12T05:30:00.000Z' ,
195+ '2020-03-14T03:30:00.000Z - 2020-03-14T05:30:00.000Z'
196+ ] ) ;
197+ } ) ;
198+
199+ fit ( 'should fill occurrences for an all day event with an exdate' , ( ) => {
200+ const component = parse ( `
201+ BEGIN:VEVENT
202+ RRULE:FREQ=DAILY;COUNT=6
203+ DTSTART;VALUE=DATE:20200201
204+ DTEND;VALUE=DATE:20200202
205+ EXDATE;VALUE=DATE:20200201
206+ EXDATE;VALUE=DATE:20200202
207+ EXDATE;VALUE=DATE:20200203
208+ END:VEVENT
209+ ` ) ;
210+ const cache = { } ;
211+ const result = getOccurencesBetween ( component , Date . UTC ( 2020 , 0 , 1 ) , Date . UTC ( 2021 , 4 , 1 ) , cache ) ;
212+ expect ( stringifyResultSimple ( result ) ) . toEqual ( [
213+ '2020-02-04T00:00:00.000Z - 2020-02-04T00:00:00.000Z' ,
214+ '2020-02-05T00:00:00.000Z - 2020-02-05T00:00:00.000Z' ,
215+ '2020-02-06T00:00:00.000Z - 2020-02-06T00:00:00.000Z'
216+ ] ) ;
217+ } ) ;
218+
219+ fit ( 'should fill occurrences for a UTC date with an exdate' , ( ) => {
220+ const component = parse ( `
221+ BEGIN:VEVENT
222+ RRULE:FREQ=DAILY;COUNT=6
223+ DTSTART:20200201T030000Z
224+ DTEND:20200201T040000Z
225+ EXDATE:20200202T030000Z
226+ EXDATE:20200203T030000Z
227+ EXDATE:20200204T030000Z
228+ END:VEVENT
229+ ` ) ;
230+ const cache = { } ;
231+ const result = getOccurencesBetween ( component , Date . UTC ( 2020 , 0 , 1 ) , Date . UTC ( 2021 , 4 , 1 ) , cache ) ;
232+ expect ( stringifyResultSimple ( result ) ) . toEqual ( [
233+ '2020-02-01T03:00:00.000Z - 2020-02-01T04:00:00.000Z' ,
234+ '2020-02-05T03:00:00.000Z - 2020-02-05T04:00:00.000Z' ,
235+ '2020-02-06T03:00:00.000Z - 2020-02-06T04:00:00.000Z'
236+ ] ) ;
237+ } ) ;
187238} ) ;
0 commit comments