diff --git a/Cargo.lock b/Cargo.lock index 3b13d4c..0d9a2a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -817,6 +817,21 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.30" @@ -884,12 +899,19 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + [[package]] name = "futures-util" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -930,6 +952,12 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "h2" version = "0.3.24" @@ -1561,6 +1589,12 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "relative-path" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" + [[package]] name = "roxmltree" version = "0.19.0" @@ -1587,6 +1621,35 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rstest" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97eeab2f3c0a199bc4be135c36c924b6590b88c377d416494288c14f2db30199" +dependencies = [ + "futures", + "futures-timer", + "rstest_macros", + "rustc_version", +] + +[[package]] +name = "rstest_macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d428f8247852f894ee1be110b375111b586d4fa431f6c46e64ba5a0dcccbe605" +dependencies = [ + "cfg-if", + "glob", + "proc-macro2", + "quote", + "regex", + "relative-path", + "rustc_version", + "syn 2.0.50", + "unicode-ident", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1691,6 +1754,7 @@ dependencies = [ "ical", "lazy_static", "regex", + "rstest", "serde", "sha2", "sqlx", diff --git a/crates/store/Cargo.toml b/crates/store/Cargo.toml index 7b87582..0f26b2a 100644 --- a/crates/store/Cargo.toml +++ b/crates/store/Cargo.toml @@ -27,3 +27,4 @@ ical = { version = "0.10", features = ["generator", "serde"] } chrono = "0.4" regex = "1.10" lazy_static = "1.4" +rstest = "0.18.2" diff --git a/crates/store/tests/test_calendar.rs b/crates/store/tests/test_calendar.rs new file mode 100644 index 0000000..366b218 --- /dev/null +++ b/crates/store/tests/test_calendar.rs @@ -0,0 +1,192 @@ +use rstest::rstest; +use rustical_store::calendar::CalendarStore; +use rustical_store::sqlite_store::create_test_store; +use rustical_store::toml_store::TomlCalendarStore; + +const TIMEZONE: &str = "BEGIN:VCALENDAR\r +BEGIN:VTIMEZONE\r +TZID:Europe/Berlin\r +LAST-MODIFIED:20230104T023643Z\r +TZURL:https://www.tzurl.org/zoneinfo/Europe/Berlin\r +X-LIC-LOCATION:Europe/Berlin\r +X-PROLEPTIC-TZNAME:LMT\r +BEGIN:STANDARD\r +TZNAME:CET\r +TZOFFSETFROM:+005328\r +TZOFFSETTO:+0100\r +DTSTART:18930401T000632\r +END:STANDARD\r +BEGIN:DAYLIGHT\r +TZNAME:CEST\r +TZOFFSETFROM:+0100\r +TZOFFSETTO:+0200\r +DTSTART:19160430T230000\r +RDATE:19400401T020000\r +RDATE:19430329T020000\r +RDATE:19460414T020000\r +RDATE:19470406T030000\r +RDATE:19480418T020000\r +RDATE:19490410T020000\r +RDATE:19800406T020000\r +END:DAYLIGHT\r +BEGIN:STANDARD\r +TZNAME:CET\r +TZOFFSETFROM:+0200\r +TZOFFSETTO:+0100\r +DTSTART:19161001T010000\r +RDATE:19421102T030000\r +RDATE:19431004T030000\r +RDATE:19441002T030000\r +RDATE:19451118T030000\r +RDATE:19461007T030000\r +END:STANDARD\r +BEGIN:DAYLIGHT\r +TZNAME:CEST\r +TZOFFSETFROM:+0100\r +TZOFFSETTO:+0200\r +DTSTART:19170416T020000\r +RRULE:FREQ=YEARLY;UNTIL=19180415T010000Z;BYMONTH=4;BYDAY=3MO\r +END:DAYLIGHT\r +BEGIN:STANDARD\r +TZNAME:CET\r +TZOFFSETFROM:+0200\r +TZOFFSETTO:+0100\r +DTSTART:19170917T030000\r +RRULE:FREQ=YEARLY;UNTIL=19180916T010000Z;BYMONTH=9;BYDAY=3MO\r +END:STANDARD\r +BEGIN:DAYLIGHT\r +TZNAME:CEST\r +TZOFFSETFROM:+0100\r +TZOFFSETTO:+0200\r +DTSTART:19440403T020000\r +RRULE:FREQ=YEARLY;UNTIL=19450402T010000Z;BYMONTH=4;BYDAY=1MO\r +END:DAYLIGHT\r +BEGIN:DAYLIGHT\r +TZNAME:CEMT\r +TZOFFSETFROM:+0200\r +TZOFFSETTO:+0300\r +DTSTART:19450524T010000\r +RDATE:19470511T020000\r +END:DAYLIGHT\r +BEGIN:DAYLIGHT\r +TZNAME:CEST\r +TZOFFSETFROM:+0300\r +TZOFFSETTO:+0200\r +DTSTART:19450924T030000\r +RDATE:19470629T030000\r +END:DAYLIGHT\r +BEGIN:STANDARD\r +TZNAME:CET\r +TZOFFSETFROM:+0100\r +TZOFFSETTO:+0100\r +DTSTART:19460101T000000\r +RDATE:19800101T000000\r +END:STANDARD\r +BEGIN:STANDARD\r +TZNAME:CET\r +TZOFFSETFROM:+0200\r +TZOFFSETTO:+0100\r +DTSTART:19471005T030000\r +RRULE:FREQ=YEARLY;UNTIL=19491002T010000Z;BYMONTH=10;BYDAY=1SU\r +END:STANDARD\r +BEGIN:STANDARD\r +TZNAME:CET\r +TZOFFSETFROM:+0200\r +TZOFFSETTO:+0100\r +DTSTART:19800928T030000\r +RRULE:FREQ=YEARLY;UNTIL=19950924T010000Z;BYMONTH=9;BYDAY=-1SU\r +END:STANDARD\r +BEGIN:DAYLIGHT\r +TZNAME:CEST\r +TZOFFSETFROM:+0100\r +TZOFFSETTO:+0200\r +DTSTART:19810329T020000\r +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r +END:DAYLIGHT\r +BEGIN:STANDARD\r +TZNAME:CET\r +TZOFFSETFROM:+0200\r +TZOFFSETTO:+0100\r +DTSTART:19961027T030000\r +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r +END:STANDARD\r +END:VTIMEZONE\r +END:VCALENDAR\r +"; + +const EVENT: &str = "BEGIN:VCALENDAR\r +CALSCALE:GREGORIAN\r +PRODID:-//Ximian//NONSGML Evolution Calendar//EN\r +VERSION:2.0\r +BEGIN:VTIMEZONE\r +TZID:Europe/Berlin\r +X-LIC-LOCATION:Europe/Berlin\r +BEGIN:DAYLIGHT\r +TZNAME:CEST\r +TZOFFSETFROM:+0100\r +TZOFFSETTO:+0200\r +DTSTART:19810329T020000\r +RRULE:FREQ=YEARLY;UNTIL=20370329T010000Z;BYDAY=-1SU;BYMONTH=3\r +END:DAYLIGHT\r +BEGIN:STANDARD\r +TZNAME:CET\r +TZOFFSETFROM:+0200\r +TZOFFSETTO:+0100\r +DTSTART:19961027T030000\r +RRULE:FREQ=YEARLY;UNTIL=20361026T010000Z;BYDAY=-1SU;BYMONTH=10\r +END:STANDARD\r +END:VTIMEZONE\r +BEGIN:VEVENT\r +UID:67d830c3e681950b6a12f7c287b316269a19fcf7\r +DTSTAMP:20230831T102923Z\r +DTSTART;TZID=Europe/Berlin:20230829T043000\r +DTEND;TZID=Europe/Berlin:20230829T045500\r +SEQUENCE:2\r +SUMMARY:asdjlk\r +TRANSP:OPAQUE\r +CLASS:PUBLIC\r +CREATED:20230831T103040Z\r +LAST-MODIFIED:20230831T103040Z\r +END:VEVENT\r +END:VCALENDAR\r +"; + +#[tokio::test] +async fn test_init_sqlite() { + let store = create_test_store().await.unwrap(); + store.get_events("asd").await.unwrap(); +} + +#[rstest] +#[case::toml(async {TomlCalendarStore::test()})] +#[case::sqlite(async {create_test_store().await.unwrap() })] +#[tokio::test] +async fn test_create_event( + #[future] + #[case] + store: CS, +) { + let mut store = store.await; + store + .insert_calendar( + "test".to_owned(), + rustical_store::calendar::Calendar { + id: "test".to_owned(), + name: Some("Test Calendar".to_owned()), + owner: "Test User".to_owned(), + timezone: Some(TIMEZONE.to_owned()), + ..Default::default() // timezone: TIMEZONE.to_owned(), + }, + ) + .await + .unwrap(); + + store + .upsert_event("test".to_owned(), "asd".to_owned(), EVENT.to_owned()) + .await + .unwrap(); + + let event = store.get_event("test", "asd").await.unwrap(); + assert_eq!(event.get_ics(), EVENT); + assert_eq!(event.get_uid(), "asd"); +}