Remove client-side isLoggedIn value
[ProtonMail-WebClient.git] / packages / shared / test / calendar / getFrequencyString.spec.js
blob53dd8490a20c2712549ab881257a3b72e0f3c25f
1 import { enUS } from 'date-fns/locale';
3 import { FREQUENCY } from '../../lib/calendar/constants';
4 import { getTimezonedFrequencyString } from '../../lib/calendar/recurrence/getFrequencyString';
5 import { getDateTimeProperty, getUntilProperty } from '../../lib/calendar/vcalConverter';
6 import { getFormattedWeekdays } from '../../lib/date/date';
8 const weekdays = getFormattedWeekdays('cccc', { locale: enUS });
9 const dummyTzid = 'Europe/Athens';
10 const options = { currentTzid: dummyTzid, weekdays, locale: enUS };
11 const dummyStart = getDateTimeProperty({ year: 2020, month: 1, day: 20 }, dummyTzid);
12 const dummyUntil = getUntilProperty({ year: 2020, month: 2, day: 20 }, false, dummyTzid);
13 const dummyRruleValue = {
14     freq: FREQUENCY.DAILY,
16 const getRrule = (value) => ({ value: { ...dummyRruleValue, ...value } });
17 const otherTzOptions = { ...options, currentTzid: 'Pacific/Tahiti' };
19 describe('getTimezonedFrequencyString should produce the expected string for daily recurring events', () => {
20     it('should get a standard daily recurring event', () => {
21         expect(getTimezonedFrequencyString(getRrule(dummyRruleValue), dummyStart, options)).toEqual('Daily');
22     });
24     it('should get a custom daily recurring event that is actually standard', () => {
25         const rrule = getRrule();
26         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Daily');
27     });
29     it('should get a custom daily recurring event happening every 2 days', () => {
30         const rrule = getRrule({
31             interval: 2,
32         });
33         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Every 2 days');
34     });
36     it('should get a custom daily recurring event happening every three days, lasting 5 times', () => {
37         const rrule = getRrule({
38             interval: 3,
39             count: 5,
40         });
41         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Every 3 days, 5 times');
42     });
44     it('should get a custom daily recurring event, until 20th February 2020', () => {
45         const rrule = getRrule({
46             until: dummyUntil,
47         });
48         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Daily, until Feb 20, 2020');
49     });
51     it('should get a custom daily recurring event happening every two days, lasting 1 time on a different timezone', () => {
52         const rrule = getRrule({
53             interval: 2,
54             count: 1,
55         });
56         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Every 2 days, 1 time');
57     });
59     it('should get a custom daily event, until 20th February 2020 on a different timezone', () => {
60         const rrule = getRrule({
61             until: dummyUntil,
62         });
63         expect(getTimezonedFrequencyString(rrule, dummyStart, otherTzOptions)).toEqual(
64             'Daily, until Feb 20, 2020 (Europe/Athens)'
65         );
66     });
68     it('should get a custom daily event happening every two days, until 20th February 2020 on a different timezone', () => {
69         const rrule = getRrule({
70             interval: 2,
71             until: dummyUntil,
72         });
73         const extendedOptions = otherTzOptions;
74         expect(getTimezonedFrequencyString(rrule, dummyStart, extendedOptions)).toEqual(
75             'Every 2 days, until Feb 20, 2020 (Europe/Athens)'
76         );
77     });
78 });
80 describe('getTimezonedFrequencyString should produce the expected string for weekly recurring events', () => {
81     const getWeeklyRrule = (rrule) => getRrule({ ...rrule, freq: FREQUENCY.WEEKLY });
83     it('should get a standard weekly recurring event', () => {
84         const rrule = getWeeklyRrule();
85         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Weekly on Monday');
86     });
88     it('should get a standard weekly recurring event, on a different timezone', () => {
89         const rrule = getWeeklyRrule();
90         expect(getTimezonedFrequencyString(rrule, dummyStart, otherTzOptions)).toEqual(
91             'Weekly on Monday (Europe/Athens)'
92         );
93     });
95     it('should get a custom weekly recurring event that is actually standard', () => {
96         const rrule = getWeeklyRrule({
97             byday: ['MO'],
98         });
99         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Weekly on Monday');
100     });
102     it('should get a custom weekly recurring event happening every 2 weeks', () => {
103         const rrule = getWeeklyRrule({
104             interval: 2,
105             byday: ['MO'],
106         });
107         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Every 2 weeks on Monday');
108     });
110     it('should get a custom weekly recurring event happening every 2 weeks, on Monday and Tuesday, lasting 1 time', () => {
111         const rrule = getWeeklyRrule({
112             interval: 2,
113             byday: ['MO', 'TU'],
114             count: 1,
115         });
116         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual(
117             'Every 2 weeks on Monday, Tuesday, 1 time'
118         );
119     });
121     it('should get a custom weekly recurring event happening on all days of the week', () => {
122         const rrule = getWeeklyRrule({
123             interval: 1,
124             byday: ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'],
125         });
126         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Weekly on all days');
127     });
129     it('should get a custom weekly recurring event happening every three weeks, on all days of the week, lasting 5 times', () => {
130         const rrule = getWeeklyRrule({
131             interval: 3,
132             byday: ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'],
133             count: 5,
134         });
135         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Every 3 weeks on all days, 5 times');
136     });
138     it('should get a weekly rrule with an until date in a different timezone', () => {
139         const tzid = 'America/Kentucky/Louisville';
140         const rrule = getWeeklyRrule({
141             interval: 1,
142             byday: ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'],
143             until: getUntilProperty({ year: 2020, month: 10, day: 17 }, false, tzid),
144         });
145         const start = getDateTimeProperty({ year: 2020, month: 1, day: 20 }, tzid);
146         expect(getTimezonedFrequencyString(rrule, start, options)).toEqual(
147             'Weekly on all days, until Oct 17, 2020 (America/Kentucky/Louisville)'
148         );
149     });
151     it('should get a custom weekly recurring event happening every three weeks, on all days of the week, until 20th February 2020', () => {
152         const rrule = getWeeklyRrule({
153             interval: 3,
154             byday: ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'],
155             until: dummyUntil,
156         });
157         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual(
158             'Every 3 weeks on all days, until Feb 20, 2020'
159         );
160     });
162     it('should get a custom weekly recurring event happening on Monday and Wednesday, until 20th February 2020', () => {
163         const rrule = getWeeklyRrule({
164             byday: ['MO', 'WE'],
165             until: dummyUntil,
166         });
167         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual(
168             'Weekly on Monday, Wednesday, until Feb 20, 2020'
169         );
170     });
172     it('should get a custom weekly recurring event happening every 2 weeks on Monday and Wednesday, until 20th February 2020', () => {
173         const rrule = getWeeklyRrule({
174             interval: 2,
175             byday: ['MO', 'WE'],
176             until: dummyUntil,
177         });
178         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual(
179             'Every 2 weeks on Monday, Wednesday, until Feb 20, 2020'
180         );
181     });
183     it('should get a custom weekly recurring event happening weekly on Monday, on a different timezone', () => {
184         const rrule = getWeeklyRrule({
185             interval: 1,
186             byday: ['MO'],
187             until: dummyUntil,
188         });
189         expect(getTimezonedFrequencyString(rrule, dummyStart, { ...options, currentTzid: 'Pacific/Tahiti ' })).toEqual(
190             'Weekly on Monday, until Feb 20, 2020 (Europe/Athens)'
191         );
192     });
194     it('should get a custom weekly recurring event happening every 2 weeks on all days, until 20th February 2020 on a different timezone', () => {
195         const rrule = getWeeklyRrule({
196             interval: 2,
197             byday: ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'],
198             until: dummyUntil,
199         });
200         expect(getTimezonedFrequencyString(rrule, dummyStart, otherTzOptions)).toEqual(
201             'Every 2 weeks on all days, until Feb 20, 2020 (Europe/Athens)'
202         );
203     });
205     it('should get a custom weekly recurring event happening every 2 weeks on all days, 2 times on a different timezone', () => {
206         const rrule = getWeeklyRrule({
207             interval: 2,
208             byday: ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'],
209             count: 2,
210         });
211         expect(getTimezonedFrequencyString(rrule, dummyStart, otherTzOptions)).toEqual(
212             'Every 2 weeks on all days, 2 times'
213         );
214     });
217 describe('getTimezonedFrequencyString should produce the expected string for monthly recurring events', () => {
218     const getMonthlyRrule = (rrule = {}) => getRrule({ ...rrule, freq: FREQUENCY.MONTHLY });
220     it('should get a standard monthly recurring event', () => {
221         expect(getTimezonedFrequencyString(getMonthlyRrule(), dummyStart, options)).toEqual('Monthly on day 20');
222     });
224     it('should get a standard monthly recurring event, on a different timezone', () => {
225         expect(getTimezonedFrequencyString(getMonthlyRrule(), dummyStart, otherTzOptions)).toEqual(
226             'Monthly on day 20 (Europe/Athens)'
227         );
228     });
230     it('should get a custom monthly recurring event happening every 2 months', () => {
231         const rrule = getMonthlyRrule({
232             interval: 2,
233         });
234         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Every 2 months on day 20');
235     });
237     it('should get a custom monthly recurring event happening every 2 months, on the third Monday', () => {
238         const rrule = getMonthlyRrule({
239             interval: 2,
240             bysetpos: 4,
241             byday: 'MO',
242         });
243         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Every 2 months on the third Monday');
244     });
246     it('should get a custom monthly recurring event, on the first Monday, different timezone', () => {
247         const rrule = getMonthlyRrule({
248             bysetpos: 1,
249             byday: 'MO',
250         });
251         const start = getDateTimeProperty({ year: 2020, month: 1, day: 6 }, dummyTzid);
252         expect(getTimezonedFrequencyString(rrule, start, otherTzOptions)).toEqual(
253             'Monthly on the first Monday (Europe/Athens)'
254         );
255     });
257     it('should get a custom monthly recurring event happening every 2 months, on the last Wednesday, lasting 3 times', () => {
258         const start = getDateTimeProperty({ year: 2020, month: 1, day: 29 }, dummyTzid);
259         const rrule = getMonthlyRrule({
260             interval: 2,
261             bysetpos: -1,
262             byday: 'WE',
263             count: 3,
264         });
265         expect(getTimezonedFrequencyString(rrule, start, options)).toEqual(
266             'Every 2 months on the last Wednesday, 3 times'
267         );
268     });
270     it('should get a custom monthly recurring event happening every 2 months, on the last Wednesday, lasting 1 time', () => {
271         const start = getDateTimeProperty({ year: 2020, month: 1, day: 29 }, dummyTzid);
272         const rrule = getMonthlyRrule({
273             interval: 2,
274             bysetpos: -1,
275             byday: 'WE',
276             count: 1,
277         });
278         expect(getTimezonedFrequencyString(rrule, start, options)).toEqual(
279             'Every 2 months on the last Wednesday, 1 time'
280         );
281     });
283     it('should get a custom monthly recurring event happening on a fifth and last Thursday, until 20th February 2020', () => {
284         const start = getDateTimeProperty({ year: 2020, month: 1, day: 30 }, dummyTzid);
285         const rrule = getMonthlyRrule({
286             bysetpos: -1,
287             byday: 'TH',
288             until: dummyUntil,
289         });
290         expect(getTimezonedFrequencyString(rrule, start, options)).toEqual(
291             'Monthly on the last Thursday, until Feb 20, 2020'
292         );
293     });
295     it('should get a custom monthly recurring event happening every three months on a fifth and last Thursday, until 20th February 2020', () => {
296         const start = getDateTimeProperty({ year: 2020, month: 1, day: 30 }, dummyTzid);
297         const rrule = getMonthlyRrule({
298             freq: FREQUENCY.MONTHLY,
299             interval: 3,
300             bysetpos: -1,
301             byday: 'TH',
302             until: dummyUntil,
303         });
304         expect(getTimezonedFrequencyString(rrule, start, options)).toEqual(
305             'Every 3 months on the last Thursday, until Feb 20, 2020'
306         );
307     });
309     it('should get a custom monthly recurring event happening on a fifth and last Thursday, until 20th February 2020 on a different timezone', () => {
310         const start = getDateTimeProperty({ year: 2020, month: 1, day: 30 }, dummyTzid);
311         const rrule = getMonthlyRrule({
312             bysetpos: -1,
313             byday: 'TH',
314             until: dummyUntil,
315         });
316         expect(getTimezonedFrequencyString(rrule, start, otherTzOptions)).toEqual(
317             'Monthly on the last Thursday, until Feb 20, 2020 (Europe/Athens)'
318         );
319     });
322 describe('getTimezonedFrequencyString should produce the expected string for yearly recurring events', () => {
323     const getYearlyRrule = (rrule = {}) => getRrule({ ...rrule, freq: FREQUENCY.YEARLY });
325     it('should get a standard yearly recurring event', () => {
326         expect(getTimezonedFrequencyString(getYearlyRrule(), dummyStart, options)).toEqual('Yearly');
327     });
329     it('should get a custom yearly recurring event happening every 2 years, lasting 1 time', () => {
330         const rrule = getYearlyRrule({
331             interval: 2,
332             count: 1,
333         });
334         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Every 2 years, 1 time');
335     });
337     it('should get a custom yearly recurring event happening every three years, lasting 5 times', () => {
338         const rrule = getYearlyRrule({
339             interval: 3,
340             count: 5,
341         });
342         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Every 3 years, 5 times');
343     });
345     it('should get a custom yearly recurring event, until 20th February 2020', () => {
346         const rrule = getYearlyRrule({
347             interval: 1,
348             until: dummyUntil,
349         });
350         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Yearly, until Feb 20, 2020');
351     });
353     it('should get a custom weekly recurring event happening every year, lasting 8 times on a different timezone', () => {
354         const rrule = getYearlyRrule({
355             count: 8,
356         });
357         expect(getTimezonedFrequencyString(rrule, dummyStart, otherTzOptions)).toEqual('Yearly, 8 times');
358     });
360     it('should get a custom weekly recurring event happening every two years, lasting 2 times on a different timezone', () => {
361         const rrule = getYearlyRrule({
362             interval: 2,
363             count: 2,
364         });
365         expect(getTimezonedFrequencyString(rrule, dummyStart, otherTzOptions)).toEqual('Every 2 years, 2 times');
366     });
368     it('should get a custom yearly event, until 20th February 2020 on a different timezone', () => {
369         const rrule = getYearlyRrule({
370             until: dummyUntil,
371         });
372         expect(getTimezonedFrequencyString(rrule, dummyStart, otherTzOptions)).toEqual(
373             'Yearly, until Feb 20, 2020 (Europe/Athens)'
374         );
375     });
377     it('should get a custom yearly event happening every ten years until 20th February 2020 on a different timezone', () => {
378         const rrule = getYearlyRrule({
379             interval: 10,
380             until: dummyUntil,
381         });
382         expect(getTimezonedFrequencyString(rrule, dummyStart, otherTzOptions)).toEqual(
383             'Every 10 years, until Feb 20, 2020 (Europe/Athens)'
384         );
385     });
388 describe('getTimezonedFrequencyString should produce the expected string for unsupported recurring rules', () => {
389     const getCustomRrule = (rrule) => getRrule({ ...rrule, x: 'test' });
390     it('should get a non-supported daily recurring event', () => {
391         const rrule = getCustomRrule({
392             freq: FREQUENCY.DAILY,
393         });
394         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Custom daily');
395     });
397     it('shold get a non-supported weekly recurring event', () => {
398         const rrule = getCustomRrule({
399             freq: FREQUENCY.WEEKLY,
400         });
401         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Custom weekly');
402     });
404     it('should get a non-supported monthly recurring event', () => {
405         const rrule = getCustomRrule({
406             freq: FREQUENCY.MONTHLY,
407         });
408         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Custom monthly');
409     });
411     it('should geta non-supported yearly recurring event', () => {
412         const rrule = getCustomRrule({
413             freq: FREQUENCY.YEARLY,
414         });
415         expect(getTimezonedFrequencyString(rrule, dummyStart, options)).toEqual('Custom yearly');
416     });