use budgeting_app_core::{models::date_utc::DateUtc, queries, traits::nowlike::Nowlike}; use diesel::{Connection, SqliteConnection}; use crate::common::{fakes::{budget_update::make_fake_budget_update_builder, category::make_fake_category}, test_context::TestContext}; fn insert_prerequisite_data(connection: &mut SqliteConnection) { let categories = [make_fake_category(0), make_fake_category(1)]; let _ = queries::categories::insert_categories(&categories, connection); } #[test] fn when_insert_budget_updates_then_returns_num_budget_updates() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); insert_prerequisite_data(connection); let budget_updates = [ make_fake_budget_update_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .category_id(0) .build().unwrap(), make_fake_budget_update_builder(1) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) .category_id(0) .build().unwrap(), ]; let num_budget_updates_inserted = queries::budget_updates::insert_budget_updates(&budget_updates, connection).unwrap(); assert_eq!(num_budget_updates_inserted, 2); } #[test] fn given_budget_update_when_insert_budget_update_same_category_and_same_date_then_return_err() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); insert_prerequisite_data(connection); let budget_updates_1 = [ make_fake_budget_update_builder(0) .category_id(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build().unwrap() ]; let _ = queries::budget_updates::insert_budget_updates(&budget_updates_1, connection); let budget_updates_2 = [ make_fake_budget_update_builder(1) .category_id(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build().unwrap() ]; let result = queries::budget_updates::insert_budget_updates(&budget_updates_2, connection); assert!(result.is_err()); } #[test] fn given_budget_update_when_insert_budget_update_different_category_and_same_date_then_return_num_budget_updates_inserted() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); insert_prerequisite_data(connection); let budget_updates_1 = [ make_fake_budget_update_builder(0) .category_id(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build().unwrap() ]; let _ = queries::budget_updates::insert_budget_updates(&budget_updates_1, connection); let budget_updates_2 = [ make_fake_budget_update_builder(1) .category_id(1) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build().unwrap() ]; let result = queries::budget_updates::insert_budget_updates(&budget_updates_2, connection); assert!(result.is_ok()); assert_eq!(result.unwrap(), 1); } #[test] fn given_budget_update_when_insert_budget_update_same_category_and_different_date_then_return_num_budget_updates_inserted() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); insert_prerequisite_data(connection); let budget_updates_1 = [ make_fake_budget_update_builder(0) .category_id(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .build().unwrap() ]; let _ = queries::budget_updates::insert_budget_updates(&budget_updates_1, connection); let budget_updates_2 = [ make_fake_budget_update_builder(1) .category_id(0) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) .build().unwrap() ]; let result = queries::budget_updates::insert_budget_updates(&budget_updates_2, connection); assert!(result.is_ok()); assert_eq!(result.unwrap(), 1); } #[test] fn given_budget_updates_when_get_all_budget_updates_then_return_budget_updates() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); insert_prerequisite_data(connection); let budget_updates = [ make_fake_budget_update_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .category_id(0) .build().unwrap(), make_fake_budget_update_builder(1) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) .category_id(0) .build().unwrap(), ]; let _ = queries::budget_updates::insert_budget_updates(&budget_updates, connection).unwrap(); let budget_updates_in_db = queries::budget_updates::get_all_budget_updates(connection).unwrap(); assert_eq!(budget_updates_in_db.len(), budget_updates.len()); assert_eq!(budget_updates_in_db[0], budget_updates[0]); assert_eq!(budget_updates_in_db[1], budget_updates[1]); for budget_update in &budget_updates { assert!(budget_updates_in_db.iter().any(|budget_update_in_db| budget_update_in_db.eq(&budget_update))); } for budget_update_in_db in budget_updates_in_db { assert!(budget_updates.iter().any(|budget_update| budget_update.eq(&budget_update_in_db))); } } #[test] fn given_budget_updates_when_delete_all_budget_updates_then_return_num_of_budget_updates() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); insert_prerequisite_data(connection); let budget_updates = [ make_fake_budget_update_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .category_id(0) .build().unwrap(), make_fake_budget_update_builder(1) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) .category_id(0) .build().unwrap(), ]; let _ = queries::budget_updates::insert_budget_updates(&budget_updates, connection).unwrap(); let num_budget_updates_deleted = queries::budget_updates::delete_all_budget_updates(connection).unwrap(); assert_eq!(num_budget_updates_deleted, budget_updates.len()); } #[test] fn given_deleted_budget_updates_when_get_all_budget_updates_then_return_empty() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); insert_prerequisite_data(connection); let budget_updates = [ make_fake_budget_update_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) .category_id(0) .build().unwrap(), make_fake_budget_update_builder(1) .date(DateUtc::from_ymd(2020, 12, 26).unwrap()) .category_id(0) .build().unwrap(), ]; let _ = queries::budget_updates::insert_budget_updates(&budget_updates, connection).unwrap(); let _ = queries::budget_updates::delete_all_budget_updates(connection).unwrap(); let budget_updates_returned = queries::budget_updates::get_all_budget_updates(connection).unwrap(); assert_eq!(budget_updates_returned.len(), 0); } #[test] fn given_no_budget_updates_when_get_first_with_date_then_return_none() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); let first_with_date = queries::budget_updates::get_first_budget_update_with_date(&DateUtc::now(), connection).unwrap(); assert!(first_with_date.is_none()); } #[test] fn given_budget_update_when_get_first_with_date_then_return_budget_update() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); insert_prerequisite_data(connection); let date: DateUtc = "2024-10-28".parse().unwrap(); let budget_update = make_fake_budget_update_builder(0).date(date.clone()).build().unwrap(); let _ = queries::budget_updates::insert_budget_updates(&[budget_update.clone()], connection).unwrap(); let first_with_date = queries::budget_updates::get_first_budget_update_with_date(&date, connection).unwrap(); assert!(first_with_date.is_some()); assert_eq!(first_with_date.unwrap(), budget_update); } #[test] fn given_budget_update_when_get_first_with_different_date_then_return_none() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); insert_prerequisite_data(connection); let date: DateUtc = "2024-10-28".parse().unwrap(); let different_date: DateUtc = "2024-10-29".parse().unwrap(); let budget_update = make_fake_budget_update_builder(0).date(date.clone()).build().unwrap(); let _ = queries::budget_updates::insert_budget_updates(&[budget_update.clone()], connection).unwrap(); let first_with_date = queries::budget_updates::get_first_budget_update_with_date( &different_date, connection ).unwrap(); assert!(first_with_date.is_none()); } #[test] fn given_many_budget_updates_when_get_first_with_date_then_return_any_with_date() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); insert_prerequisite_data(connection); let budget_updates = [ make_fake_budget_update_builder(0).date("2024-12-25".parse().unwrap()).build().unwrap(), make_fake_budget_update_builder(1).date("2020-12-26".parse().unwrap()).build().unwrap(), make_fake_budget_update_builder(2).date("2020-12-27".parse().unwrap()).build().unwrap(), make_fake_budget_update_builder(3).date("2020-12-28".parse().unwrap()).build().unwrap(), make_fake_budget_update_builder(4).date("2020-12-29".parse().unwrap()).build().unwrap(), make_fake_budget_update_builder(5).date("2020-12-30".parse().unwrap()).build().unwrap(), make_fake_budget_update_builder(6).date("2020-12-31".parse().unwrap()).build().unwrap(), make_fake_budget_update_builder(7).date("2021-01-01".parse().unwrap()).build().unwrap(), ]; let _ = queries::budget_updates::insert_budget_updates(&budget_updates, connection).unwrap(); let first_with_date = queries::budget_updates::get_first_budget_update_with_date( &"2024-12-25".parse().unwrap(), connection, ).unwrap(); assert!(first_with_date.is_some()); assert_eq!(first_with_date.unwrap(), budget_updates[0]); } #[test] fn given_many_budget_updates_when_get_most_recent_with_category_id_then_return_correct_date() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); insert_prerequisite_data(connection); let budget_updates = [ make_fake_budget_update_builder(0) .category_id(0) .date("2024-12-25".parse().unwrap()) .build().unwrap(), make_fake_budget_update_builder(1) .category_id(0) .date("2020-12-26".parse().unwrap()) .build().unwrap(), make_fake_budget_update_builder(2) .category_id(1) .date("2020-12-27".parse().unwrap()) .build().unwrap(), ]; let _ = queries::budget_updates::insert_budget_updates(&budget_updates, connection).unwrap(); let most_recent_with_category = queries::budget_updates::get_most_recent_budget_update_date_with_category_id( 0, connection, ); assert!(most_recent_with_category.is_ok()); let most_recent_with_category = most_recent_with_category.unwrap(); assert!(most_recent_with_category .is_some()); let most_recent_with_category = most_recent_with_category.unwrap(); assert_eq!(most_recent_with_category, budget_updates[1].date); } #[test] fn given_budget_update_when_get_most_recent_with_different_category_id_then_return_none() { let context = TestContext::new(); let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); insert_prerequisite_data(connection); let budget_updates = [ make_fake_budget_update_builder(0) .category_id(1) .date("2020-12-27".parse().unwrap()) .build().unwrap(), ]; let _ = queries::budget_updates::insert_budget_updates(&budget_updates, connection).unwrap(); let most_recent_with_category = queries::budget_updates::get_most_recent_budget_update_date_with_category_id( 0, connection, ); assert!(most_recent_with_category.is_ok()); let most_recent_with_category = most_recent_with_category.unwrap(); assert!(most_recent_with_category .is_none()); }