#![feature(assert_matches)] // integration tests use std::assert_matches::assert_matches; use chrono::Utc; use sandbox::{models::user::{User, UserStatus}, repositories::user_repository::UserRepository}; use sqlx::{types::Json, Pool, Sqlite}; #[sqlx::test(fixtures("../src/migrations/all.sql"))] async fn test_user_repository_create_read_update_delete(pool: Pool) -> sqlx::Result<()> { pool.acquire().await?; // Create let user_repo = UserRepository::new(sandbox::db::Database(pool)); let new_user = User { id: "ffffffff-0000-4000-0000-0000000000c9".into(), handle: "caravage".into(), full_name: Some("Michelangelo Merisi da Caravaggio".into()), prefered_color: Some(0xff00ff.into()), last_login_at: Some(Utc::now()), status: UserStatus::Invited, groups: Json(vec!["artists".into()]), avatar_bytes: vec![0x00] }; assert_matches!( user_repo.insert(&new_user).await, Ok(()) ); assert_matches!( user_repo.get_by_id("ffffffff-0000-4000-0000-0000000000c9".into()).await, Ok(User { .. }) ); assert_matches!( user_repo.get_by_id("ffffffff-0000-4040-0000-000000000000".into()).await, Err(sqlx::Error::RowNotFound) ); // Insert Many let bunch_of_users: Vec = (0..10).map(|pid| User { id: format!("ffffffff-0000-4000-0010-{:0>8}", pid), handle: format!("user num {}", pid), full_name: None, prefered_color: None, last_login_at: None, status: UserStatus::Invited, groups: Json(vec![]), avatar_bytes: vec![] }).collect(); assert_matches!( user_repo.insert_many(&bunch_of_users).await, Ok(()) ); // Read many all let read_all_res = user_repo.get_all().await; assert_matches!( read_all_res, Ok(..) ); let all_users = read_all_res.unwrap(); assert_eq!(all_users.len(), 11); // Update let mut updated_user = new_user.clone(); updated_user.status = UserStatus::Disabled; assert_matches!( user_repo.update_by_id(&new_user.id, &updated_user).await, Ok(()) ); let user_from_db = user_repo.get_by_id("ffffffff-0000-4000-0000-0000000000c9".into()).await.unwrap(); assert_eq!(user_from_db.status, UserStatus::Disabled); // Delete assert_matches!( user_repo.delete_by_id(&new_user.id).await, Ok(()) ); assert_matches!( user_repo.get_by_id("ffffffff-0000-4000-0000-0000000000c9".into()).await, Err(sqlx::Error::RowNotFound) ); Ok(()) }