diff --git a/Cargo.lock b/Cargo.lock index c647eaf..07091e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -837,11 +837,20 @@ dependencies = [ "diesel", "diesel_migrations", "gpodder", + "gpodder_test", "libsqlite3-sys", "rand", "tracing", ] +[[package]] +name = "gpodder_test" +version = "0.3.0" +dependencies = [ + "chrono", + "gpodder", +] + [[package]] name = "half" version = "2.6.0" diff --git a/Cargo.toml b/Cargo.toml index 4a6594e..e721f7c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,8 @@ resolver = '2' members = [ 'otter', 'gpodder', - 'gpodder_sqlite' + 'gpodder_sqlite', + "gpodder_test" ] [workspace.package] diff --git a/gpodder_sqlite/Cargo.toml b/gpodder_sqlite/Cargo.toml index 75620b8..3161597 100644 --- a/gpodder_sqlite/Cargo.toml +++ b/gpodder_sqlite/Cargo.toml @@ -27,3 +27,4 @@ features = [ [dev-dependencies] criterion = "0.5.1" +gpodder_test = { path = "../gpodder_test" } diff --git a/gpodder_sqlite/src/repository/auth.rs b/gpodder_sqlite/src/repository/auth.rs index 0072938..cf55d94 100644 --- a/gpodder_sqlite/src/repository/auth.rs +++ b/gpodder_sqlite/src/repository/auth.rs @@ -249,3 +249,32 @@ impl gpodder::GpodderAuthStore for SqliteRepository { } } } + +#[cfg(test)] +mod tests { + use crate::SqliteRepository; + + #[test] + fn test_create_user() { + let store = SqliteRepository::in_memory().unwrap(); + gpodder_test::auth::test_create_user(store); + } + + #[test] + fn test_remove_session() { + let store = SqliteRepository::in_memory().unwrap(); + gpodder_test::auth::test_remove_session(store); + } + + #[test] + fn test_refresh_session() { + let store = SqliteRepository::in_memory().unwrap(); + gpodder_test::auth::test_refresh_session(store); + } + + #[test] + fn test_remove_old_sessions() { + let store = SqliteRepository::in_memory().unwrap(); + gpodder_test::auth::test_remove_old_sessions(store); + } +} diff --git a/gpodder_sqlite/src/repository/device.rs b/gpodder_sqlite/src/repository/device.rs index 98ffc12..f41f3d6 100644 --- a/gpodder_sqlite/src/repository/device.rs +++ b/gpodder_sqlite/src/repository/device.rs @@ -297,3 +297,14 @@ impl gpodder::GpodderDeviceStore for SqliteRepository { .map_err(AuthErr::from) } } + +#[cfg(test)] +mod tests { + use crate::SqliteRepository; + + #[test] + fn test_insert_devices() { + let store = SqliteRepository::in_memory().unwrap(); + gpodder_test::device::test_insert_devices(store); + } +} diff --git a/gpodder_sqlite/tests/common.rs b/gpodder_sqlite/tests/common.rs deleted file mode 100644 index 379bef8..0000000 --- a/gpodder_sqlite/tests/common.rs +++ /dev/null @@ -1,30 +0,0 @@ -use gpodder::{GpodderAuthStore, User}; -use gpodder_sqlite::SqliteRepository; - -use rand::{Rng, distributions::Alphanumeric}; - -use std::path::PathBuf; - -pub fn setup() -> (PathBuf, SqliteRepository, Vec) { - let fname: String = rand::thread_rng() - .sample_iter(Alphanumeric) - .take(10) - .map(char::from) - .collect(); - let path = std::env::temp_dir().join(fname); - let store = SqliteRepository::from_path(&path).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()); - } - - (path, store, users) -} - -pub fn teardown(path: PathBuf) { - let _ = std::fs::remove_file(path); -} diff --git a/gpodder_test/Cargo.toml b/gpodder_test/Cargo.toml new file mode 100644 index 0000000..ce25f45 --- /dev/null +++ b/gpodder_test/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "gpodder_test" +version.workspace = true +edition.workspace = true + +[dependencies] +gpodder = { path = "../gpodder" } + +chrono.workspace = true diff --git a/gpodder_sqlite/tests/auth_test.rs b/gpodder_test/src/auth.rs similarity index 71% rename from gpodder_sqlite/tests/auth_test.rs rename to gpodder_test/src/auth.rs index 53d10a5..685bdca 100644 --- a/gpodder_sqlite/tests/auth_test.rs +++ b/gpodder_test/src/auth.rs @@ -1,13 +1,7 @@ -mod common; - use chrono::{SubsecRound, TimeDelta}; use gpodder::{GpodderAuthStore, Session}; -use gpodder_sqlite::SqliteRepository; - -#[test] -fn test_create_user() { - let store = SqliteRepository::in_memory().unwrap(); +pub fn test_create_user(store: impl GpodderAuthStore) { let user = store.get_user("test1"); assert!(user.is_ok()); assert_eq!(user.unwrap(), None); @@ -26,33 +20,8 @@ fn test_create_user() { assert_eq!(user.unwrap(), Some(new_user)); } -#[test] -fn test_create_session() { - let (path, 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, - user_agent: None, - last_seen: chrono::Utc::now().trunc_subsecs(0), - 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)); - - common::teardown(path); -} - -#[test] -fn test_remove_session() { - let (path, store, users) = common::setup(); +pub fn test_remove_session(store: impl GpodderAuthStore) { + let users = super::create_test_users(&store); let new_session = Session { id: 123, @@ -80,13 +49,10 @@ fn test_remove_session() { .expect("get session shouldn't fail") .is_none() ); - - common::teardown(path); } -#[test] -fn test_refresh_session() { - let (path, store, users) = common::setup(); +pub fn test_refresh_session(store: impl GpodderAuthStore) { + let users = super::create_test_users(&store); let mut new_session = Session { id: 123, @@ -109,13 +75,10 @@ fn test_refresh_session() { store.get_session(123).expect("get session shouldn't fail"), Some(new_session) ); - - common::teardown(path); } -#[test] -fn test_remove_old_sessions() { - let (path, store, users) = common::setup(); +pub fn test_remove_old_sessions(store: impl GpodderAuthStore) { + let users = super::create_test_users(&store); let now = chrono::Utc::now().trunc_subsecs(0); let timestamps = [ @@ -153,6 +116,4 @@ fn test_remove_old_sessions() { user: users[0].clone(), }) ); - - common::teardown(path); } diff --git a/gpodder_sqlite/tests/device_test.rs b/gpodder_test/src/device.rs similarity index 70% rename from gpodder_sqlite/tests/device_test.rs rename to gpodder_test/src/device.rs index 369246e..7fe11b3 100644 --- a/gpodder_sqlite/tests/device_test.rs +++ b/gpodder_test/src/device.rs @@ -1,10 +1,7 @@ -mod common; +use gpodder::{DevicePatch, DeviceType, GpodderStore}; -use gpodder::{DevicePatch, DeviceType, GpodderDeviceStore}; - -#[test] -fn test_insert_devices() { - let (path, store, users) = common::setup(); +pub fn test_insert_devices(store: impl GpodderStore) { + let users = super::create_test_users(&store); store.devices_for_user(&users[0]).unwrap(); @@ -30,14 +27,9 @@ fn test_insert_devices() { ) .expect("update info shouldn't fail"); - let devices = store.devices_for_user(&users[0]); - assert!(matches!(devices, Ok(_))); - - let devices = devices.unwrap(); + let devices = store.devices_for_user(&users[0]).unwrap(); assert_eq!(devices.len(), 1); assert_eq!(devices[0].caption, "caption1"); assert_eq!(devices[0].r#type, DeviceType::Other); - - common::teardown(path); } diff --git a/gpodder_test/src/lib.rs b/gpodder_test/src/lib.rs new file mode 100644 index 0000000..43dc4d6 --- /dev/null +++ b/gpodder_test/src/lib.rs @@ -0,0 +1,17 @@ +use gpodder::{GpodderAuthStore, User}; + +pub mod auth; +pub mod device; + +fn create_test_users(store: &impl GpodderAuthStore) -> Vec { + 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()); + } + + users +}