mod common; use common::test_context::TestContext; use diesel::{Connection, SqliteConnection}; use schist_fakes::{bucket::make_fake_bucket, drip::make_fake_drip_builder}; use schist_models::{Bucket, DateUtc}; use schist_queries as queries; fn given_buckets(connection: &mut SqliteConnection) -> Vec { let buckets = vec![make_fake_bucket(0), make_fake_bucket(1)]; let _ = queries::buckets::insert_buckets(&buckets, connection); buckets } #[test] fn when_insert_budget_drips_then_returns_num_budget_drips() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); let _buckets = given_buckets(connection); let budget_drips = [ make_fake_drip_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .bucket_id(0) .build() .unwrap(), make_fake_drip_builder(1) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) .bucket_id(0) .build() .unwrap(), ]; let num_budget_drips_inserted = queries::drips::insert_drips(&budget_drips, connection).unwrap(); assert_eq!(num_budget_drips_inserted, 2); } #[test] fn given_budget_drip_when_insert_budget_drip_same_bucket_and_same_date_then_return_err() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); let _buckets = given_buckets(connection); let budget_drips_1 = [make_fake_drip_builder(0) .bucket_id(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build() .unwrap()]; let _ = queries::drips::insert_drips(&budget_drips_1, connection); let budget_drips_2 = [make_fake_drip_builder(1) .bucket_id(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build() .unwrap()]; let result = queries::drips::insert_drips(&budget_drips_2, connection); assert!(result.is_err()); } #[test] fn given_budget_drip_when_insert_budget_drip_different_bucket_and_same_date_then_return_num_budget_drips_inserted( ) { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); let _buckets = given_buckets(connection); let budget_drips_1 = [make_fake_drip_builder(0) .bucket_id(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build() .unwrap()]; let _ = queries::drips::insert_drips(&budget_drips_1, connection); let budget_drips_2 = [make_fake_drip_builder(1) .bucket_id(1) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build() .unwrap()]; let result = queries::drips::insert_drips(&budget_drips_2, connection); assert!(result.is_ok()); assert_eq!(result.unwrap(), 1); } #[test] fn given_budget_drip_when_insert_budget_drip_same_bucket_and_different_date_then_return_num_budget_drips_inserted( ) { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); let _buckets = given_buckets(connection); let budget_drips_1 = [make_fake_drip_builder(0) .bucket_id(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build() .unwrap()]; let _ = queries::drips::insert_drips(&budget_drips_1, connection); let budget_drips_2 = [make_fake_drip_builder(1) .bucket_id(0) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) .build() .unwrap()]; let result = queries::drips::insert_drips(&budget_drips_2, connection); assert!(result.is_ok()); assert_eq!(result.unwrap(), 1); } #[test] fn given_budget_drips_when_get_all_budget_drips_then_return_budget_drips() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); let _buckets = given_buckets(connection); let budget_drips = [ make_fake_drip_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .bucket_id(0) .build() .unwrap(), make_fake_drip_builder(1) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) .bucket_id(0) .build() .unwrap(), ]; let _ = queries::drips::insert_drips(&budget_drips, connection).unwrap(); let budget_drips_in_db = queries::drips::get_all_drips(connection).unwrap(); assert_eq!(budget_drips_in_db.len(), budget_drips.len()); assert_eq!(budget_drips_in_db[0], budget_drips[0]); assert_eq!(budget_drips_in_db[1], budget_drips[1]); for budget_drip in &budget_drips { assert!(budget_drips_in_db .iter() .any(|budget_drip_in_db| budget_drip_in_db.eq(&budget_drip))); } for budget_drip_in_db in budget_drips_in_db { assert!(budget_drips .iter() .any(|budget_drip| budget_drip.eq(&budget_drip_in_db))); } } #[test] fn given_budget_drips_when_delete_all_budget_drips_then_return_num_of_budget_drips() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); let _buckets = given_buckets(connection); let budget_drips = [ make_fake_drip_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .bucket_id(0) .build() .unwrap(), make_fake_drip_builder(1) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) .bucket_id(0) .build() .unwrap(), ]; let _ = queries::drips::insert_drips(&budget_drips, connection).unwrap(); let num_budget_drips_deleted = queries::drips::delete_all_drips(connection).unwrap(); assert_eq!(num_budget_drips_deleted, budget_drips.len()); } #[test] fn given_deleted_budget_drips_when_get_all_budget_drips_then_return_empty() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); let _buckets = given_buckets(connection); let budget_drips = [ make_fake_drip_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .bucket_id(0) .build() .unwrap(), make_fake_drip_builder(1) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) .bucket_id(0) .build() .unwrap(), ]; let _ = queries::drips::insert_drips(&budget_drips, connection).unwrap(); let _ = queries::drips::delete_all_drips(connection).unwrap(); let budget_drips_returned = queries::drips::get_all_drips(connection).unwrap(); assert_eq!(budget_drips_returned.len(), 0); }