From d11998bf9e565cf6ffb4dbed36f678c035843d3d Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Thu, 2 Feb 2023 01:31:35 +0800 Subject: [PATCH] More tests --- tests/loader_tests.rs | 193 ++++++++++++++++++------------------------ 1 file changed, 81 insertions(+), 112 deletions(-) diff --git a/tests/loader_tests.rs b/tests/loader_tests.rs index 01c3b466..e519be42 100644 --- a/tests/loader_tests.rs +++ b/tests/loader_tests.rs @@ -1,7 +1,7 @@ pub mod common; pub use common::{bakery_chain::*, setup::*, TestContext}; -pub use sea_orm::{entity::*, query::*, DbErr, FromQueryResult}; +pub use sea_orm::{entity::*, query::*, DbConn, DbErr, FromQueryResult}; #[sea_orm_macros::test] #[cfg(any( @@ -13,28 +13,9 @@ async fn loader_load_one() -> Result<(), DbErr> { let ctx = TestContext::new("loader_test_load_one").await; create_tables(&ctx.db).await?; - let bakery = bakery::ActiveModel { - name: Set("SeaSide Bakery".to_owned()), - profit_margin: Set(10.4), - ..Default::default() - } - .insert(&ctx.db) - .await - .expect("could not insert bakery"); + let bakery = insert_bakery(&ctx.db, "SeaSide Bakery").await?; - let baker_1 = baker::ActiveModel { - name: Set("Baker 1".to_owned()), - contact_details: Set(serde_json::json!({ - "mobile": "+61424000000", - "home": "0395555555", - "address": "12 Test St, Testville, Vic, Australia" - })), - bakery_id: Set(Some(bakery.id)), - ..Default::default() - } - .insert(&ctx.db) - .await - .expect("could not insert baker"); + let baker_1 = insert_baker(&ctx.db, "Baker 1", bakery.id).await?; let baker_2 = baker::ActiveModel { name: Set("Baker 2".to_owned()), @@ -73,38 +54,10 @@ async fn loader_load_one_complex() -> Result<(), DbErr> { let ctx = TestContext::new("loader_test_load_one").await; create_tables(&ctx.db).await?; - let bakery = bakery::ActiveModel { - name: Set("SeaSide Bakery".to_owned()), - profit_margin: Set(10.4), - ..Default::default() - } - .insert(&ctx.db) - .await - .expect("could not insert bakery"); + let bakery = insert_bakery(&ctx.db, "SeaSide Bakery").await?; - let baker_1 = baker::ActiveModel { - name: Set("Baker 1".to_owned()), - contact_details: Set(serde_json::json!({ - "mobile": "+61424000000", - "home": "0395555555", - "address": "12 Test St, Testville, Vic, Australia" - })), - bakery_id: Set(Some(bakery.id)), - ..Default::default() - } - .insert(&ctx.db) - .await - .expect("could not insert baker"); - - let baker_2 = baker::ActiveModel { - name: Set("Baker 2".to_owned()), - contact_details: Set(serde_json::json!({})), - bakery_id: Set(Some(bakery.id)), - ..Default::default() - } - .insert(&ctx.db) - .await - .expect("could not insert baker"); + let baker_1 = insert_baker(&ctx.db, "Baker 1", bakery.id).await?; + let baker_2 = insert_baker(&ctx.db, "Baker 2", bakery.id).await?; let bakers = baker::Entity::find() .all(&ctx.db) @@ -133,67 +86,14 @@ async fn loader_load_many() -> Result<(), DbErr> { let ctx = TestContext::new("loader_test_load_many").await; create_tables(&ctx.db).await?; - let bakery_1 = bakery::ActiveModel { - name: Set("SeaSide Bakery".to_owned()), - profit_margin: Set(10.4), - ..Default::default() - } - .insert(&ctx.db) - .await - .expect("could not insert bakery"); + let bakery_1 = insert_bakery(&ctx.db, "SeaSide Bakery").await?; + let bakery_2 = insert_bakery(&ctx.db, "Offshore Bakery").await?; - let bakery_2 = bakery::ActiveModel { - name: Set("Offshore Bakery".to_owned()), - profit_margin: Set(10.4), - ..Default::default() - } - .insert(&ctx.db) - .await - .expect("could not insert bakery"); + let baker_1 = insert_baker(&ctx.db, "Baker 1", bakery_1.id).await?; + let baker_2 = insert_baker(&ctx.db, "Baker 2", bakery_1.id).await?; - let baker_1 = baker::ActiveModel { - name: Set("Baker 1".to_owned()), - contact_details: Set(serde_json::json!({ - "mobile": "+61424000000", - "home": "0395555555", - "address": "12 Test St, Testville, Vic, Australia" - })), - bakery_id: Set(Some(bakery_1.id)), - ..Default::default() - } - .insert(&ctx.db) - .await - .expect("could not insert baker"); - - let baker_2 = baker::ActiveModel { - name: Set("Baker 2".to_owned()), - contact_details: Set(serde_json::json!({})), - bakery_id: Set(Some(bakery_1.id)), - ..Default::default() - } - .insert(&ctx.db) - .await - .expect("could not insert baker"); - - let baker_3 = baker::ActiveModel { - name: Set("John".to_owned()), - contact_details: Set(serde_json::json!({})), - bakery_id: Set(Some(bakery_2.id)), - ..Default::default() - } - .insert(&ctx.db) - .await - .expect("could not insert baker"); - - let baker_4 = baker::ActiveModel { - name: Set("Baker 4".to_owned()), - contact_details: Set(serde_json::json!({})), - bakery_id: Set(Some(bakery_2.id)), - ..Default::default() - } - .insert(&ctx.db) - .await - .expect("could not insert baker"); + let baker_3 = insert_baker(&ctx.db, "John", bakery_2.id).await?; + let baker_4 = insert_baker(&ctx.db, "Baker 4", bakery_2.id).await?; let bakeries = bakery::Entity::find() .all(&ctx.db) @@ -230,3 +130,72 @@ async fn loader_load_many() -> Result<(), DbErr> { Ok(()) } + +#[sea_orm_macros::test] +#[cfg(any( + feature = "sqlx-mysql", + feature = "sqlx-sqlite", + feature = "sqlx-postgres" +))] +async fn loader_load_many_many() -> Result<(), DbErr> { + let ctx = TestContext::new("loader_test_load_many_many").await; + create_tables(&ctx.db).await?; + + let bakery_1 = insert_bakery(&ctx.db, "SeaSide Bakery").await?; + let bakery_2 = insert_bakery(&ctx.db, "Offshore Bakery").await?; + + let baker_1 = insert_baker(&ctx.db, "John", bakery_1.id).await?; + let baker_2 = insert_baker(&ctx.db, "Jane", bakery_1.id).await?; + let baker_3 = insert_baker(&ctx.db, "Peter", bakery_2.id).await?; + + let cake_1 = insert_cake(&ctx.db, "Cheesecake", bakery_1.id).await?; + let cake_2 = insert_cake(&ctx.db, "Chocolate", bakery_2.id).await?; + let cake_3 = insert_cake(&ctx.db, "Chiffon", bakery_2.id).await?; + + let bakeries = bakery::Entity::find().all(&ctx.db).await?; + let bakers = bakeries.load_many(baker::Entity::find(), &ctx.db).await?; + let cakes = bakeries.load_many(cake::Entity::find(), &ctx.db).await?; + + println!("{bakers:?}"); + println!("{bakeries:?}"); + println!("{cakes:?}"); + + assert_eq!(bakeries, [bakery_1, bakery_2]); + assert_eq!(bakers, [vec![baker_1, baker_2], vec![baker_3]]); + assert_eq!(cakes, [vec![cake_1], vec![cake_2, cake_3]]); + + Ok(()) +} + +pub async fn insert_bakery(db: &DbConn, name: &str) -> Result { + bakery::ActiveModel { + name: Set(name.to_owned()), + profit_margin: Set(1.0), + ..Default::default() + } + .insert(db) + .await +} + +pub async fn insert_baker(db: &DbConn, name: &str, bakery_id: i32) -> Result { + baker::ActiveModel { + name: Set(name.to_owned()), + contact_details: Set(serde_json::json!({})), + bakery_id: Set(Some(bakery_id)), + ..Default::default() + } + .insert(db) + .await +} + +pub async fn insert_cake(db: &DbConn, name: &str, bakery_id: i32) -> Result { + cake::ActiveModel { + name: Set(name.to_owned()), + price: Set(rust_decimal::Decimal::ONE), + gluten_free: Set(false), + bakery_id: Set(Some(bakery_id)), + ..Default::default() + } + .insert(db) + .await +}