diff options
Diffstat (limited to 'backend/core/tests')
| -rw-r--r-- | backend/core/tests/queries/budget_updates.rs | 133 | ||||
| -rw-r--r-- | backend/core/tests/queries/categories.rs | 68 |
2 files changed, 155 insertions, 46 deletions
diff --git a/backend/core/tests/queries/budget_updates.rs b/backend/core/tests/queries/budget_updates.rs index 503e51c..6641b25 100644 --- a/backend/core/tests/queries/budget_updates.rs +++ b/backend/core/tests/queries/budget_updates.rs @@ -1,18 +1,19 @@ -use budgeting_app_core::{models::date_utc::DateUtc, queries, traits::nowlike::Nowlike}; +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 insert_prerequisite_data(connection: &mut SqliteConnection) { - let categories = [make_fake_category(0), make_fake_category(1)]; +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(); - insert_prerequisite_data(connection); + let _categories = given_categories(connection); let budget_updates = [ make_fake_budget_update_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) @@ -33,7 +34,7 @@ fn when_insert_budget_updates_then_returns_num_budget_updates() { 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 _categories = given_categories(connection); let budget_updates_1 = [ make_fake_budget_update_builder(0) @@ -58,7 +59,7 @@ fn given_budget_update_when_insert_budget_update_same_category_and_same_date_the 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 _categories = given_categories(connection); let budget_updates_1 = [ make_fake_budget_update_builder(0) @@ -84,7 +85,7 @@ fn given_budget_update_when_insert_budget_update_different_category_and_same_dat 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 _categories = given_categories(connection); let budget_updates_1 = [ make_fake_budget_update_builder(0) @@ -110,7 +111,7 @@ fn given_budget_update_when_insert_budget_update_same_category_and_different_dat 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 _categories = given_categories(connection); let budget_updates = [ make_fake_budget_update_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) @@ -140,7 +141,7 @@ fn given_budget_updates_when_get_all_budget_updates_then_return_budget_updates() 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 _categories = given_categories(connection); let budget_updates = [ make_fake_budget_update_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) @@ -162,7 +163,7 @@ fn given_budget_updates_when_delete_all_budget_updates_then_return_num_of_budget 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 _categories = given_categories(connection); let budget_updates = [ make_fake_budget_update_builder(0) .date(DateUtc::from_ymd(2020, 12, 25).unwrap()) @@ -182,79 +183,127 @@ fn given_deleted_budget_updates_when_get_all_budget_updates_then_return_empty() } #[test] -fn given_no_budget_updates_when_get_first_with_date_then_return_none() { +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 = queries::budget_updates::get_first_budget_update_with_date(&DateUtc::now(), connection).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.is_none()); + 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(); - insert_prerequisite_data(connection); + 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 = queries::budget_updates::get_first_budget_update_with_date(&date, 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.is_some()); - assert_eq!(first_with_date.unwrap(), budget_update); + assert!(first_with_date_and_category_id.is_none()); } #[test] -fn given_budget_update_when_get_first_with_different_date_then_return_none() { +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(); - insert_prerequisite_data(connection); + 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 = queries::budget_updates::get_first_budget_update_with_date( - &different_date, - 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.is_none()); + assert!(first_with_date_and_category_id.is_none()); } #[test] -fn given_many_budget_updates_when_get_first_with_date_then_return_any_with_date() { +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(); - insert_prerequisite_data(connection); + let _categories = given_categories(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(), + 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 = queries::budget_updates::get_first_budget_update_with_date( - &"2024-12-25".parse().unwrap(), - 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.is_some()); - assert_eq!(first_with_date.unwrap(), budget_updates[0]); + 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(); - insert_prerequisite_data(connection); + let _categories = given_categories(connection); let budget_updates = [ make_fake_budget_update_builder(0) .category_id(0) @@ -286,7 +335,7 @@ fn given_many_budget_updates_when_get_most_recent_with_category_id_then_return_c 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 _categories = given_categories(connection); let budget_updates = [ make_fake_budget_update_builder(0) .category_id(1) diff --git a/backend/core/tests/queries/categories.rs b/backend/core/tests/queries/categories.rs index 104cedc..4ab3f68 100644 --- a/backend/core/tests/queries/categories.rs +++ b/backend/core/tests/queries/categories.rs @@ -1,7 +1,8 @@ -use budgeting_app_core::{models::{account::Account, category::Category, transaction::Transaction, transaction_categorisation::TransactionCategorisation}, queries}; +use budgeting_app_core::{models::{account::Account, budget::Budget, budget_update::BudgetUpdate, category::Category, date_utc::DateUtc, transaction::Transaction, transaction_categorisation::TransactionCategorisation}, queries}; +use chrono::{Days, Utc}; use diesel::{Connection, SqliteConnection}; -use crate::common::{fakes::{account::make_fake_account, category::make_fake_category, transaction::make_fake_transaction_builder, transaction_categorisation::make_fake_transaction_categorisation_builder}, test_context::TestContext}; +use crate::common::{fakes::{account::make_fake_account, budget_update::make_fake_budget_update_builder, category::make_fake_category, transaction::make_fake_transaction_builder, transaction_categorisation::make_fake_transaction_categorisation_builder}, test_context::TestContext}; fn given_categories(connection: &mut SqliteConnection) -> Vec<Category> { let categories = vec![make_fake_category(0), make_fake_category(1)]; @@ -41,6 +42,20 @@ fn given_transaction_categorisations(connection: &mut SqliteConnection) -> Vec<T transaction_categorisations } +fn given_budget_updates(connection: &mut SqliteConnection) -> Vec<BudgetUpdate> { + let now = Utc::now(); + let twenty_days_ago = DateUtc::from(now.checked_sub_days(Days::new(20)).unwrap()); + let ten_days_ago = DateUtc::from(now.checked_sub_days(Days::new(10)).unwrap()); + let budget_updates = vec![ + make_fake_budget_update_builder(0).category_id(0).date(twenty_days_ago.clone()).new_budget(100).new_period(1).build().unwrap(), + make_fake_budget_update_builder(1).category_id(0).date(ten_days_ago.clone()).new_budget(50).new_period(2).build().unwrap(), + make_fake_budget_update_builder(2).category_id(1).date(twenty_days_ago.clone()).new_budget(90).new_period(4).build().unwrap(), + make_fake_budget_update_builder(3).category_id(1).date(ten_days_ago.clone()).new_budget(40).new_period(8).build().unwrap(), + ]; + let _ = queries::budget_updates::insert_budget_updates(&budget_updates, connection); + budget_updates +} + #[test] fn when_insert_categories_then_returns_num_categories() { let context = TestContext::new(); @@ -153,6 +168,51 @@ fn given_categories_when_get_all_ids_then_return_all_ids() { } #[test] -fn todo3() { - todo!("test get_most_recent_per_category_id"); +fn given_categories_and_no_budget_updates_when_get_most_recent_budget_per_category_id_then_return_none() { + let context = TestContext::new(); + let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); + let categories = given_categories(connection); + + let most_recent_budget_per_category_id = queries::categories::get_most_recent_category_budget_per_category_id(connection); + + assert!(most_recent_budget_per_category_id.is_ok()); + let most_recent_budget_per_category_id = most_recent_budget_per_category_id.unwrap(); + assert_eq!(categories.len(), most_recent_budget_per_category_id.len()); + for category in categories { + let most_recent_budget = most_recent_budget_per_category_id.iter().find(|b| b.category_id == category.id); + assert!(most_recent_budget.is_some()); + let most_recent_budget = most_recent_budget.unwrap(); + assert!(most_recent_budget.budget.is_none()); + } +} + +#[test] +fn given_categories_and_budget_updates_when_get_most_recent_budget_per_category_id_then_return_most_recent_budget() { + let context = TestContext::new(); + let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); + let categories = given_categories(connection); + let budget_updates = given_budget_updates(connection); + + let most_recent_budget_per_category_id = queries::categories::get_most_recent_category_budget_per_category_id(connection); + + assert!(most_recent_budget_per_category_id.is_ok()); + let most_recent_budget_per_category_id = most_recent_budget_per_category_id.unwrap(); + assert_eq!(categories.len(), most_recent_budget_per_category_id.len()); + for category in categories { + let most_recent_budget_update = budget_updates + .iter() + .filter(|bu| bu.category_id == category.id) + .max_by_key(|bu| bu.date.clone()) + .unwrap(); + + let most_recent_budget = most_recent_budget_per_category_id.iter().find(|b| b.category_id == category.id); + assert!(most_recent_budget.is_some()); + let most_recent_budget = most_recent_budget.unwrap(); + assert!(most_recent_budget.budget.is_some()); + let most_recent_budget = most_recent_budget.budget.unwrap(); + assert_eq!(most_recent_budget, Budget { + quantity: most_recent_budget_update.new_budget, + period: most_recent_budget_update.new_period, + }); + } } |
