diff options
| author | Joe Carstairs <jcarstairs@scottlogic.com> | 2025-08-13 18:44:20 +0100 |
|---|---|---|
| committer | Joe Carstairs <jcarstairs@scottlogic.com> | 2025-08-13 18:44:20 +0100 |
| commit | 8d714f760bd0349560d464583a151a04a19de1c9 (patch) | |
| tree | 7810edb6371251bfc109a30f8ca9e37fba001d73 /schist_core/schist_queries/src/utils | |
| parent | 6495038aba28c332050768cecf062418a25d5a96 (diff) | |
rename category -> bucket
Diffstat (limited to 'schist_core/schist_queries/src/utils')
4 files changed, 149 insertions, 149 deletions
diff --git a/schist_core/schist_queries/src/utils/calculate_bucket_balance.rs b/schist_core/schist_queries/src/utils/calculate_bucket_balance.rs new file mode 100644 index 0000000..5194084 --- /dev/null +++ b/schist_core/schist_queries/src/utils/calculate_bucket_balance.rs @@ -0,0 +1,130 @@ +use anyhow::Result; +use schist_models::{bucket::Bucket, budget_drip::BudgetDrip}; + +use super::{calculate_budgets_accrual, find_by_id_or}; + +pub fn calculate_bucket_balance( + bucket: &Bucket, + transaction_sums: &[(i32, i64)], + bucket_transfer_from_sums: &[(i32, i64)], + bucket_transfer_to_sums: &[(i32, i64)], + budget_drips: &[BudgetDrip], +) -> Result<i64> { + let transaction_sum = find_by_id_or(transaction_sums, bucket.id, 0); + let bucket_transfer_from_sum = find_by_id_or(bucket_transfer_from_sums, bucket.id, 0); + let bucket_transfer_to_sum = find_by_id_or(bucket_transfer_to_sums, bucket.id, 0); + let budget_accruals_sum = calculate_budgets_accrual(bucket, budget_drips)?; + + Ok( + transaction_sum + + budget_accruals_sum + + bucket_transfer_to_sum + - bucket_transfer_from_sum + ) +} + +#[cfg(test)] +mod test { + use schist_fakes::{budget_drip::make_fake_budget_drip_builder, bucket::make_fake_bucket}; + + use super::calculate_bucket_balance; + + #[test] + fn when_no_data_then_returns_zero() { + let bucket = make_fake_bucket(0); + + let result = calculate_bucket_balance(&bucket, &[], &[], &[], &[]); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); + } + + #[test] + fn when_data_only_for_another_bucket_then_returns_zero() { + let bucket = make_fake_bucket(0); + let transaction_sums = [(1, 100)]; + let bucket_transfer_from_sums = [(1, 91)]; + let bucket_transfer_to_sums = [(2, 79)]; + let budget_drips = [ + make_fake_budget_drip_builder(0).quantity(100).bucket_id(1).build().unwrap(), + ]; + + let result = calculate_bucket_balance( + &bucket, + &transaction_sums, + &bucket_transfer_from_sums, + &bucket_transfer_to_sums, + &budget_drips, + ); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); + } + + #[test] + fn when_transaction_sum_is_zero_then_returns_zero() { + let bucket = make_fake_bucket(0); + let transaction_sums = [(0, 0)]; + let bucket_transfer_from_sums = []; + let bucket_transfer_to_sums = []; + let budget_drips = []; + + let result = calculate_bucket_balance( + &bucket, + &transaction_sums, + &bucket_transfer_from_sums, + &bucket_transfer_to_sums, + &budget_drips, + ); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); + } + + #[test] + fn when_bucket_transfers_are_zero_then_returns_zero() { + let bucket = make_fake_bucket(0); + let transaction_sums = []; + let bucket_transfer_from_sums = [(0, 0)]; + let bucket_transfer_to_sums = [(0, 0)]; + let budget_drips = []; + + let result = calculate_bucket_balance( + &bucket, + &transaction_sums, + &bucket_transfer_from_sums, + &bucket_transfer_to_sums, + &budget_drips, + ); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); + } + + #[test] + fn when_some_data_then_calculates_as_expected() { + let bucket = make_fake_bucket(0); + let transaction_sums = [(0, 100)]; + let bucket_transfer_from_sums = [(0, 91)]; + let bucket_transfer_to_sums = [(0, 79)]; + let budget_drips = [ + make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(), + ]; + + let result = calculate_bucket_balance( + &bucket, + &transaction_sums, + &bucket_transfer_from_sums, + &bucket_transfer_to_sums, + &budget_drips, + ); + + let expected_result = 100 + (-91) + 79 + 77 * 5; + assert!(result.is_ok()); + assert_eq!(result.unwrap(), expected_result); + } +} diff --git a/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs b/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs index ca82953..cbf7180 100644 --- a/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs +++ b/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs @@ -1,13 +1,13 @@ use anyhow::Result; use schist_models::{ budget_drip::BudgetDrip, - category::Category, + bucket::Bucket, }; -pub fn calculate_budgets_accrual(category: &Category, budget_drips: &[BudgetDrip]) -> Result<i64> { +pub fn calculate_budgets_accrual(bucket: &Bucket, budget_drips: &[BudgetDrip]) -> Result<i64> { Ok(budget_drips .iter() - .filter(|bd| bd.category_id == category.id) + .filter(|bd| bd.bucket_id == bucket.id) .map(|bd| Into::<i64>::into(bd.quantity)) .sum() ) @@ -15,29 +15,29 @@ pub fn calculate_budgets_accrual(category: &Category, budget_drips: &[BudgetDrip #[cfg(test)] mod test { - use schist_fakes::{budget_drip::make_fake_budget_drip_builder, category::make_fake_category}; + use schist_fakes::{budget_drip::make_fake_budget_drip_builder, bucket::make_fake_bucket}; use super::calculate_budgets_accrual; #[test] fn when_no_budget_drips_then_return_zero() { - let category = make_fake_category(0); + let bucket = make_fake_bucket(0); let budget_drips = []; - let result = calculate_budgets_accrual(&category, &budget_drips); + let result = calculate_budgets_accrual(&bucket, &budget_drips); assert!(result.is_ok()); assert_eq!(result.unwrap(), 0_i64); } #[test] - fn when_one_budget_drip_for_another_category_then_return_zero() { - let category = make_fake_category(0); + fn when_one_budget_drip_for_another_bucket_then_return_zero() { + let bucket = make_fake_bucket(0); let budget_drips = [ - make_fake_budget_drip_builder(0).quantity(100).category_id(1).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(100).bucket_id(1).build().unwrap(), ]; - let result = calculate_budgets_accrual(&category, &budget_drips); + let result = calculate_budgets_accrual(&bucket, &budget_drips); assert!(result.is_ok()); assert_eq!(result.unwrap(), 0_i64); @@ -45,12 +45,12 @@ mod test { #[test] fn when_one_budget_drip_then_return_quantity() { - let category = make_fake_category(0); + let bucket = make_fake_bucket(0); let budget_drips = [ - make_fake_budget_drip_builder(0).quantity(100).category_id(0).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(100).bucket_id(0).build().unwrap(), ]; - let result = calculate_budgets_accrual(&category, &budget_drips); + let result = calculate_budgets_accrual(&bucket, &budget_drips); assert!(result.is_ok()); assert_eq!(result.unwrap(), 100); @@ -58,13 +58,13 @@ mod test { #[test] fn when_two_budget_drips_then_return_sum() { - let category = make_fake_category(0); + let bucket = make_fake_bucket(0); let budget_drips = [ - make_fake_budget_drip_builder(0).quantity(100).category_id(0).build().unwrap(), - make_fake_budget_drip_builder(1).quantity(120).category_id(0).build().unwrap(), + make_fake_budget_drip_builder(0).quantity(100).bucket_id(0).build().unwrap(), + make_fake_budget_drip_builder(1).quantity(120).bucket_id(0).build().unwrap(), ]; - let result = calculate_budgets_accrual(&category, &budget_drips); + let result = calculate_budgets_accrual(&bucket, &budget_drips); assert!(result.is_ok()); assert_eq!(result.unwrap(), 220); diff --git a/schist_core/schist_queries/src/utils/calculate_category_balance.rs b/schist_core/schist_queries/src/utils/calculate_category_balance.rs deleted file mode 100644 index 73e80cd..0000000 --- a/schist_core/schist_queries/src/utils/calculate_category_balance.rs +++ /dev/null @@ -1,130 +0,0 @@ -use anyhow::Result; -use schist_models::{budget_drip::BudgetDrip, category::Category}; - -use super::{calculate_budgets_accrual, find_by_id_or}; - -pub fn calculate_category_balance( - category: &Category, - transaction_sums: &[(i32, i64)], - category_transfer_from_sums: &[(i32, i64)], - category_transfer_to_sums: &[(i32, i64)], - budget_drips: &[BudgetDrip], -) -> Result<i64> { - let transaction_sum = find_by_id_or(transaction_sums, category.id, 0); - let category_transfer_from_sum = find_by_id_or(category_transfer_from_sums, category.id, 0); - let category_transfer_to_sum = find_by_id_or(category_transfer_to_sums, category.id, 0); - let budget_accruals_sum = calculate_budgets_accrual(category, budget_drips)?; - - Ok( - transaction_sum - + budget_accruals_sum - + category_transfer_to_sum - - category_transfer_from_sum - ) -} - -#[cfg(test)] -mod test { - use schist_fakes::{budget_drip::make_fake_budget_drip_builder, category::make_fake_category}; - - use super::calculate_category_balance; - - #[test] - fn when_no_data_then_returns_zero() { - let category = make_fake_category(0); - - let result = calculate_category_balance(&category, &[], &[], &[], &[]); - - assert!(result.is_ok()); - assert_eq!(result.unwrap(), 0_i64); - } - - #[test] - fn when_data_only_for_another_category_then_returns_zero() { - let category = make_fake_category(0); - let transaction_sums = [(1, 100)]; - let category_transfer_from_sums = [(1, 91)]; - let category_transfer_to_sums = [(2, 79)]; - let budget_drips = [ - make_fake_budget_drip_builder(0).quantity(100).category_id(1).build().unwrap(), - ]; - - let result = calculate_category_balance( - &category, - &transaction_sums, - &category_transfer_from_sums, - &category_transfer_to_sums, - &budget_drips, - ); - - assert!(result.is_ok()); - assert_eq!(result.unwrap(), 0_i64); - } - - #[test] - fn when_transaction_sum_is_zero_then_returns_zero() { - let category = make_fake_category(0); - let transaction_sums = [(0, 0)]; - let category_transfer_from_sums = []; - let category_transfer_to_sums = []; - let budget_drips = []; - - let result = calculate_category_balance( - &category, - &transaction_sums, - &category_transfer_from_sums, - &category_transfer_to_sums, - &budget_drips, - ); - - assert!(result.is_ok()); - assert_eq!(result.unwrap(), 0_i64); - } - - #[test] - fn when_category_transfers_are_zero_then_returns_zero() { - let category = make_fake_category(0); - let transaction_sums = []; - let category_transfer_from_sums = [(0, 0)]; - let category_transfer_to_sums = [(0, 0)]; - let budget_drips = []; - - let result = calculate_category_balance( - &category, - &transaction_sums, - &category_transfer_from_sums, - &category_transfer_to_sums, - &budget_drips, - ); - - assert!(result.is_ok()); - assert_eq!(result.unwrap(), 0_i64); - } - - #[test] - fn when_some_data_then_calculates_as_expected() { - let category = make_fake_category(0); - let transaction_sums = [(0, 100)]; - let category_transfer_from_sums = [(0, 91)]; - let category_transfer_to_sums = [(0, 79)]; - let budget_drips = [ - make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(), - make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(), - make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(), - make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(), - make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(), - ]; - - let result = calculate_category_balance( - &category, - &transaction_sums, - &category_transfer_from_sums, - &category_transfer_to_sums, - &budget_drips, - ); - - let expected_result = 100 + (-91) + 79 + 77 * 5; - assert!(result.is_ok()); - assert_eq!(result.unwrap(), expected_result); - } -} diff --git a/schist_core/schist_queries/src/utils/mod.rs b/schist_core/schist_queries/src/utils/mod.rs index f2653d8..c006a9b 100644 --- a/schist_core/schist_queries/src/utils/mod.rs +++ b/schist_core/schist_queries/src/utils/mod.rs @@ -1,8 +1,8 @@ mod calculate_budgets_accrual; -mod calculate_category_balance; +mod calculate_bucket_balance; mod find_by_id_or; use calculate_budgets_accrual::calculate_budgets_accrual; -pub use calculate_category_balance::calculate_category_balance; +pub use calculate_bucket_balance::calculate_bucket_balance; pub use find_by_id_or::find_by_id_or; |
