diff options
| author | Joe Carstairs <me@joeac.net> | 2024-12-12 08:28:04 +0000 |
|---|---|---|
| committer | Joe Carstairs <me@joeac.net> | 2024-12-12 08:28:04 +0000 |
| commit | 54894f9de9bad4fecb2a116d59a03cdd003f84c0 (patch) | |
| tree | 6ce5517cecf23d4e93d7a381a374e1fa6c810cee /schist_queries/src/utils/calculate_budgets_accrual.rs | |
| parent | 8a30bcbdf9264d235bf93da3df8e170cfde53d02 (diff) | |
Moves rust workspace to root
Diffstat (limited to 'schist_queries/src/utils/calculate_budgets_accrual.rs')
| -rw-r--r-- | schist_queries/src/utils/calculate_budgets_accrual.rs | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/schist_queries/src/utils/calculate_budgets_accrual.rs b/schist_queries/src/utils/calculate_budgets_accrual.rs new file mode 100644 index 0000000..ca82953 --- /dev/null +++ b/schist_queries/src/utils/calculate_budgets_accrual.rs @@ -0,0 +1,72 @@ +use anyhow::Result; +use schist_models::{ + budget_drip::BudgetDrip, + category::Category, +}; + +pub fn calculate_budgets_accrual(category: &Category, budget_drips: &[BudgetDrip]) -> Result<i64> { + Ok(budget_drips + .iter() + .filter(|bd| bd.category_id == category.id) + .map(|bd| Into::<i64>::into(bd.quantity)) + .sum() + ) +} + +#[cfg(test)] +mod test { + use schist_fakes::{budget_drip::make_fake_budget_drip_builder, category::make_fake_category}; + + use super::calculate_budgets_accrual; + + #[test] + fn when_no_budget_drips_then_return_zero() { + let category = make_fake_category(0); + let budget_drips = []; + + let result = calculate_budgets_accrual(&category, &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); + let budget_drips = [ + make_fake_budget_drip_builder(0).quantity(100).category_id(1).build().unwrap(), + ]; + + let result = calculate_budgets_accrual(&category, &budget_drips); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); + } + + #[test] + fn when_one_budget_drip_then_return_quantity() { + let category = make_fake_category(0); + let budget_drips = [ + make_fake_budget_drip_builder(0).quantity(100).category_id(0).build().unwrap(), + ]; + + let result = calculate_budgets_accrual(&category, &budget_drips); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 100); + } + + #[test] + fn when_two_budget_drips_then_return_sum() { + let category = make_fake_category(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(), + ]; + + let result = calculate_budgets_accrual(&category, &budget_drips); + + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 220); + } +} |
