From da718dd2902c88d12237b5768a15cada8a82c039 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Wed, 31 Dec 2025 17:55:30 +0100 Subject: [PATCH] caldav: Add import test case from RFC Appendix B --- .../caldav/calendar_import.rs | 10 +- .../caldav/resources/rfc4791_appb.ics | 102 +++++++++++++++++ ...__caldav__calendar_import__0_get_body.snap | 32 ++++++ ...aldav__calendar_import__0_import_body.snap | 5 + ...__caldav__calendar_import__1_get_body.snap | 107 ++++++++++++++++++ ...aldav__calendar_import__1_import_body.snap | 5 + ...ts__caldav__calendar_import__get_body.snap | 103 ++++++++++++++--- 7 files changed, 347 insertions(+), 17 deletions(-) create mode 100644 src/integration_tests/caldav/resources/rfc4791_appb.ics create mode 100644 src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__0_get_body.snap create mode 100644 src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__0_import_body.snap create mode 100644 src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__1_get_body.snap create mode 100644 src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__1_import_body.snap diff --git a/src/integration_tests/caldav/calendar_import.rs b/src/integration_tests/caldav/calendar_import.rs index 0a82060..689b0b8 100644 --- a/src/integration_tests/caldav/calendar_import.rs +++ b/src/integration_tests/caldav/calendar_import.rs @@ -38,11 +38,15 @@ END:VCALENDAR "; #[rstest] +#[case(0, ICAL)] +#[case(1, include_str!("resources/rfc4791_appb.ics"))] #[tokio::test] async fn test_import( #[from(test_store_context)] #[future] context: TestStoreContext, + #[case] case: usize, + #[case] ical: &'static str, ) { let context = context.await; let app = get_app(context.clone()); @@ -54,7 +58,7 @@ async fn test_import( Request::builder() .method("IMPORT") .uri(&url) - .body(Body::from(ICAL)) + .body(Body::from(ical)) .unwrap() }; @@ -71,7 +75,7 @@ async fn test_import( let response = app.clone().oneshot(request).await.unwrap(); assert_eq!(response.status(), StatusCode::OK); let body = response.extract_string().await; - insta::assert_snapshot!("import_body", body); + insta::assert_snapshot!(format!("{case}_import_body"), body); let mut request = Request::builder() .method("GET") @@ -89,6 +93,6 @@ async fn test_import( (r"UID:.+", "UID:[UID]") ] }, { - insta::assert_snapshot!("get_body", body); + insta::assert_snapshot!(format!("{case}_get_body"), body); }); } diff --git a/src/integration_tests/caldav/resources/rfc4791_appb.ics b/src/integration_tests/caldav/resources/rfc4791_appb.ics new file mode 100644 index 0000000..6727518 --- /dev/null +++ b/src/integration_tests/caldav/resources/rfc4791_appb.ics @@ -0,0 +1,102 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Example Corp.//CalDAV Client//EN +BEGIN:VTIMEZONE +LAST-MODIFIED:20040110T032845Z +TZID:US/Eastern +BEGIN:DAYLIGHT +DTSTART:20000404T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 +TZNAME:EDT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:20001026T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +TZNAME:EST +TZOFFSETFROM:-0400 +TZOFFSETTO:-0500 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTAMP:20060206T001102Z +DTSTART;TZID=US/Eastern:20060102T100000 +DURATION:PT1H +SUMMARY:Event #1 +Description:Go Steelers! +UID:abcd1 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20060206T001121Z +DTSTART;TZID=US/Eastern:20060102T120000 +DURATION:PT1H +RRULE:FREQ=DAILY;COUNT=5 +SUMMARY:Event #2 +UID:abcd2 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20060206T001121Z +DTSTART;TZID=US/Eastern:20060104T140000 +DURATION:PT1H +RECURRENCE-ID;TZID=US/Eastern:20060104T120000 +SUMMARY:Event #2 bis +UID:00959BC664CA650E933C892C@example.com +END:VEVENT +BEGIN:VEVENT +ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com +ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com +DTSTAMP:20060206T001220Z +DTSTART;TZID=US/Eastern:20060104T100000 +DURATION:PT1H +LAST-MODIFIED:20060206T001330Z +ORGANIZER:mailto:cyrus@example.com +SEQUENCE:1 +STATUS:TENTATIVE +SUMMARY:Event #3 +UID:abcd3 +END:VEVENT +BEGIN:VTODO +DTSTAMP:20060205T235335Z +DUE;VALUE=DATE:20060104 +STATUS:NEEDS-ACTION +SUMMARY:Task #1 +UID:abcd4 +BEGIN:VALARM +ACTION:AUDIO +TRIGGER;RELATED=START:-PT10M +END:VALARM +END:VTODO +BEGIN:VTODO +DTSTAMP:20060205T235300Z +DUE;VALUE=DATE:20060106 +LAST-MODIFIED:20060205T235308Z +SEQUENCE:1 +STATUS:NEEDS-ACTION +SUMMARY:Task #2 +UID:abcd5 +BEGIN:VALARM +ACTION:AUDIO +TRIGGER;RELATED=START:-PT10M +END:VALARM +END:VTODO +BEGIN:VTODO +COMPLETED:20051223T122322Z +DTSTAMP:20060205T235400Z +DUE;VALUE=DATE:20051225 +LAST-MODIFIED:20060205T235308Z +SEQUENCE:1 +STATUS:COMPLETED +SUMMARY:Task #3 +UID:abcd6 +END:VTODO +BEGIN:VTODO +DTSTAMP:20060205T235600Z +DUE;VALUE=DATE:20060101 +LAST-MODIFIED:20060205T235308Z +SEQUENCE:1 +STATUS:CANCELLED +SUMMARY:Task #4 +UID:abcd7 +END:VTODO +END:VCALENDAR diff --git a/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__0_get_body.snap b/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__0_get_body.snap new file mode 100644 index 0000000..7dc2838 --- /dev/null +++ b/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__0_get_body.snap @@ -0,0 +1,32 @@ +--- +source: src/integration_tests/caldav/calendar_import.rs +expression: body +--- +BEGIN:VCALENDAR +VERSION:2.0 +CALSCALE:GREGORIAN +PRODID:RustiCal +BEGIN:VEVENT +UID:[UID] +SUMMARY:One-off Meeting +DTSTAMP:20041210T183904Z +DTSTART:20041207T120000Z +DTEND:20041207T130000Z +END:VEVENT +BEGIN:VEVENT +UID:[UID] +SUMMARY:Weekly Meeting +DTSTAMP:20041210T183838Z +DTSTART:20041206T120000Z +DTEND:20041206T130000Z +RRULE:FREQ=WEEKLY +END:VEVENT +BEGIN:VEVENT +UID:[UID] +SUMMARY:Weekly Meeting +RECURRENCE-ID:20041213T120000Z +DTSTAMP:20041210T183838Z +DTSTART:20041213T130000Z +DTEND:20041213T140000Z +END:VEVENT +END:VCALENDAR diff --git a/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__0_import_body.snap b/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__0_import_body.snap new file mode 100644 index 0000000..5d87409 --- /dev/null +++ b/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__0_import_body.snap @@ -0,0 +1,5 @@ +--- +source: src/integration_tests/caldav/calendar_import.rs +expression: body +--- + diff --git a/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__1_get_body.snap b/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__1_get_body.snap new file mode 100644 index 0000000..9f34fbb --- /dev/null +++ b/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__1_get_body.snap @@ -0,0 +1,107 @@ +--- +source: src/integration_tests/caldav/calendar_import.rs +expression: body +--- +BEGIN:VCALENDAR +VERSION:2.0 +CALSCALE:GREGORIAN +PRODID:RustiCal +BEGIN:VTIMEZONE +LAST-MODIFIED:20040110T032845Z +TZID:US/Eastern +BEGIN:DAYLIGHT +DTSTART:20000404T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 +TZNAME:EDT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:20001026T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +TZNAME:EST +TZOFFSETFROM:-0400 +TZOFFSETTO:-0500 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTAMP:20060206T001121Z +DTSTART;TZID=US/Eastern:20060104T140000 +DURATION:PT1H +RECURRENCE-ID;TZID=US/Eastern:20060104T120000 +SUMMARY:Event #2 bis +UID:[UID] +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20060206T001102Z +DTSTART;TZID=US/Eastern:20060102T100000 +DURATION:PT1H +SUMMARY:Event #1 +Description:Go Steelers! +UID:[UID] +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20060206T001121Z +DTSTART;TZID=US/Eastern:20060102T120000 +DURATION:PT1H +RRULE:FREQ=DAILY;COUNT=5 +SUMMARY:Event #2 +UID:[UID] +END:VEVENT +BEGIN:VEVENT +ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com +ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com +DTSTAMP:20060206T001220Z +DTSTART;TZID=US/Eastern:20060104T100000 +DURATION:PT1H +LAST-MODIFIED:20060206T001330Z +ORGANIZER:mailto:cyrus@example.com +SEQUENCE:1 +STATUS:TENTATIVE +SUMMARY:Event #3 +UID:[UID] +END:VEVENT +BEGIN:VTODO +DTSTAMP:20060205T235335Z +DUE;VALUE=DATE:20060104 +STATUS:NEEDS-ACTION +SUMMARY:Task #1 +UID:[UID] +BEGIN:VALARM +ACTION:AUDIO +TRIGGER;RELATED=START:-PT10M +END:VALARM +END:VTODO +BEGIN:VTODO +DTSTAMP:20060205T235300Z +DUE;VALUE=DATE:20060106 +LAST-MODIFIED:20060205T235308Z +SEQUENCE:1 +STATUS:NEEDS-ACTION +SUMMARY:Task #2 +UID:[UID] +BEGIN:VALARM +ACTION:AUDIO +TRIGGER;RELATED=START:-PT10M +END:VALARM +END:VTODO +BEGIN:VTODO +COMPLETED:20051223T122322Z +DTSTAMP:20060205T235400Z +DUE;VALUE=DATE:20051225 +LAST-MODIFIED:20060205T235308Z +SEQUENCE:1 +STATUS:COMPLETED +SUMMARY:Task #3 +UID:[UID] +END:VTODO +BEGIN:VTODO +DTSTAMP:20060205T235600Z +DUE;VALUE=DATE:20060101 +LAST-MODIFIED:20060205T235308Z +SEQUENCE:1 +STATUS:CANCELLED +SUMMARY:Task #4 +UID:[UID] +END:VTODO +END:VCALENDAR diff --git a/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__1_import_body.snap b/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__1_import_body.snap new file mode 100644 index 0000000..5d87409 --- /dev/null +++ b/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__1_import_body.snap @@ -0,0 +1,5 @@ +--- +source: src/integration_tests/caldav/calendar_import.rs +expression: body +--- + diff --git a/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__get_body.snap b/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__get_body.snap index 7dc2838..9f34fbb 100644 --- a/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__get_body.snap +++ b/src/integration_tests/caldav/snapshots/rustical__integration_tests__caldav__calendar_import__get_body.snap @@ -6,27 +6,102 @@ BEGIN:VCALENDAR VERSION:2.0 CALSCALE:GREGORIAN PRODID:RustiCal +BEGIN:VTIMEZONE +LAST-MODIFIED:20040110T032845Z +TZID:US/Eastern +BEGIN:DAYLIGHT +DTSTART:20000404T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 +TZNAME:EDT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:20001026T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +TZNAME:EST +TZOFFSETFROM:-0400 +TZOFFSETTO:-0500 +END:STANDARD +END:VTIMEZONE BEGIN:VEVENT +DTSTAMP:20060206T001121Z +DTSTART;TZID=US/Eastern:20060104T140000 +DURATION:PT1H +RECURRENCE-ID;TZID=US/Eastern:20060104T120000 +SUMMARY:Event #2 bis UID:[UID] -SUMMARY:One-off Meeting -DTSTAMP:20041210T183904Z -DTSTART:20041207T120000Z -DTEND:20041207T130000Z END:VEVENT BEGIN:VEVENT +DTSTAMP:20060206T001102Z +DTSTART;TZID=US/Eastern:20060102T100000 +DURATION:PT1H +SUMMARY:Event #1 +Description:Go Steelers! UID:[UID] -SUMMARY:Weekly Meeting -DTSTAMP:20041210T183838Z -DTSTART:20041206T120000Z -DTEND:20041206T130000Z -RRULE:FREQ=WEEKLY END:VEVENT BEGIN:VEVENT +DTSTAMP:20060206T001121Z +DTSTART;TZID=US/Eastern:20060102T120000 +DURATION:PT1H +RRULE:FREQ=DAILY;COUNT=5 +SUMMARY:Event #2 UID:[UID] -SUMMARY:Weekly Meeting -RECURRENCE-ID:20041213T120000Z -DTSTAMP:20041210T183838Z -DTSTART:20041213T130000Z -DTEND:20041213T140000Z END:VEVENT +BEGIN:VEVENT +ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com +ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com +DTSTAMP:20060206T001220Z +DTSTART;TZID=US/Eastern:20060104T100000 +DURATION:PT1H +LAST-MODIFIED:20060206T001330Z +ORGANIZER:mailto:cyrus@example.com +SEQUENCE:1 +STATUS:TENTATIVE +SUMMARY:Event #3 +UID:[UID] +END:VEVENT +BEGIN:VTODO +DTSTAMP:20060205T235335Z +DUE;VALUE=DATE:20060104 +STATUS:NEEDS-ACTION +SUMMARY:Task #1 +UID:[UID] +BEGIN:VALARM +ACTION:AUDIO +TRIGGER;RELATED=START:-PT10M +END:VALARM +END:VTODO +BEGIN:VTODO +DTSTAMP:20060205T235300Z +DUE;VALUE=DATE:20060106 +LAST-MODIFIED:20060205T235308Z +SEQUENCE:1 +STATUS:NEEDS-ACTION +SUMMARY:Task #2 +UID:[UID] +BEGIN:VALARM +ACTION:AUDIO +TRIGGER;RELATED=START:-PT10M +END:VALARM +END:VTODO +BEGIN:VTODO +COMPLETED:20051223T122322Z +DTSTAMP:20060205T235400Z +DUE;VALUE=DATE:20051225 +LAST-MODIFIED:20060205T235308Z +SEQUENCE:1 +STATUS:COMPLETED +SUMMARY:Task #3 +UID:[UID] +END:VTODO +BEGIN:VTODO +DTSTAMP:20060205T235600Z +DUE;VALUE=DATE:20060101 +LAST-MODIFIED:20060205T235308Z +SEQUENCE:1 +STATUS:CANCELLED +SUMMARY:Task #4 +UID:[UID] +END:VTODO END:VCALENDAR