use anyhow::Result; use schist_models::{ budget_drip::BudgetDrip, category::Category, }; pub fn calculate_budgets_accrual(category: &Category, budget_drips: &[BudgetDrip]) -> Result { Ok(budget_drips .iter() .filter(|bd| bd.category_id == category.id) .map(|bd| Into::::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); } }