diff --git a/gpodder/src/models.rs b/gpodder/src/models.rs index b68e73b..cde5c50 100644 --- a/gpodder/src/models.rs +++ b/gpodder/src/models.rs @@ -1,12 +1,13 @@ use chrono::{DateTime, Utc}; -#[derive(Clone)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct User { pub id: i64, pub username: String, pub password_hash: String, } +#[derive(Clone, Debug, PartialEq, Eq)] pub enum DeviceType { Desktop, Laptop, @@ -15,6 +16,7 @@ pub enum DeviceType { Other, } +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Device { pub id: String, pub caption: String, @@ -22,11 +24,13 @@ pub struct Device { pub subscriptions: i64, } +#[derive(Clone, Debug, PartialEq, Eq)] pub struct DevicePatch { pub caption: Option, pub r#type: Option, } +#[derive(Clone, Debug, PartialEq, Eq)] pub enum EpisodeActionType { Download, Play { @@ -38,6 +42,7 @@ pub enum EpisodeActionType { New, } +#[derive(Clone, Debug, PartialEq, Eq)] pub struct EpisodeAction { pub podcast: String, pub episode: String, @@ -47,12 +52,14 @@ pub struct EpisodeAction { pub action: EpisodeActionType, } +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Session { pub id: i64, pub last_seen: DateTime, pub user: User, } +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Subscription { pub url: String, pub time_changed: DateTime, diff --git a/gpodder_sqlite/src/lib.rs b/gpodder_sqlite/src/lib.rs index 4b6ccbb..f2f0082 100644 --- a/gpodder_sqlite/src/lib.rs +++ b/gpodder_sqlite/src/lib.rs @@ -94,3 +94,16 @@ pub fn initialize_db(path: impl AsRef, run_migrations: bool) -> Result Result { + let manager = ConnectionManager::::new(":memory:"); + let pool = Pool::builder() + .connection_customizer(Box::new(AddQueryDebugLogs)) + .build(manager)?; + + if run_migrations { + pool.get()?.run_pending_migrations(MIGRATIONS).unwrap(); + } + + Ok(pool) +} diff --git a/gpodder_sqlite/src/repository/mod.rs b/gpodder_sqlite/src/repository/mod.rs index 6a80b28..7fab3bf 100644 --- a/gpodder_sqlite/src/repository/mod.rs +++ b/gpodder_sqlite/src/repository/mod.rs @@ -24,4 +24,10 @@ impl SqliteRepository { Ok(Self { pool }) } + + pub fn in_memory() -> Result { + let pool = super::initialize_db_in_memory(true)?; + + Ok(Self { pool }) + } } diff --git a/gpodder_sqlite/tests/auth_test.rs b/gpodder_sqlite/tests/auth_test.rs new file mode 100644 index 0000000..b35f2c1 --- /dev/null +++ b/gpodder_sqlite/tests/auth_test.rs @@ -0,0 +1,47 @@ +mod common; + +use gpodder::{AuthStore, Session}; +use gpodder_sqlite::SqliteRepository; + +#[test] +fn test_create_user() { + let store = SqliteRepository::in_memory().unwrap(); + + let user = store.get_user("test1"); + assert!(user.is_ok()); + assert_eq!(user.unwrap(), None); + + let new_user = store.insert_user("test1", "dummyhash"); + + assert!(new_user.is_ok()); + + let new_user = new_user.unwrap(); + assert_eq!(new_user.username, "test1"); + assert_eq!(new_user.password_hash, "dummyhash"); + + let user = store.get_user("test1"); + + assert!(user.is_ok()); + assert_eq!(user.unwrap(), Some(new_user)); +} + +#[test] +fn test_create_session() { + let (store, users) = common::setup(); + + let session = store.get_session(123).expect("operation shouldn't fail"); + assert_eq!(session, None); + + let new_session = Session { + id: 123, + last_seen: chrono::Utc::now(), + user: users[0].clone(), + }; + + store + .insert_session(&new_session) + .expect("insert session shouldn't fail"); + + let session = store.get_session(123).expect("operation shouldn't fail"); + assert_eq!(session, Some(new_session)); +} diff --git a/gpodder_sqlite/tests/common.rs b/gpodder_sqlite/tests/common.rs new file mode 100644 index 0000000..37b5cc4 --- /dev/null +++ b/gpodder_sqlite/tests/common.rs @@ -0,0 +1,16 @@ +use gpodder::{AuthStore, User}; +use gpodder_sqlite::SqliteRepository; + +pub fn setup() -> (SqliteRepository, Vec) { + let store = SqliteRepository::in_memory().unwrap(); + let mut users = Vec::new(); + + for i in 0..4 { + let username = format!("test{}", i + 1); + let password_hash = format!("dummyhash{}", i + 1); + + users.push(store.insert_user(&username, &password_hash).unwrap()); + } + + (store, users) +}