diff options
Diffstat (limited to '')
-rw-r--r-- | comm/calendar/test/unit/test_ics.js | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/comm/calendar/test/unit/test_ics.js b/comm/calendar/test/unit/test_ics.js new file mode 100644 index 0000000000..e63361fc35 --- /dev/null +++ b/comm/calendar/test/unit/test_ics.js @@ -0,0 +1,235 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var { XPCOMUtils } = ChromeUtils.importESModule("resource://gre/modules/XPCOMUtils.sys.mjs"); + +XPCOMUtils.defineLazyModuleGetters(this, { + CalAttachment: "resource:///modules/CalAttachment.jsm", + CalAttendee: "resource:///modules/CalAttendee.jsm", + CalEvent: "resource:///modules/CalEvent.jsm", + CalRelation: "resource:///modules/CalRelation.jsm", + CalTodo: "resource:///modules/CalTodo.jsm", +}); + +function run_test() { + test_folding(); + test_icalProps(); + test_roundtrip(); + test_duration(); + test_serialize(); +} + +var test_data = [ + { + expectedDateProps: { + month: 10, + day: 25, + year: 2004, + isDate: true, + }, + expectedProps: { + title: "Christmas", + id: "20041119T052239Z-1000472-1-5c0746bb-Oracle", + priority: 0, + status: "CONFIRMED", + }, + ics: + "BEGIN:VCALENDAR\n" + + "PRODID:-//ORACLE//NONSGML CSDK 9.0.5 - CalDAVServlet 9.0.5//EN\n" + + "VERSION:2.0\n" + + "BEGIN:VEVENT\n" + + "UID:20041119T052239Z-1000472-1-5c0746bb-Oracle\n" + + "ORGANIZER;X-ORACLE-GUID=E9359406791C763EE0305794071A39A4;CN=Simon Vaillan\n" + + " court:mailto:simon.vaillancourt@oracle.com\n" + + "SEQUENCE:0\n" + + "DTSTAMP:20041124T010028Z\n" + + "CREATED:20041119T052239Z\n" + + "X-ORACLE-EVENTINSTANCE-GUID:I1+16778354+1+1+438153759\n" + + "X-ORACLE-EVENT-GUID:E1+16778354+1+438153759\n" + + "X-ORACLE-EVENTTYPE:DAY EVENT\n" + + "TRANSP:TRANSPARENT\n" + + "SUMMARY:Christmas\n" + + "STATUS:CONFIRMED\n" + + "PRIORITY:0\n" + + "DTSTART;VALUE=DATE:20041125\n" + + "DTEND;VALUE=DATE:20041125\n" + + "CLASS:PUBLIC\n" + + "ATTENDEE;X-ORACLE-GUID=E92F51FB4A48E91CE0305794071A149C;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=James Stevens;PARTSTAT=NEEDS-ACTION:mailto:james.stevens@o\n" + + " racle.com\n" + + "ATTENDEE;X-ORACLE-GUID=E9359406791C763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=FALSE;CN=Simon Vaillancourt;PARTSTAT=ACCEPTED:mailto:simon.vaillan\n" + + " court@oracle.com\n" + + "ATTENDEE;X-ORACLE-GUID=E9359406791D763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=Bernard Desruisseaux;PARTSTAT=NEEDS-ACTION:mailto:bernard.\n" + + " desruisseaux@oracle.com\n" + + "ATTENDEE;X-ORACLE-GUID=E9359406791E763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=Mario Bonin;PARTSTAT=NEEDS-ACTION:mailto:mario.bonin@oracl\n" + + " e.com\n" + + "ATTENDEE;X-ORACLE-GUID=E9359406791F763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=Jeremy Chone;PARTSTAT=NEEDS-ACTION:mailto:jeremy.chone@ora\n" + + " cle.com\n" + + "ATTENDEE;X-ORACLE-PERSONAL-COMMENT-ISDIRTY=TRUE;X-ORACLE-GUID=E9359406792\n" + + " 0763EE0305794071A39A4;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Mike Shaver;PARTSTA\n" + + " T=NEEDS-ACTION:mailto:mike.x.shaver@oracle.com\n" + + "ATTENDEE;X-ORACLE-GUID=E93594067921763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=David Ball;PARTSTAT=NEEDS-ACTION:mailto:david.ball@oracle.\n" + + " com\n" + + "ATTENDEE;X-ORACLE-GUID=E93594067922763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=Marten Haring;PARTSTAT=NEEDS-ACTION:mailto:marten.den.hari\n" + + " ng@oracle.com\n" + + "ATTENDEE;X-ORACLE-GUID=E93594067923763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=Peter Egyed;PARTSTAT=NEEDS-ACTION:mailto:peter.egyed@oracl\n" + + " e.com\n" + + "ATTENDEE;X-ORACLE-GUID=E93594067924763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=Francois Perrault;PARTSTAT=NEEDS-ACTION:mailto:francois.pe\n" + + " rrault@oracle.com\n" + + "ATTENDEE;X-ORACLE-GUID=E93594067925763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=Vladimir Vukicevic;PARTSTAT=NEEDS-ACTION:mailto:vladimir.v\n" + + " ukicevic@oracle.com\n" + + "ATTENDEE;X-ORACLE-GUID=E93594067926763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=Cyrus Daboo;PARTSTAT=NEEDS-ACTION:mailto:daboo@isamet.com\n" + + "ATTENDEE;X-ORACLE-GUID=E93594067927763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=Lisa Dusseault;PARTSTAT=NEEDS-ACTION:mailto:lisa@osafounda\n" + + " tion.org\n" + + "ATTENDEE;X-ORACLE-GUID=E93594067928763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=Dan Mosedale;PARTSTAT=NEEDS-ACTION:mailto:dan.mosedale@ora\n" + + " cle.com\n" + + "ATTENDEE;X-ORACLE-GUID=E93594067929763EE0305794071A39A4;CUTYPE=INDIVIDUAL\n" + + " ;RSVP=TRUE;CN=Stuart Parmenter;PARTSTAT=NEEDS-ACTION:mailto:stuart.parme\n" + + " nter@oracle.com\n" + + "END:VEVENT\n" + + "END:VCALENDAR\n", + }, + { + expectedProps: { "x-magic": "mymagicstring" }, + ics: + "BEGIN:VEVENT\n" + + "UID:1\n" + + "DTSTART:20070521T100000Z\n" + + "X-MAGIC:mymagicstring\n" + + "END:VEVENT", + }, +]; + +function test_roundtrip() { + function checkEvent(data, event) { + checkRoundtrip(data.expectedProps, event); + + // Checking dates + if ("expectedDateProps" in data) { + checkProps(data.expectedDateProps, event.startDate); + checkProps(data.expectedDateProps, event.endDate); + } + } + + for (let data of test_data) { + // First round, use the icalString setter which uses synchronous parsing + dump("Checking" + data.ics + "\n"); + let event = createEventFromIcalString(data.ics); + checkEvent(data, event); + + // Now, try the same thing with asynchronous parsing. We need a copy of + // the data variable, otherwise javascript will mix the data between + // foreach loop iterations. + do_test_pending(); + let thisdata = data; + cal.icsService.parseICSAsync(data.ics, { + onParsingComplete(rc, rootComp) { + try { + ok(Components.isSuccessCode(rc)); + let event2 = new CalEvent(); + event2.icalComponent = rootComp; + checkEvent(thisdata, event2); + do_test_finished(); + } catch (e) { + do_throw(e + "\n"); + do_test_finished(); + } + }, + }); + } +} + +function test_folding() { + // check folding + const id = + "loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong-id-provoking-folding"; + let todo = new CalTodo(), + todo_ = new CalTodo(); + todo.id = id; + todo_.icalString = todo.icalString; + equal(todo.id, todo_.id); + equal(todo_.icalComponent.getFirstProperty("UID").value, id); +} + +function test_icalProps() { + checkIcalProp("ATTACH", new CalAttachment()); + checkIcalProp("ATTENDEE", new CalAttendee()); + checkIcalProp("RELATED-TO", new CalRelation()); +} + +/* + * Helper functions + */ + +function checkIcalProp(aPropName, aObj) { + let prop1 = cal.icsService.createIcalProperty(aPropName); + let prop2 = cal.icsService.createIcalProperty(aPropName); + prop1.value = "foo"; + prop2.value = "bar"; + prop1.setParameter("X-FOO", "BAR"); + + if (aObj.setParameter) { + aObj.icalProperty = prop1; + equal(aObj.getParameter("X-FOO"), "BAR"); + aObj.icalProperty = prop2; + equal(aObj.getParameter("X-FOO"), null); + } else if (aObj.setProperty) { + aObj.icalProperty = prop1; + equal(aObj.getProperty("X-FOO"), "BAR"); + aObj.icalProperty = prop2; + equal(aObj.getProperty("X-FOO"), null); + } +} + +function checkProps(expectedProps, obj) { + for (let key in expectedProps) { + equal(obj[key], expectedProps[key]); + } +} + +function checkRoundtrip(expectedProps, obj) { + let icsdata = obj.icalString; + for (let key in expectedProps) { + // Need translation + let icskey = key; + switch (key) { + case "id": + icskey = "uid"; + break; + case "title": + icskey = "summary"; + break; + } + ok(icsdata.includes(icskey.toUpperCase())); + ok(icsdata.includes(expectedProps[key])); + } +} + +function test_duration() { + let e = new CalEvent(); + e.startDate = cal.createDateTime(); + e.endDate = null; + equal(e.duration.icalString, "PT0S"); +} + +function test_serialize() { + let e = new CalEvent(); + let prop = cal.icsService.createIcalComponent("VTODO"); + + throws(() => { + e.icalComponent = prop; + }, /Illegal value/); +} |