diff options
| author | Joe Carstairs <me@joeac.net> | 2025-08-15 16:02:40 +0000 |
|---|---|---|
| committer | joeac <me@joeac.net> | 2025-08-15 16:02:40 +0000 |
| commit | 703496a49315f7b67442abf0e0df3c41d3605d3b (patch) | |
| tree | 8e92f3842710162f3b26e910eb931950c1049f07 /schist_core/schist_queries/src/utils | |
| parent | 8d714f760bd0349560d464583a151a04a19de1c9 (diff) | |
task-012 (#2)
Co-authored-by: Joe Carstairs <jcarstairs@scottlogic.com>
Reviewed-on: https://git.joeac.net/joeac/schist/pulls/2
Co-authored-by: Joe Carstairs <me@joeac.net>
Co-committed-by: Joe Carstairs <me@joeac.net>
Diffstat (limited to 'schist_core/schist_queries/src/utils')
4 files changed, 119 insertions, 94 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 index 5194084..e238613 100644 --- a/schist_core/schist_queries/src/utils/calculate_bucket_balance.rs +++ b/schist_core/schist_queries/src/utils/calculate_bucket_balance.rs @@ -1,31 +1,26 @@ use anyhow::Result; -use schist_models::{bucket::Bucket, budget_drip::BudgetDrip}; +use schist_models::{bucket::Bucket, drip::Drip}; -use super::{calculate_budgets_accrual, find_by_id_or}; +use super::{find_by_id_or, sum_drips_for_bucket}; 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], + budget_drips: &[Drip], ) -> 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 - ) + let budget_accruals_sum = sum_drips_for_bucket(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 schist_fakes::{bucket::make_fake_bucket, drip::make_fake_drip_builder}; use super::calculate_bucket_balance; @@ -45,9 +40,11 @@ mod test { 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 budget_drips = [make_fake_drip_builder(0) + .amount(100) + .bucket_id(1) + .build() + .unwrap()]; let result = calculate_bucket_balance( &bucket, @@ -108,11 +105,31 @@ mod test { 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(), + make_fake_drip_builder(0) + .amount(77) + .bucket_id(0) + .build() + .unwrap(), + make_fake_drip_builder(0) + .amount(77) + .bucket_id(0) + .build() + .unwrap(), + make_fake_drip_builder(0) + .amount(77) + .bucket_id(0) + .build() + .unwrap(), + make_fake_drip_builder(0) + .amount(77) + .bucket_id(0) + .build() + .unwrap(), + make_fake_drip_builder(0) + .amount(77) + .bucket_id(0) + .build() + .unwrap(), ]; let result = calculate_bucket_balance( diff --git a/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs b/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs deleted file mode 100644 index cbf7180..0000000 --- a/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs +++ /dev/null @@ -1,72 +0,0 @@ -use anyhow::Result; -use schist_models::{ - budget_drip::BudgetDrip, - bucket::Bucket, -}; - -pub fn calculate_budgets_accrual(bucket: &Bucket, budget_drips: &[BudgetDrip]) -> Result<i64> { - Ok(budget_drips - .iter() - .filter(|bd| bd.bucket_id == bucket.id) - .map(|bd| Into::<i64>::into(bd.quantity)) - .sum() - ) -} - -#[cfg(test)] -mod test { - 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 bucket = make_fake_bucket(0); - let 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_bucket_then_return_zero() { - let bucket = make_fake_bucket(0); - let budget_drips = [ - make_fake_budget_drip_builder(0).quantity(100).bucket_id(1).build().unwrap(), - ]; - - let result = calculate_budgets_accrual(&bucket, &budget_drips); - - assert!(result.is_ok()); - assert_eq!(result.unwrap(), 0_i64); - } - - #[test] - fn when_one_budget_drip_then_return_quantity() { - let bucket = make_fake_bucket(0); - let budget_drips = [ - make_fake_budget_drip_builder(0).quantity(100).bucket_id(0).build().unwrap(), - ]; - - let result = calculate_budgets_accrual(&bucket, &budget_drips); - - assert!(result.is_ok()); - assert_eq!(result.unwrap(), 100); - } - - #[test] - fn when_two_budget_drips_then_return_sum() { - let bucket = make_fake_bucket(0); - let budget_drips = [ - 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(&bucket, &budget_drips); - - assert!(result.is_ok()); - assert_eq!(result.unwrap(), 220); - } -} diff --git a/schist_core/schist_queries/src/utils/mod.rs b/schist_core/schist_queries/src/utils/mod.rs index c006a9b..6b47b48 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_bucket_balance; mod find_by_id_or; +mod sum_drips_for_bucket; -use calculate_budgets_accrual::calculate_budgets_accrual; +use sum_drips_for_bucket::sum_drips_for_bucket; pub use calculate_bucket_balance::calculate_bucket_balance; pub use find_by_id_or::find_by_id_or; diff --git a/schist_core/schist_queries/src/utils/sum_drips_for_bucket.rs b/schist_core/schist_queries/src/utils/sum_drips_for_bucket.rs new file mode 100644 index 0000000..76f7988 --- /dev/null +++ b/schist_core/schist_queries/src/utils/sum_drips_for_bucket.rs @@ -0,0 +1,80 @@ +use anyhow::Result; +use schist_models::{bucket::Bucket, drip::Drip}; + +pub fn sum_drips_for_bucket(bucket: &Bucket, budget_drips: &[Drip]) -> Result<i64> { + Ok(budget_drips + .iter() + .filter(|bd| bd.bucket_id == bucket.id) + .map(|bd| Into::<i64>::into(bd.amount)) + .sum()) +} + +#[cfg(test)] +mod test { + use schist_fakes::{bucket::make_fake_bucket, drip::make_fake_drip_builder}; + + use super::sum_drips_for_bucket; + + #[test] + fn when_no_budget_drips_then_return_zero() { + let bucket = make_fake_bucket(0); + let budget_drips = []; + + let result = sum_drips_for_bucket(&bucket, &budget_drips); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); + } + + #[test] + fn when_one_budget_drip_for_another_bucket_then_return_zero() { + let bucket = make_fake_bucket(0); + let budget_drips = [make_fake_drip_builder(0) + .amount(100) + .bucket_id(1) + .build() + .unwrap()]; + + let result = sum_drips_for_bucket(&bucket, &budget_drips); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); + } + + #[test] + fn when_one_budget_drip_then_return_quantity() { + let bucket = make_fake_bucket(0); + let budget_drips = [make_fake_drip_builder(0) + .amount(100) + .bucket_id(0) + .build() + .unwrap()]; + + let result = sum_drips_for_bucket(&bucket, &budget_drips); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 100); + } + + #[test] + fn when_two_budget_drips_then_return_sum() { + let bucket = make_fake_bucket(0); + let budget_drips = [ + make_fake_drip_builder(0) + .amount(100) + .bucket_id(0) + .build() + .unwrap(), + make_fake_drip_builder(1) + .amount(120) + .bucket_id(0) + .build() + .unwrap(), + ]; + + let result = sum_drips_for_bucket(&bucket, &budget_drips); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 220); + } +} |
