diff options
| author | Joe Carstairs <me@joeac.net> | 2024-11-17 09:23:28 +0000 |
|---|---|---|
| committer | Joe Carstairs <me@joeac.net> | 2024-11-17 09:23:28 +0000 |
| commit | 1ae19eb3315c40e3f9062592c27fa76c11cf626c (patch) | |
| tree | 09d9ce380795971f4b50e1d4b0ca3c57c9e1db1a /rust/core/tests/queries/budget_updates.rs | |
| parent | 1a494937021561595d0fb29e26fb707aef9e55de (diff) | |
Renames workspace folder
Diffstat (limited to 'rust/core/tests/queries/budget_updates.rs')
| -rw-r--r-- | rust/core/tests/queries/budget_updates.rs | 354 |
1 files changed, 354 insertions, 0 deletions
diff --git a/rust/core/tests/queries/budget_updates.rs b/rust/core/tests/queries/budget_updates.rs new file mode 100644 index 0000000..6641b25 --- /dev/null +++ b/rust/core/tests/queries/budget_updates.rs @@ -0,0 +1,354 @@ +use budgeting_app_core::{models::{category::Category, 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 given_categories(connection: &mut SqliteConnection) -> Vec<Category> { + let categories = vec![make_fake_category(0), make_fake_category(1)]; + let _ = queries::categories::insert_categories(&categories, connection); + categories +} + +#[test] +fn when_insert_budget_updates_then_returns_num_budget_updates() { + let context = TestContext::new(); + let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); + let _categories = given_categories(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(); + let _categories = given_categories(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(); + let _categories = given_categories(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(); + let _categories = given_categories(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(); + let _categories = given_categories(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(); + let _categories = given_categories(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(); + let _categories = given_categories(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_categories_when_get_first_with_date_and_category_id_then_return_none() { + let context = TestContext::new(); + let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); + + let first_with_date_and_category_id = + queries::budget_updates::get_first_budget_update_with_date_and_category_id( + &DateUtc::now(), + 0, + connection, + ).unwrap(); + + assert!(first_with_date_and_category_id.is_none()); +} + +#[test] +fn given_no_budget_updates_when_get_first_with_date_and_category_id_then_return_none() { + let context = TestContext::new(); + let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); + let _categories = given_categories(connection); + + let first_with_date_and_category_id = + queries::budget_updates::get_first_budget_update_with_date_and_category_id( + &DateUtc::now(), + 0, + connection, + ).unwrap(); + + assert!(first_with_date_and_category_id.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(); + let _categories = given_categories(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_and_category_id = + queries::budget_updates::get_first_budget_update_with_date_and_category_id( + &date, + 0, + connection, + ).unwrap(); + + assert!(first_with_date_and_category_id.is_some()); + assert_eq!(first_with_date_and_category_id.unwrap(), budget_update); +} + +#[test] +fn given_budget_update_when_get_first_with_date_and_different_category_id_then_return_none() { + let context = TestContext::new(); + let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); + let _categories = given_categories(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_and_category_id = + queries::budget_updates::get_first_budget_update_with_date_and_category_id( + &different_date, + 2, + connection + ).unwrap(); + + assert!(first_with_date_and_category_id.is_none()); +} + +#[test] +fn given_budget_update_when_get_first_with_different_date_and_category_id_then_return_none() { + let context = TestContext::new(); + let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); + let _categories = given_categories(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_and_category_id = + queries::budget_updates::get_first_budget_update_with_date_and_category_id( + &different_date, + 0, + connection + ).unwrap(); + + assert!(first_with_date_and_category_id.is_none()); +} + +#[test] +fn given_many_budget_updates_when_get_first_with_date_and_category_id_then_return_any_with_date() { + let context = TestContext::new(); + let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); + let _categories = given_categories(connection); + let budget_updates = [ + make_fake_budget_update_builder(0).date("2024-12-25".parse().unwrap()).category_id(0).build().unwrap(), + make_fake_budget_update_builder(1).date("2024-12-25".parse().unwrap()).category_id(1).build().unwrap(), + make_fake_budget_update_builder(2).date("2020-12-26".parse().unwrap()).category_id(0).build().unwrap(), + make_fake_budget_update_builder(3).date("2020-12-26".parse().unwrap()).category_id(1).build().unwrap(), + make_fake_budget_update_builder(4).date("2020-12-27".parse().unwrap()).category_id(0).build().unwrap(), + make_fake_budget_update_builder(5).date("2020-12-27".parse().unwrap()).category_id(1).build().unwrap(), + ]; + let _ = queries::budget_updates::insert_budget_updates(&budget_updates, connection).unwrap(); + + let first_with_date_and_category_id = + queries::budget_updates::get_first_budget_update_with_date_and_category_id( + &"2024-12-25".parse().unwrap(), + 0, + connection, + ).unwrap(); + + assert!(first_with_date_and_category_id.is_some()); + assert_eq!(first_with_date_and_category_id.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(); + let _categories = given_categories(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(); + let _categories = given_categories(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()); +} |
