diff --git a/Cargo.lock b/Cargo.lock index 80b1f5b..2706783 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -139,7 +139,7 @@ dependencies = [ "rustc-hash", "serde", "serde_derive", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -175,7 +175,7 @@ checksum = "34921de3d57974069bad483fdfe0ec65d88c4ff892edd1ab4d8b03be0dda1b9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -310,7 +310,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -397,9 +397,9 @@ dependencies = [ [[package]] name = "axum-extra" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460c45604cb25834835e3b4d3468510322852783dac36261d642424d75562ff3" +checksum = "5136e6c5e7e7978fe23e9876fb924af2c0f84c72127ac6ac17e7c46f457d362c" dependencies = [ "axum", "axum-core", @@ -615,7 +615,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -747,7 +747,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -771,7 +771,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -782,7 +782,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -823,7 +823,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "unicode-xid", ] @@ -847,7 +847,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1178,7 +1178,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1568,7 +1568,7 @@ dependencies = [ [[package]] name = "ical" version = "0.11.0" -source = "git+https://github.com/lennart-k/ical-rs#38e4201d5f653b07c9800cccec93996f542267b4" +source = "git+https://github.com/lennart-k/ical-rs#474caf58acbc8ebefd90e6b848741d7ed5136d65" dependencies = [ "chrono", "chrono-tz", @@ -1724,9 +1724,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" dependencies = [ "memchr", "serde", @@ -2102,7 +2102,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2327,7 +2327,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2400,7 +2400,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2526,7 +2526,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "version_check", "yansi", ] @@ -2551,7 +2551,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2718,7 +2718,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2892,7 +2892,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.108", + "syn 2.0.109", "unicode-ident", ] @@ -2904,7 +2904,7 @@ checksum = "b3a8fb4672e840a587a66fc577a5491375df51ddb88f2a2c2a792598c326fe14" dependencies = [ "quote", "rand 0.8.5", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -2919,9 +2919,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.8.0" +version = "8.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb44e1917075637ee8c7bcb865cf8830e3a92b5b1189e44e3a0ab5a0d5be314b" +checksum = "947d7f3fad52b283d261c4c99a084937e2fe492248cb9a68a8435a861b8798ca" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -2930,22 +2930,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.8.0" +version = "8.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382499b49db77a7c19abd2a574f85ada7e9dbe125d5d1160fa5cad7c4cf71fc9" +checksum = "5fa2c8c9e8711e10f9c4fd2d64317ef13feaab820a4c51541f1a8c8e2e851ab2" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.108", + "syn 2.0.109", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.8.0" +version = "8.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21fcbee55c2458836bcdbfffb6ec9ba74bbc23ca7aa6816015a3dd2c4d8fc185" +checksum = "60b161f275cb337fe0a44d924a5f4df0ed69c2c39519858f931ce61c779d3475" dependencies = [ "sha2", "walkdir", @@ -3284,9 +3284,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.34" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "once_cell", "ring", @@ -3352,9 +3352,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" dependencies = [ "dyn-clone", "ref-cast", @@ -3425,7 +3425,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3503,7 +3503,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.12.0", "schemars 0.9.0", - "schemars 1.0.4", + "schemars 1.1.0", "serde_core", "serde_json", "serde_with_macros", @@ -3519,7 +3519,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3687,7 +3687,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3710,7 +3710,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.108", + "syn 2.0.109", "tokio", "url", ] @@ -3862,7 +3862,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3884,9 +3884,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.108" +version = "2.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" dependencies = [ "proc-macro2", "quote", @@ -3910,7 +3910,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3939,7 +3939,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3950,7 +3950,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4044,7 +4044,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4070,9 +4070,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", @@ -4356,7 +4356,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4639,7 +4639,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "wasm-bindgen-shared", ] @@ -4674,9 +4674,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" dependencies = [ "rustls-pki-types", ] @@ -4721,7 +4721,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4732,7 +4732,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5020,7 +5020,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5048,7 +5048,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "synstructure", ] @@ -5069,7 +5069,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5089,7 +5089,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "synstructure", ] @@ -5129,5 +5129,5 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] diff --git a/crates/ical/src/error.rs b/crates/ical/src/error.rs index 52ff7e7..94b41fe 100644 --- a/crates/ical/src/error.rs +++ b/crates/ical/src/error.rs @@ -2,7 +2,7 @@ use axum::{http::StatusCode, response::IntoResponse}; use crate::CalDateTimeError; -#[derive(Debug, thiserror::Error)] +#[derive(Debug, thiserror::Error, PartialEq, Eq)] pub enum Error { #[error("Invalid ics/vcf input: {0}")] InvalidData(String), diff --git a/crates/ical/src/timestamp.rs b/crates/ical/src/timestamp.rs index f96ad9d..623bc26 100644 --- a/crates/ical/src/timestamp.rs +++ b/crates/ical/src/timestamp.rs @@ -13,7 +13,7 @@ const LOCAL_DATE_TIME: &str = "%Y%m%dT%H%M%S"; const UTC_DATE_TIME: &str = "%Y%m%dT%H%M%SZ"; pub const LOCAL_DATE: &str = "%Y%m%d"; -#[derive(Debug, thiserror::Error)] +#[derive(Debug, thiserror::Error, PartialEq, Eq)] pub enum CalDateTimeError { #[error( "Timezone has X-LIC-LOCATION property to specify a timezone from the Olson database, however its value {0} is invalid" diff --git a/crates/store/src/addressbook.rs b/crates/store/src/addressbook.rs index 05016b8..2874221 100644 --- a/crates/store/src/addressbook.rs +++ b/crates/store/src/addressbook.rs @@ -2,7 +2,7 @@ use crate::synctoken::format_synctoken; use chrono::NaiveDateTime; use serde::Serialize; -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] pub struct Addressbook { pub id: String, pub principal: String, diff --git a/crates/store/src/calendar.rs b/crates/store/src/calendar.rs index da3be24..4849003 100644 --- a/crates/store/src/calendar.rs +++ b/crates/store/src/calendar.rs @@ -4,7 +4,7 @@ use rustical_ical::CalendarObjectType; use serde::{Deserialize, Serialize}; use std::str::FromStr; -#[derive(Debug, Default, Clone, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq)] pub struct CalendarMetadata { // Attributes that may be outsourced pub displayname: Option, @@ -13,7 +13,7 @@ pub struct CalendarMetadata { pub color: Option, } -#[derive(Debug, Default, Clone, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq)] pub struct Calendar { // Attributes that may be outsourced #[serde(flatten)] diff --git a/crates/store/src/error.rs b/crates/store/src/error.rs index 649105c..9ace70f 100644 --- a/crates/store/src/error.rs +++ b/crates/store/src/error.rs @@ -41,6 +41,11 @@ impl Error { _ => StatusCode::INTERNAL_SERVER_ERROR, } } + + #[must_use] + pub const fn is_not_found(&self) -> bool { + matches!(self, Self::NotFound) + } } impl IntoResponse for Error { diff --git a/crates/store_sqlite/src/tests/addressbook_store.rs b/crates/store_sqlite/src/tests/addressbook_store.rs new file mode 100644 index 0000000..c61c87e --- /dev/null +++ b/crates/store_sqlite/src/tests/addressbook_store.rs @@ -0,0 +1,81 @@ +#[cfg(test)] +mod tests { + use crate::{addressbook_store::SqliteAddressbookStore, tests::get_test_addressbook_store}; + use rstest::rstest; + use rustical_store::{Addressbook, AddressbookStore}; + + #[rstest] + #[tokio::test] + async fn test_addressbook_store( + #[from(get_test_addressbook_store)] + #[future] + addr_store: SqliteAddressbookStore, + ) { + let addr_store = addr_store.await; + + let cal = Addressbook { + id: "addr".to_string(), + principal: "fake-user".to_string(), + displayname: None, + description: None, + deleted_at: None, + synctoken: 0, + push_topic: "alskdj".to_string(), + }; + + assert!( + addr_store.insert_addressbook(cal).await.is_err(), + "This should fail due to the user not existing " + ); + + let addr = Addressbook { + id: "addr".to_string(), + principal: "user".to_string(), + displayname: None, + description: None, + deleted_at: None, + synctoken: 0, + push_topic: "alskdj".to_string(), + }; + + addr_store.insert_addressbook(addr.clone()).await.unwrap(); + + assert_eq!( + addr_store + .get_addressbook("user", "addr", false) + .await + .unwrap(), + addr + ); + + addr_store + .delete_addressbook("user", "addr", true) + .await + .unwrap(); + + let Err(err) = addr_store.get_addressbook("user", "addr", false).await else { + panic!() + }; + assert!(err.is_not_found()); + + addr_store + .get_addressbook("user", "addr", true) + .await + .unwrap(); + + addr_store + .restore_addressbook("user", "addr") + .await + .unwrap(); + + addr_store + .delete_addressbook("user", "addr", false) + .await + .unwrap(); + + let Err(err) = addr_store.get_addressbook("user", "addr", true).await else { + panic!() + }; + assert!(err.is_not_found()); + } +} diff --git a/crates/store_sqlite/src/tests/calendar_store.rs b/crates/store_sqlite/src/tests/calendar_store.rs new file mode 100644 index 0000000..e12cefd --- /dev/null +++ b/crates/store_sqlite/src/tests/calendar_store.rs @@ -0,0 +1,76 @@ +#[cfg(test)] +mod tests { + use crate::{calendar_store::SqliteCalendarStore, tests::get_test_calendar_store}; + use rstest::rstest; + use rustical_store::{Calendar, CalendarMetadata, CalendarStore}; + + #[rstest] + #[tokio::test] + async fn test_calendar_store( + #[from(get_test_calendar_store)] + #[future] + cal_store: SqliteCalendarStore, + ) { + let cal_store = cal_store.await; + + let cal = Calendar { + principal: "fake-user".to_string(), + timezone_id: None, + deleted_at: None, + meta: CalendarMetadata::default(), + id: "cal".to_string(), + synctoken: 0, + subscription_url: None, + push_topic: "alskdj".to_string(), + components: vec![], + }; + + assert!( + cal_store.insert_calendar(cal).await.is_err(), + "This should fail due to the user not existing " + ); + + let cal = Calendar { + principal: "user".to_string(), + timezone_id: None, + deleted_at: None, + meta: CalendarMetadata::default(), + id: "cal".to_string(), + synctoken: 0, + subscription_url: None, + push_topic: "alskdj".to_string(), + components: vec![], + }; + + cal_store.insert_calendar(cal.clone()).await.unwrap(); + + assert_eq!( + cal_store.get_calendar("user", "cal", false).await.unwrap(), + cal + ); + + cal_store + .delete_calendar("user", "cal", true) + .await + .unwrap(); + + let Err(err) = cal_store.get_calendar("user", "cal", false).await else { + panic!() + }; + assert!(err.is_not_found()); + + cal_store.get_calendar("user", "cal", true).await.unwrap(); + + cal_store.restore_calendar("user", "cal").await.unwrap(); + + cal_store + .delete_calendar("user", "cal", false) + .await + .unwrap(); + + let Err(err) = cal_store.get_calendar("user", "cal", true).await else { + panic!() + }; + assert!(err.is_not_found()); + } +} diff --git a/crates/store_sqlite/src/tests/mod.rs b/crates/store_sqlite/src/tests/mod.rs index 4715cab..c175657 100644 --- a/crates/store_sqlite/src/tests/mod.rs +++ b/crates/store_sqlite/src/tests/mod.rs @@ -8,6 +8,9 @@ use tokio::sync::OnceCell; static DB: OnceCell = OnceCell::const_new(); +mod addressbook_store; +mod calendar_store; + async fn get_test_db() -> SqlitePool { DB.get_or_init(async || { let db = SqlitePool::connect("sqlite::memory:").await.unwrap();