From 32fda8a4b10a364dc8bfd10686c74afb7a2e8d65 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Mon, 16 Apr 2018 17:50:24 -0500 Subject: [PATCH] Add Apple Reminder and Thunderbird tests --- .../assets/apple/basic_completed.txt | 17 ++ .../assets/apple/basic_due_date.txt | 193 +++++++++++++++++ .../assets/apple/basic_no_due_date.txt | 13 ++ .../assets/apple/priority_high.txt | 16 ++ .../androidTest/assets/apple/priority_low.txt | 16 ++ .../assets/apple/priority_medium.txt | 16 ++ .../assets/apple/priority_none.txt | 15 ++ .../androidTest/assets/apple/repeat_daily.txt | 197 ++++++++++++++++++ .../assets/thunderbird/basic_completed.txt | 16 ++ .../assets/thunderbird/basic_due_date.txt | 29 +++ .../assets/thunderbird/basic_no_due_date.txt | 12 ++ .../assets/thunderbird/priority_high.txt | 13 ++ .../assets/thunderbird/priority_low.txt | 13 ++ .../assets/thunderbird/priority_normal.txt | 13 ++ .../thunderbird/priority_unspecified.txt | 13 ++ .../assets/thunderbird/repeat_daily.txt | 30 +++ .../java/org/tasks/TestUtilities.java | 52 +++++ .../org/tasks/caldav/AppleRemindersTests.java | 88 ++++++++ .../org/tasks/caldav/ThunderbirdTests.java | 95 +++++++++ ...askConverter.java => CaldavConverter.java} | 42 ++-- .../org/tasks/caldav/CaldavSynchronizer.java | 4 +- 21 files changed, 881 insertions(+), 22 deletions(-) create mode 100644 app/src/androidTest/assets/apple/basic_completed.txt create mode 100644 app/src/androidTest/assets/apple/basic_due_date.txt create mode 100644 app/src/androidTest/assets/apple/basic_no_due_date.txt create mode 100644 app/src/androidTest/assets/apple/priority_high.txt create mode 100644 app/src/androidTest/assets/apple/priority_low.txt create mode 100644 app/src/androidTest/assets/apple/priority_medium.txt create mode 100644 app/src/androidTest/assets/apple/priority_none.txt create mode 100644 app/src/androidTest/assets/apple/repeat_daily.txt create mode 100644 app/src/androidTest/assets/thunderbird/basic_completed.txt create mode 100644 app/src/androidTest/assets/thunderbird/basic_due_date.txt create mode 100644 app/src/androidTest/assets/thunderbird/basic_no_due_date.txt create mode 100644 app/src/androidTest/assets/thunderbird/priority_high.txt create mode 100644 app/src/androidTest/assets/thunderbird/priority_low.txt create mode 100644 app/src/androidTest/assets/thunderbird/priority_normal.txt create mode 100644 app/src/androidTest/assets/thunderbird/priority_unspecified.txt create mode 100644 app/src/androidTest/assets/thunderbird/repeat_daily.txt create mode 100644 app/src/androidTest/java/org/tasks/caldav/AppleRemindersTests.java create mode 100644 app/src/androidTest/java/org/tasks/caldav/ThunderbirdTests.java rename app/src/main/java/org/tasks/caldav/{TaskConverter.java => CaldavConverter.java} (82%) diff --git a/app/src/androidTest/assets/apple/basic_completed.txt b/app/src/androidTest/assets/apple/basic_completed.txt new file mode 100644 index 000000000..be2dd3c03 --- /dev/null +++ b/app/src/androidTest/assets/apple/basic_completed.txt @@ -0,0 +1,17 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:-//Apple Inc.//iOS 11.2.6//EN +VERSION:2.0 +BEGIN:VTODO +COMPLETED:20180417T184302Z +CREATED:20180417T184300Z +DTSTAMP:20180417T184304Z +LAST-MODIFIED:20180417T184304Z +PERCENT-COMPLETE:100 +SEQUENCE:0 +STATUS:COMPLETED +SUMMARY:Test +UID:31FC53CE-71A0-4AE1-8371-822B8DC4ECD9 +X-APPLE-SORT-ORDER:545683380 +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/apple/basic_due_date.txt b/app/src/androidTest/assets/apple/basic_due_date.txt new file mode 100644 index 000000000..cc5afa6ce --- /dev/null +++ b/app/src/androidTest/assets/apple/basic_due_date.txt @@ -0,0 +1,193 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Apple Inc.//Mac OS X 10.13.4//EN +CALSCALE:GREGORIAN +BEGIN:VTODO +CREATED:20180416T222650Z +UID:CB8609CD-8345-46CF-8295-4FDA84050CDB +SUMMARY:Test title +DTSTART;TZID=America/Chicago:20180416T180000 +DTSTAMP:20180416T222656Z +SEQUENCE:0 +DUE;TZID=America/Chicago:20180416T180000 +BEGIN:VALARM +X-WR-ALARMUID:31AC3FC5-D6D1-47D1-9B8D-597BD5D097A5 +UID:31AC3FC5-D6D1-47D1-9B8D-597BD5D097A5 +TRIGGER;VALUE=DATE-TIME:20180416T230000Z +DESCRIPTION:Event reminder +ACTION:DISPLAY +END:VALARM +END:VTODO +BEGIN:VTIMEZONE +TZID:America/Chicago +X-LIC-LOCATION:America/Chicago +BEGIN:STANDARD +DTSTART:18831118T120924 +RDATE:18831118T120924 +TZNAME:CST +TZOFFSETFROM:-055036 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19180331T020000 +RRULE:FREQ=YEARLY;UNTIL=19190330T080000Z;BYMONTH=3;BYDAY=-1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19181027T020000 +RRULE:FREQ=YEARLY;UNTIL=19191026T070000Z;BYMONTH=10;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:STANDARD +DTSTART:19200101T000000 +RDATE:19200101T000000 +RDATE:19420101T000000 +RDATE:19460101T000000 +RDATE:19670101T000000 +TZNAME:CST +TZOFFSETFROM:-0600 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19200613T020000 +RDATE:19200613T020000 +RDATE:19210327T020000 +RDATE:19740106T020000 +RDATE:19750223T020000 +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19201031T020000 +RRULE:FREQ=YEARLY;UNTIL=19211030T070000Z;BYMONTH=10;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19220430T020000 +RRULE:FREQ=YEARLY;UNTIL=19350428T080000Z;BYMONTH=4;BYDAY=-1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19220924T020000 +RRULE:FREQ=YEARLY;UNTIL=19350929T070000Z;BYMONTH=9;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:STANDARD +DTSTART:19360301T020000 +RDATE:19360301T020000 +TZNAME:EST +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:STANDARD +BEGIN:STANDARD +DTSTART:19361115T020000 +RDATE:19361115T020000 +RDATE:19450930T020000 +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19370425T020000 +RRULE:FREQ=YEARLY;UNTIL=19410427T080000Z;BYMONTH=4;BYDAY=-1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19370926T020000 +RRULE:FREQ=YEARLY;UNTIL=19410928T070000Z;BYMONTH=9;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19420209T020000 +RDATE:19420209T020000 +TZNAME:CWT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:DAYLIGHT +DTSTART:19450814T180000 +RDATE:19450814T180000 +TZNAME:CPT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:DAYLIGHT +DTSTART:19460428T020000 +RRULE:FREQ=YEARLY;UNTIL=19660424T080000Z;BYMONTH=4;BYDAY=-1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19460929T020000 +RRULE:FREQ=YEARLY;UNTIL=19540926T070000Z;BYMONTH=9;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:STANDARD +DTSTART:19551030T020000 +RRULE:FREQ=YEARLY;UNTIL=19661030T070000Z;BYMONTH=10;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19670430T020000 +RRULE:FREQ=YEARLY;UNTIL=19730429T080000Z;BYMONTH=4;BYDAY=-1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19671029T020000 +RRULE:FREQ=YEARLY;UNTIL=20061029T070000Z;BYMONTH=10;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19760425T020000 +RRULE:FREQ=YEARLY;UNTIL=19860427T080000Z;BYMONTH=4;BYDAY=-1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:DAYLIGHT +DTSTART:19870405T020000 +RRULE:FREQ=YEARLY;UNTIL=20060402T080000Z;BYMONTH=4;BYDAY=1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:DAYLIGHT +DTSTART:20070311T020000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:20071104T020000 +RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +END:VTIMEZONE +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/apple/basic_no_due_date.txt b/app/src/androidTest/assets/apple/basic_no_due_date.txt new file mode 100644 index 000000000..65cfa4701 --- /dev/null +++ b/app/src/androidTest/assets/apple/basic_no_due_date.txt @@ -0,0 +1,13 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Apple Inc.//Mac OS X 10.13.4//EN +CALSCALE:GREGORIAN +BEGIN:VTODO +DTSTAMP:20180416T222430Z +SEQUENCE:0 +DESCRIPTION:Test description +CREATED:20180416T222410Z +SUMMARY:Test title +UID:5C9953DF-7FA0-40B6-92D4-5CDF53B1FB3E +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/apple/priority_high.txt b/app/src/androidTest/assets/apple/priority_high.txt new file mode 100644 index 000000000..5ed79ed16 --- /dev/null +++ b/app/src/androidTest/assets/apple/priority_high.txt @@ -0,0 +1,16 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:-//Apple Inc.//iOS 11.2.6//EN +VERSION:2.0 +BEGIN:VTODO +CREATED:20180417T154347Z +DTSTAMP:20180417T154636Z +LAST-MODIFIED:20180417T154636Z +PRIORITY:1 +SEQUENCE:0 +STATUS:NEEDS-ACTION +SUMMARY:Test +UID:44C59110-221F-4E88-B97B-531D3940920B +X-APPLE-SORT-ORDER:545672627 +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/apple/priority_low.txt b/app/src/androidTest/assets/apple/priority_low.txt new file mode 100644 index 000000000..35f2fcdf9 --- /dev/null +++ b/app/src/androidTest/assets/apple/priority_low.txt @@ -0,0 +1,16 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:-//Apple Inc.//iOS 11.2.6//EN +VERSION:2.0 +BEGIN:VTODO +CREATED:20180417T154347Z +DTSTAMP:20180417T154452Z +LAST-MODIFIED:20180417T154451Z +PRIORITY:9 +SEQUENCE:0 +STATUS:NEEDS-ACTION +SUMMARY:Test +UID:44C59110-221F-4E88-B97B-531D3940920B +X-APPLE-SORT-ORDER:545672627 +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/apple/priority_medium.txt b/app/src/androidTest/assets/apple/priority_medium.txt new file mode 100644 index 000000000..31310549b --- /dev/null +++ b/app/src/androidTest/assets/apple/priority_medium.txt @@ -0,0 +1,16 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:-//Apple Inc.//iOS 11.2.6//EN +VERSION:2.0 +BEGIN:VTODO +CREATED:20180417T154347Z +DTSTAMP:20180417T154600Z +LAST-MODIFIED:20180417T154559Z +PRIORITY:5 +SEQUENCE:0 +STATUS:NEEDS-ACTION +SUMMARY:Test +UID:44C59110-221F-4E88-B97B-531D3940920B +X-APPLE-SORT-ORDER:545672627 +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/apple/priority_none.txt b/app/src/androidTest/assets/apple/priority_none.txt new file mode 100644 index 000000000..7ab47a9ed --- /dev/null +++ b/app/src/androidTest/assets/apple/priority_none.txt @@ -0,0 +1,15 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:-//Apple Inc.//iOS 11.2.6//EN +VERSION:2.0 +BEGIN:VTODO +CREATED:20180417T154347Z +DTSTAMP:20180417T160307Z +LAST-MODIFIED:20180417T160306Z +SEQUENCE:0 +STATUS:NEEDS-ACTION +SUMMARY:Test +UID:44C59110-221F-4E88-B97B-531D3940920B +X-APPLE-SORT-ORDER:545672627 +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/apple/repeat_daily.txt b/app/src/androidTest/assets/apple/repeat_daily.txt new file mode 100644 index 000000000..061d802ba --- /dev/null +++ b/app/src/androidTest/assets/apple/repeat_daily.txt @@ -0,0 +1,197 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:-//Apple Inc.//iOS 11.2.6//EN +VERSION:2.0 +BEGIN:VTODO +CREATED:20180417T185149Z +DTSTAMP:20180417T185203Z +DTSTART;TZID=America/Chicago:20180417T140000 +DUE;TZID=America/Chicago:20180417T140000 +LAST-MODIFIED:20180417T185203Z +RRULE:FREQ=DAILY +SEQUENCE:0 +STATUS:NEEDS-ACTION +SUMMARY:Test daily +UID:A406CCEB-D40E-42F0-BA5F-9D7429618DFB +X-APPLE-SORT-ORDER:545683909 +BEGIN:VALARM +ACTION:DISPLAY +DESCRIPTION:Reminder +TRIGGER;VALUE=DATE-TIME:20180417T190000Z +UID:C87C4AFC-C781-476D-A457-71FBD45AF9E5 +X-WR-ALARMUID:C87C4AFC-C781-476D-A457-71FBD45AF9E5 +END:VALARM +END:VTODO +BEGIN:VTIMEZONE +TZID:America/Chicago +X-LIC-LOCATION:America/Chicago +BEGIN:STANDARD +DTSTART:18831118T120924 +RDATE:18831118T120924 +TZNAME:CST +TZOFFSETFROM:-055036 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19180331T020000 +RRULE:FREQ=YEARLY;UNTIL=19190330T080000Z;BYMONTH=3;BYDAY=-1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19181027T020000 +RRULE:FREQ=YEARLY;UNTIL=19191026T070000Z;BYMONTH=10;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:STANDARD +DTSTART:19200101T000000 +RDATE:19200101T000000 +RDATE:19420101T000000 +RDATE:19460101T000000 +RDATE:19670101T000000 +TZNAME:CST +TZOFFSETFROM:-0600 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19200613T020000 +RDATE:19200613T020000 +RDATE:19210327T020000 +RDATE:19740106T020000 +RDATE:19750223T020000 +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19201031T020000 +RRULE:FREQ=YEARLY;UNTIL=19211030T070000Z;BYMONTH=10;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19220430T020000 +RRULE:FREQ=YEARLY;UNTIL=19350428T080000Z;BYMONTH=4;BYDAY=-1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19220924T020000 +RRULE:FREQ=YEARLY;UNTIL=19350929T070000Z;BYMONTH=9;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:STANDARD +DTSTART:19360301T020000 +RDATE:19360301T020000 +TZNAME:EST +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:STANDARD +BEGIN:STANDARD +DTSTART:19361115T020000 +RDATE:19361115T020000 +RDATE:19450930T020000 +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19370425T020000 +RRULE:FREQ=YEARLY;UNTIL=19410427T080000Z;BYMONTH=4;BYDAY=-1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19370926T020000 +RRULE:FREQ=YEARLY;UNTIL=19410928T070000Z;BYMONTH=9;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19420209T020000 +RDATE:19420209T020000 +TZNAME:CWT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:DAYLIGHT +DTSTART:19450814T180000 +RDATE:19450814T180000 +TZNAME:CPT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:DAYLIGHT +DTSTART:19460428T020000 +RRULE:FREQ=YEARLY;UNTIL=19660424T080000Z;BYMONTH=4;BYDAY=-1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19460929T020000 +RRULE:FREQ=YEARLY;UNTIL=19540926T070000Z;BYMONTH=9;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:STANDARD +DTSTART:19551030T020000 +RRULE:FREQ=YEARLY;UNTIL=19661030T070000Z;BYMONTH=10;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19670430T020000 +RRULE:FREQ=YEARLY;UNTIL=19730429T080000Z;BYMONTH=4;BYDAY=-1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19671029T020000 +RRULE:FREQ=YEARLY;UNTIL=20061029T070000Z;BYMONTH=10;BYDAY=-1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:19760425T020000 +RRULE:FREQ=YEARLY;UNTIL=19860427T080000Z;BYMONTH=4;BYDAY=-1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:DAYLIGHT +DTSTART:19870405T020000 +RRULE:FREQ=YEARLY;UNTIL=20060402T080000Z;BYMONTH=4;BYDAY=1SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:DAYLIGHT +DTSTART:20070311T020000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU +TZNAME:CDT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:20071104T020000 +RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU +TZNAME:CST +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +END:STANDARD +END:VTIMEZONE +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/thunderbird/basic_completed.txt b/app/src/androidTest/assets/thunderbird/basic_completed.txt new file mode 100644 index 000000000..1fb9ae149 --- /dev/null +++ b/app/src/androidTest/assets/thunderbird/basic_completed.txt @@ -0,0 +1,16 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTODO +CREATED:20180417T212422Z +LAST-MODIFIED:20180417T212429Z +DTSTAMP:20180417T212429Z +UID:7a08a78b-bce5-f24a-bafe-ccd892f1fc5d +SUMMARY:Test +STATUS:COMPLETED +COMPLETED:20180417T212429Z +PERCENT-COMPLETE:100 +SEQUENCE:1 +X-MOZ-GENERATION:1 +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/thunderbird/basic_due_date.txt b/app/src/androidTest/assets/thunderbird/basic_due_date.txt new file mode 100644 index 000000000..9829d508e --- /dev/null +++ b/app/src/androidTest/assets/thunderbird/basic_due_date.txt @@ -0,0 +1,29 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:America/Chicago +BEGIN:DAYLIGHT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +TZNAME:CDT +DTSTART:19700308T020000 +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +TZNAME:CST +DTSTART:19701101T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11 +END:STANDARD +END:VTIMEZONE +BEGIN:VTODO +CREATED:20180417T181109Z +LAST-MODIFIED:20180417T181112Z +DTSTAMP:20180417T181112Z +UID:9b63f8c7-5df5-4941-8cbb-f84da524aad1 +SUMMARY:New Task +DUE;TZID=America/Chicago:20180417T140000 +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/thunderbird/basic_no_due_date.txt b/app/src/androidTest/assets/thunderbird/basic_no_due_date.txt new file mode 100644 index 000000000..369bc39ec --- /dev/null +++ b/app/src/androidTest/assets/thunderbird/basic_no_due_date.txt @@ -0,0 +1,12 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTODO +CREATED:20180417T163152Z +LAST-MODIFIED:20180417T163159Z +DTSTAMP:20180417T163159Z +UID:75deaea8-931b-b748-9a41-a7e8491c9aa9 +SUMMARY:Test title +DESCRIPTION:Test description +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/thunderbird/priority_high.txt b/app/src/androidTest/assets/thunderbird/priority_high.txt new file mode 100644 index 000000000..fb8a48e9e --- /dev/null +++ b/app/src/androidTest/assets/thunderbird/priority_high.txt @@ -0,0 +1,13 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTODO +CREATED:20180417T164451Z +LAST-MODIFIED:20180417T164622Z +DTSTAMP:20180417T164622Z +UID:6d2313db-56fb-ef4f-a039-3fa8a3fa257b +SUMMARY:Test +PRIORITY:1 +X-MOZ-GENERATION:3 +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/thunderbird/priority_low.txt b/app/src/androidTest/assets/thunderbird/priority_low.txt new file mode 100644 index 000000000..8ac7863d0 --- /dev/null +++ b/app/src/androidTest/assets/thunderbird/priority_low.txt @@ -0,0 +1,13 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTODO +CREATED:20180417T164451Z +LAST-MODIFIED:20180417T164503Z +DTSTAMP:20180417T164503Z +UID:6d2313db-56fb-ef4f-a039-3fa8a3fa257b +SUMMARY:Test +PRIORITY:9 +X-MOZ-GENERATION:1 +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/thunderbird/priority_normal.txt b/app/src/androidTest/assets/thunderbird/priority_normal.txt new file mode 100644 index 000000000..3af4de376 --- /dev/null +++ b/app/src/androidTest/assets/thunderbird/priority_normal.txt @@ -0,0 +1,13 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTODO +CREATED:20180417T164451Z +LAST-MODIFIED:20180417T164553Z +DTSTAMP:20180417T164553Z +UID:6d2313db-56fb-ef4f-a039-3fa8a3fa257b +SUMMARY:Test +PRIORITY:5 +X-MOZ-GENERATION:2 +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/thunderbird/priority_unspecified.txt b/app/src/androidTest/assets/thunderbird/priority_unspecified.txt new file mode 100644 index 000000000..dc867f3ae --- /dev/null +++ b/app/src/androidTest/assets/thunderbird/priority_unspecified.txt @@ -0,0 +1,13 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTODO +CREATED:20180417T164236Z +LAST-MODIFIED:20180417T164244Z +DTSTAMP:20180417T164244Z +UID:4092b6e9-03a5-194c-a69a-8e55e7aa59f2 +SUMMARY:Test +PRIORITY:0 +X-MOZ-GENERATION:1 +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/assets/thunderbird/repeat_daily.txt b/app/src/androidTest/assets/thunderbird/repeat_daily.txt new file mode 100644 index 000000000..ebabdeb99 --- /dev/null +++ b/app/src/androidTest/assets/thunderbird/repeat_daily.txt @@ -0,0 +1,30 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +BEGIN:VTIMEZONE +TZID:America/Chicago +BEGIN:DAYLIGHT +TZOFFSETFROM:-0600 +TZOFFSETTO:-0500 +TZNAME:CDT +DTSTART:19700308T020000 +RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0500 +TZOFFSETTO:-0600 +TZNAME:CST +DTSTART:19701101T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11 +END:STANDARD +END:VTIMEZONE +BEGIN:VTODO +CREATED:20180417T212758Z +LAST-MODIFIED:20180417T212809Z +DTSTAMP:20180417T212809Z +UID:53bfc5f2-b35a-654f-87a8-e0e6b037b94d +SUMMARY:New Task +RRULE:FREQ=DAILY +DTSTART;TZID=America/Chicago:20180417T170000 +END:VTODO +END:VCALENDAR \ No newline at end of file diff --git a/app/src/androidTest/java/org/tasks/TestUtilities.java b/app/src/androidTest/java/org/tasks/TestUtilities.java index 0b713f141..eb64830eb 100644 --- a/app/src/androidTest/java/org/tasks/TestUtilities.java +++ b/app/src/androidTest/java/org/tasks/TestUtilities.java @@ -1,6 +1,16 @@ package org.tasks; import android.content.Context; +import android.support.test.InstrumentationRegistry; +import at.bitfire.ical4android.InvalidCalendarException; +import com.google.common.base.Charsets; +import com.google.common.io.CharStreams; +import com.todoroo.astrid.data.Task; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringReader; +import org.tasks.caldav.CaldavConverter; public class TestUtilities { @@ -13,4 +23,46 @@ public class TestUtilities { mockitoInitialized = true; } } + + public static Task vtodo(String path) { + Task task = new Task(); + + CaldavConverter.apply(task, fromResource(path)); + + return task; + } + + private static at.bitfire.ical4android.Task fromResource(String path) { + Context context = InstrumentationRegistry.getInstrumentation().getContext(); + InputStream is = null; + InputStreamReader reader = null; + try { + is = context.getAssets().open(path); + reader = new InputStreamReader(is, Charsets.UTF_8); + return fromString(CharStreams.toString(reader)); + } catch (IOException e) { + throw new IllegalArgumentException(e); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException ignored) { + } + } + if (is != null) { + try { + is.close(); + } catch (IOException ignored) { + } + } + } + } + + private static at.bitfire.ical4android.Task fromString(String task) { + try { + return at.bitfire.ical4android.Task.fromReader(new StringReader(task)).get(0); + } catch (IOException | InvalidCalendarException e) { + throw new IllegalArgumentException(e); + } + } } diff --git a/app/src/androidTest/java/org/tasks/caldav/AppleRemindersTests.java b/app/src/androidTest/java/org/tasks/caldav/AppleRemindersTests.java new file mode 100644 index 000000000..fb5449e14 --- /dev/null +++ b/app/src/androidTest/java/org/tasks/caldav/AppleRemindersTests.java @@ -0,0 +1,88 @@ +package org.tasks.caldav; + +import static junit.framework.Assert.assertEquals; +import static org.tasks.TestUtilities.vtodo; + +import android.support.test.runner.AndroidJUnit4; +import com.todoroo.astrid.data.Task; +import java.util.TimeZone; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.tasks.time.DateTime; + +@RunWith(AndroidJUnit4.class) +public class AppleRemindersTests { + + private TimeZone defaultTimeZone = TimeZone.getDefault(); + + @Before + public void before() { + TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago")); + } + + @After + public void after() { + TimeZone.setDefault(defaultTimeZone); + } + + @Test + public void readTitle() { + assertEquals("Test title", vtodo("apple/basic_no_due_date.txt").getTitle()); + } + + @Test + public void readDescription() { + assertEquals("Test description", vtodo("apple/basic_no_due_date.txt").getNotes()); + } + + @Test + public void readCreationDate() { + assertEquals( + new DateTime(2018, 4, 16, 17, 24, 10).getMillis(), + (long) vtodo("apple/basic_no_due_date.txt").getCreationDate()); + } + + @Test + public void readDueDate() { + assertEquals( + new DateTime(2018, 4, 16, 18, 0, 1, 0).getMillis(), + (long) vtodo("apple/basic_due_date.txt").getDueDate()); + } + + @Test + public void completed() { + assertEquals( + new DateTime(2018, 4, 17, 13, 43, 2).getMillis(), + (long) vtodo("apple/basic_completed.txt").getCompletionDate()); + } + + @Test + public void repeatDaily() { + assertEquals("RRULE:FREQ=DAILY;INTERVAL=1", vtodo("apple/repeat_daily.txt").getRecurrence()); + } + + @Test + public void noPriority() { + assertEquals(Task.IMPORTANCE_NONE, (int) vtodo("apple/priority_none.txt").getImportance()); + } + + @Test + public void lowPriority() { + assertEquals( + Task.IMPORTANCE_SHOULD_DO, (int) vtodo("apple/priority_low.txt").getImportance()); + } + + @Test + public void mediumPriority() { + assertEquals( + Task.IMPORTANCE_MUST_DO, (int) vtodo("apple/priority_medium.txt").getImportance()); + } + + @Test + public void highPriority() { + assertEquals( + Task.IMPORTANCE_DO_OR_DIE, (int) vtodo("apple/priority_high.txt").getImportance()); + } +} diff --git a/app/src/androidTest/java/org/tasks/caldav/ThunderbirdTests.java b/app/src/androidTest/java/org/tasks/caldav/ThunderbirdTests.java new file mode 100644 index 000000000..072bb0c11 --- /dev/null +++ b/app/src/androidTest/java/org/tasks/caldav/ThunderbirdTests.java @@ -0,0 +1,95 @@ +package org.tasks.caldav; + +import static junit.framework.Assert.assertEquals; +import static org.tasks.TestUtilities.vtodo; + +import android.support.test.runner.AndroidJUnit4; +import com.todoroo.astrid.data.Task; +import java.util.TimeZone; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.tasks.time.DateTime; + +@RunWith(AndroidJUnit4.class) +public class ThunderbirdTests { + + private TimeZone defaultTimeZone = TimeZone.getDefault(); + + @Before + public void before() { + TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago")); + } + + @After + public void after() { + TimeZone.setDefault(defaultTimeZone); + } + + @Test + public void readTitle() { + assertEquals("Test title", vtodo("thunderbird/basic_no_due_date.txt").getTitle()); + } + + @Test + public void readDescription() { + assertEquals("Test description", vtodo("thunderbird/basic_no_due_date.txt").getNotes()); + } + + @Test + public void readCreationDate() { + assertEquals( + new DateTime(2018, 4, 17, 11, 31, 52).getMillis(), + (long) vtodo("thunderbird/basic_no_due_date.txt").getCreationDate()); + } + + @Test + public void readDueDate() { + assertEquals( + new DateTime(2018, 4, 17, 14, 0, 1).getMillis(), + (long) vtodo("thunderbird/basic_due_date.txt").getDueDate()); + } + + @Test + public void completed() { + assertEquals( + new DateTime(2018, 4, 17, 16, 24, 29).getMillis(), + (long) vtodo("thunderbird/basic_completed.txt").getCompletionDate()); + } + + @Test + public void repeatDaily() { + assertEquals("RRULE:FREQ=DAILY;INTERVAL=1", vtodo("thunderbird/repeat_daily.txt").getRecurrence()); + } + + @Test + public void priorityNotSet() { + assertEquals( + Task.IMPORTANCE_NONE, (int) vtodo("thunderbird/basic_no_due_date.txt").getImportance()); + } + + @Test + public void priorityNotSpecified() { + assertEquals( + Task.IMPORTANCE_NONE, (int) vtodo("thunderbird/priority_unspecified.txt").getImportance()); + } + + @Test + public void lowPriority() { + assertEquals( + Task.IMPORTANCE_SHOULD_DO, (int) vtodo("thunderbird/priority_low.txt").getImportance()); + } + + @Test + public void normalPriority() { + assertEquals( + Task.IMPORTANCE_MUST_DO, (int) vtodo("thunderbird/priority_normal.txt").getImportance()); + } + + @Test + public void highPriority() { + assertEquals( + Task.IMPORTANCE_DO_OR_DIE, (int) vtodo("thunderbird/priority_high.txt").getImportance()); + } +} diff --git a/app/src/main/java/org/tasks/caldav/TaskConverter.java b/app/src/main/java/org/tasks/caldav/CaldavConverter.java similarity index 82% rename from app/src/main/java/org/tasks/caldav/TaskConverter.java rename to app/src/main/java/org/tasks/caldav/CaldavConverter.java index eeb54da02..b8f9bd79f 100644 --- a/app/src/main/java/org/tasks/caldav/TaskConverter.java +++ b/app/src/main/java/org/tasks/caldav/CaldavConverter.java @@ -22,7 +22,7 @@ import net.fortuna.ical4j.model.property.RRule; import org.tasks.data.CaldavTask; import timber.log.Timber; -class TaskConverter { +public class CaldavConverter { private static final DateFormat DUE_DATE_FORMAT = new SimpleDateFormat("yyyyMMdd", Locale.US); @@ -33,6 +33,10 @@ class TaskConverter { } else { local.setCompletionDate(remote.getCompletedAt().getDate().getTime()); } + Long createdAt = remote.getCreatedAt(); + if (createdAt != null) { + local.setCreationDate(newDateTime(createdAt).toLocal().getMillis()); + } local.setTitle(remote.getSummary()); local.setNotes(remote.getDescription()); local.setImportance(fromRemote(remote.getPriority())); @@ -41,7 +45,7 @@ class TaskConverter { local.setRecurrence(""); } else { Recur recur = repeatRule.getRecur(); - if (recur.getInterval() == 0) { + if (recur.getInterval() <= 0) { recur.setInterval(1); } local.setRecurrence( @@ -67,29 +71,26 @@ class TaskConverter { } private static int fromRemote(int remotePriority) { - switch (remotePriority) { - case 0: - return Task.IMPORTANCE_NONE; - case 1: - return Task.IMPORTANCE_DO_OR_DIE; - case 2: - return Task.IMPORTANCE_MUST_DO; - default: - return Task.IMPORTANCE_SHOULD_DO; + if (remotePriority == 0) { + return Task.IMPORTANCE_NONE; + } + if (remotePriority == 5) { + return Task.IMPORTANCE_MUST_DO; } + return remotePriority < 5 ? Task.IMPORTANCE_DO_OR_DIE : Task.IMPORTANCE_SHOULD_DO; } private static int toRemote(int remotePriority, int localPriority) { - switch (localPriority) { - case Task.IMPORTANCE_DO_OR_DIE: - return 1; - case Task.IMPORTANCE_MUST_DO: - return 2; - case Task.IMPORTANCE_SHOULD_DO: - return remotePriority > 2 ? remotePriority : 3; - default: - return 0; + if (localPriority == Task.IMPORTANCE_NONE) { + return 0; + } + if (localPriority == Task.IMPORTANCE_MUST_DO) { + return 5; + } + if (localPriority == Task.IMPORTANCE_DO_OR_DIE) { + return remotePriority < 5 ? Math.max(1, remotePriority) : 1; } + return remotePriority > 5 ? Math.min(9, remotePriority) : 9; } public static at.bitfire.ical4android.Task toCaldav(CaldavTask caldavTask, Task task) { @@ -105,6 +106,7 @@ class TaskConverter { if (remote == null) { remote = new at.bitfire.ical4android.Task(); } + remote.setCreatedAt(newDateTime(task.getCreationDate()).toUTC().getMillis()); remote.setSummary(task.getTitle()); remote.setDescription(task.getNotes()); if (task.hasDueDate()) { diff --git a/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.java b/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.java index 8ad379574..3b21eb621 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.java +++ b/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.java @@ -303,7 +303,7 @@ public class CaldavSynchronizer { return; } - at.bitfire.ical4android.Task remoteModel = TaskConverter.toCaldav(caldavTask, task); + at.bitfire.ical4android.Task remoteModel = CaldavConverter.toCaldav(caldavTask, task); if (Strings.isNullOrEmpty(caldavTask.getRemoteId())) { String caldavUid = UUIDHelper.newUUID(); @@ -361,7 +361,7 @@ public class CaldavSynchronizer { } else { task = taskDao.fetch(caldavTask.getTask()); } - TaskConverter.apply(task, remote); + CaldavConverter.apply(task, remote); task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); taskDao.save(task); caldavTask.setVtodo(vtodo);