Cleanup - unused files / unused exports / duplicate exports
[ProtonMail-WebClient.git] / packages / shared / test / calendar / vcalConverter.spec.js
blob0b2af3215df45711f7c17d04bb885cf58fb6a99e
1 import { buildMailTo } from '@proton/shared/lib/helpers/email';
3 import {
4     dateTimeToProperty,
5     dayToNumericDay,
6     getDateTimePropertyInDifferentTimezone,
7     getHasModifiedDateTimes,
8     getIsEquivalentOrganizer,
9     numericDayToDay,
10     propertyToLocalDate,
11     propertyToUTCDate,
12 } from '../../lib/calendar/vcalConverter';
14 describe('propertyToUTCDate', () => {
15     it('should convert all-day properties to UTC end-of-day times', () => {
16         const property = {
17             value: { year: 2021, month: 7, day: 7 },
18             parameters: { type: 'date' },
19         };
20         expect(+propertyToUTCDate(property)).toEqual(Date.UTC(2021, 6, 7));
21     });
23     it('should convert Zulu date-time properties', () => {
24         const property = {
25             value: { year: 2021, month: 7, day: 7, hours: 7, minutes: 7, seconds: 7, isUTC: true },
26         };
27         expect(+propertyToUTCDate(property)).toEqual(Date.UTC(2021, 6, 7, 7, 7, 7));
28     });
30     it('should convert floating date-time properties to Zulu time', () => {
31         const property = {
32             value: { year: 2021, month: 7, day: 7, hours: 7, minutes: 7, seconds: 7, isUTC: false },
33         };
34         expect(+propertyToUTCDate(property)).toEqual(Date.UTC(2021, 6, 7, 7, 7, 7));
35     });
37     it('should convert localized date-time properties', () => {
38         const property = {
39             value: { year: 2021, month: 7, day: 7, hours: 7, minutes: 7, seconds: 7, isUTC: false },
40             parameters: { tzid: 'Europe/Brussels' },
41         };
42         expect(+propertyToUTCDate(property)).toEqual(Date.UTC(2021, 6, 7, 5, 7, 7));
43     });
44 });
46 describe('propertyToLocalDate', () => {
47     it('should convert all-day properties to local end-of-day times', () => {
48         const property = {
49             value: { year: 2021, month: 7, day: 7 },
50             parameters: { type: 'date' },
51         };
52         expect(+propertyToLocalDate(property)).toEqual(+new Date(2021, 6, 7));
53     });
55     it('should convert Zulu date-time properties', () => {
56         const property = {
57             value: { year: 2021, month: 7, day: 7, hours: 7, minutes: 7, seconds: 7, isUTC: true },
58         };
59         expect(+propertyToLocalDate(property)).toEqual(Date.UTC(2021, 6, 7, 7, 7, 7));
60     });
62     it('should convert floating date-time properties to Zulu time', () => {
63         const property = {
64             value: { year: 2021, month: 7, day: 7, hours: 7, minutes: 7, seconds: 7, isUTC: false },
65         };
66         expect(+propertyToLocalDate(property)).toEqual(Date.UTC(2021, 6, 7, 7, 7, 7));
67     });
69     it('should convert localized date-time properties', () => {
70         const property = {
71             value: { year: 2021, month: 7, day: 7, hours: 7, minutes: 7, seconds: 7, isUTC: false },
72             parameters: { tzid: 'Europe/Brussels' },
73         };
74         expect(+propertyToLocalDate(property)).toEqual(Date.UTC(2021, 6, 7, 5, 7, 7));
75     });
76 });
78 describe('dateTimeToProperty', () => {
79     it('should convert a date with a timezone into a property', () => {
80         const property = dateTimeToProperty(
81             {
82                 year: 2019,
83                 month: 10,
84                 day: 1,
85                 hours: 1,
86                 minutes: 13,
87             },
88             false,
89             'Etc/UTC'
90         );
91         expect(property).toEqual({
92             value: { year: 2019, month: 10, day: 1, hours: 1, minutes: 13, seconds: 0, isUTC: false },
93             parameters: {
94                 tzid: 'Etc/UTC',
95             },
96         });
97     });
99     it('should convert utc time', () => {
100         const property = dateTimeToProperty(
101             {
102                 year: 2019,
103                 month: 10,
104                 day: 1,
105                 hours: 1,
106                 minutes: 13,
107             },
108             true
109         );
110         expect(property).toEqual({
111             value: { year: 2019, month: 10, day: 1, hours: 1, minutes: 13, seconds: 0, isUTC: true },
112         });
113     });
116 describe('day converter', () => {
117     it('should convert from number to day', () => {
118         expect(numericDayToDay(-3)).toEqual('TH');
119         expect(numericDayToDay(-2)).toEqual('FR');
120         expect(numericDayToDay(-1)).toEqual('SA');
121         expect(numericDayToDay(0)).toEqual('SU');
122         expect(numericDayToDay(1)).toEqual('MO');
123         expect(numericDayToDay(2)).toEqual('TU');
124         expect(numericDayToDay(3)).toEqual('WE');
125     });
127     it('should convert from day to number', () => {
128         expect(dayToNumericDay('SU')).toEqual(0);
129         expect(dayToNumericDay('MO')).toEqual(1);
130         expect(dayToNumericDay('TU')).toEqual(2);
131         expect(dayToNumericDay('WE')).toEqual(3);
132         expect(dayToNumericDay('TH')).toEqual(4);
133         expect(dayToNumericDay('FR')).toEqual(5);
134         expect(dayToNumericDay('SA')).toEqual(6);
135         expect(dayToNumericDay('su')).toBeUndefined();
136         expect(dayToNumericDay('asd')).toBeUndefined();
137     });
140 describe('getDateTimePropertyInDifferentTimezone', () => {
141     const tzid = 'Pacific/Honolulu';
142     it('should not modify all-day properties', () => {
143         const property = {
144             value: { year: 2020, month: 4, day: 23 },
145             parameters: { type: 'date' },
146         };
147         expect(getDateTimePropertyInDifferentTimezone(property, tzid)).toEqual(property);
148         expect(getDateTimePropertyInDifferentTimezone(property, tzid, true)).toEqual(property);
149     });
151     it('should change the timezone of UTC dates', () => {
152         const property = {
153             value: { year: 2020, month: 4, day: 23, hours: 12, minutes: 30, seconds: 0, isUTC: true },
154         };
155         const expected = {
156             value: { year: 2020, month: 4, day: 23, hours: 2, minutes: 30, seconds: 0, isUTC: false },
157             parameters: { tzid },
158         };
159         expect(getDateTimePropertyInDifferentTimezone(property, tzid)).toEqual(expected);
160     });
162     it('should change the timezone of timezoned dates', () => {
163         const property = {
164             value: { year: 2020, month: 4, day: 23, hours: 12, minutes: 30, seconds: 0, isUTC: false },
165             parameters: { tzid: 'Europe/Zurich' },
166         };
167         const expected = {
168             value: { year: 2020, month: 4, day: 23, hours: 0, minutes: 30, seconds: 0, isUTC: false },
169             parameters: { tzid },
170         };
171         expect(getDateTimePropertyInDifferentTimezone(property, tzid)).toEqual(expected);
172     });
174     it('should return simplified form of UTC dates', () => {
175         const property = {
176             value: { year: 2020, month: 4, day: 23, hours: 12, minutes: 30, seconds: 0, isUTC: false },
177             parameters: { tzid: 'Europe/Zurich' },
178         };
179         const expected = {
180             value: { year: 2020, month: 4, day: 23, hours: 10, minutes: 30, seconds: 0, isUTC: true },
181         };
182         expect(getDateTimePropertyInDifferentTimezone(property, 'UTC')).toEqual(expected);
183     });
186 describe('getHasModifiedDateTimes', () => {
187     it('should detect same times as equal for part-day events', () => {
188         const vevent1 = {
189             dtstart: {
190                 value: { year: 2020, month: 4, day: 23, hours: 12, minutes: 30, seconds: 0, isUTC: false },
191                 parameters: { tzid: 'Europe/Zurich' },
192             },
193             dtend: {
194                 value: { year: 2020, month: 4, day: 23, hours: 12, minutes: 30, seconds: 0, isUTC: false },
195                 parameters: { tzid: 'Europe/Zurich' },
196             },
197         };
198         const vevent2 = {
199             dtstart: {
200                 value: { year: 2020, month: 4, day: 23, hours: 11, minutes: 30, seconds: 0, isUTC: false },
201                 parameters: { tzid: 'Europe/London' },
202             },
203         };
204         expect(getHasModifiedDateTimes(vevent1, vevent2)).toEqual(false);
205     });
207     it('should detect same times as equal for all-day events', () => {
208         const vevent1 = {
209             dtstart: {
210                 value: { year: 2020, month: 4, day: 23 },
211                 parameters: { type: 'date' },
212             },
213             dtend: {
214                 value: { year: 2020, month: 4, day: 24 },
215                 parameters: { type: 'date' },
216             },
217         };
218         const vevent2 = {
219             dtstart: {
220                 value: { year: 2020, month: 4, day: 23 },
221                 parameters: { type: 'date' },
222             },
223         };
224         expect(getHasModifiedDateTimes(vevent1, vevent2)).toEqual(false);
225     });
227     it('should detect different start times as different for part-day events', () => {
228         const vevent1 = {
229             dtstart: {
230                 value: { year: 2020, month: 4, day: 23, hours: 12, minutes: 30, seconds: 0, isUTC: false },
231                 parameters: { tzid: 'Europe/Zurich' },
232             },
233             dtend: {
234                 value: { year: 2020, month: 4, day: 23, hours: 13, minutes: 30, seconds: 0, isUTC: false },
235                 parameters: { tzid: 'Europe/Zurich' },
236             },
237         };
238         const vevent2 = {
239             dtstart: {
240                 value: { year: 2020, month: 4, day: 23, hours: 12, minutes: 30, seconds: 0, isUTC: false },
241                 parameters: { tzid: 'Europe/London' },
242             },
243             dtend: {
244                 value: { year: 2020, month: 4, day: 23, hours: 13, minutes: 30, seconds: 0, isUTC: false },
245                 parameters: { tzid: 'Europe/Zurich' },
246             },
247         };
248         expect(getHasModifiedDateTimes(vevent1, vevent2)).toEqual(true);
249     });
251     it('should detect different end times as different for all-day events', () => {
252         const vevent1 = {
253             dtstart: {
254                 value: { year: 2020, month: 4, day: 23, hours: 12, minutes: 30, seconds: 0, isUTC: false },
255                 parameters: { tzid: 'Europe/Zurich' },
256             },
257             dtend: {
258                 value: { year: 2020, month: 4, day: 23, hours: 12, minutes: 30, seconds: 0, isUTC: false },
259                 parameters: { tzid: 'Europe/Zurich' },
260             },
261         };
262         const vevent2 = {
263             dtstart: {
264                 value: { year: 2020, month: 4, day: 23, hours: 11, minutes: 30, seconds: 0, isUTC: false },
265                 parameters: { tzid: 'Europe/London' },
266             },
267             dtend: {
268                 value: { year: 2020, month: 4, day: 23, hours: 13, minutes: 30, seconds: 0, isUTC: false },
269                 parameters: { tzid: 'Europe/Zurich' },
270             },
271         };
272         expect(getHasModifiedDateTimes(vevent1, vevent2)).toEqual(true);
273     });
275     it('should detect different start times as different for all-day events', () => {
276         const vevent1 = {
277             dtstart: {
278                 value: { year: 2020, month: 4, day: 21 },
279                 parameters: { type: 'date' },
280             },
281             dtend: {
282                 value: { year: 2020, month: 4, day: 24 },
283                 parameters: { type: 'date' },
284             },
285         };
286         const vevent2 = {
287             dtstart: {
288                 value: { year: 2020, month: 4, day: 22 },
289                 parameters: { type: 'date' },
290             },
291             dtend: {
292                 value: { year: 2020, month: 4, day: 24 },
293                 parameters: { type: 'date' },
294             },
295         };
296         expect(getHasModifiedDateTimes(vevent1, vevent2)).toEqual(true);
297     });
299     it('should detect different end times as different for all-day events', () => {
300         const vevent1 = {
301             dtstart: {
302                 value: { year: 2020, month: 4, day: 21 },
303                 parameters: { type: 'date' },
304             },
305         };
306         const vevent2 = {
307             dtstart: {
308                 value: { year: 2020, month: 4, day: 21 },
309                 parameters: { type: 'date' },
310             },
311             dtend: {
312                 value: { year: 2020, month: 4, day: 24 },
313                 parameters: { type: 'date' },
314             },
315         };
316         expect(getHasModifiedDateTimes(vevent1, vevent2)).toEqual(true);
317     });
320 describe('getHasEquivalentOrganizer', () => {
321     it('should return true for organizers that only differ by email property (but have same mailto value)', () => {
322         expect(
323             getIsEquivalentOrganizer(
324                 {
325                     value: buildMailTo('organizer@proton.me'),
326                     parameters: {
327                         cn: 'ORGO',
328                         email: 'one',
329                     },
330                 },
331                 {
332                     value: buildMailTo('organizer@proton.me'),
333                     parameters: {
334                         cn: 'ORGO',
335                         email: 'two',
336                     },
337                 }
338             )
339         ).toEqual(true);
340     });
342     it('should return false for organizers whose emails differ by canonicalization', () => {
343         expect(
344             getIsEquivalentOrganizer(
345                 {
346                     value: buildMailTo('organizer@proton.me'),
347                     parameters: {
348                         cn: 'ORGO',
349                     },
350                 },
351                 {
352                     value: buildMailTo('Organizer@proton.me'),
353                     parameters: {
354                         cn: 'ORGO',
355                     },
356                 }
357             )
358         ).toEqual(false);
359     });
361     it('should return false for organizers that only differ by cn property', () => {
362         expect(
363             getIsEquivalentOrganizer(
364                 {
365                     value: buildMailTo('organizer@proton.me'),
366                     parameters: {
367                         cn: 'ORGO',
368                     },
369                 },
370                 {
371                     value: buildMailTo('organizer@proton.me'),
372                     parameters: {
373                         cn: 'orgo',
374                     },
375                 }
376             )
377         ).toEqual(false);
378     });