diff options
| author | Joe Carstairs <me@joeac.net> | 2024-10-30 07:27:13 +0000 |
|---|---|---|
| committer | Joe Carstairs <me@joeac.net> | 2024-10-30 08:50:45 +0000 |
| commit | 828b9ae9f6217f7e5e97ec704134c786dd401bad (patch) | |
| tree | c920b8874682e89ba05b6e1ca20275bfd5878d87 /backend/core/src/utils/calculate_budgets_accrual.rs | |
| parent | 6e9f0069f5d1e4cfbf7f9feb8536795a78c818f6 (diff) | |
Separates date_utc and datetime_utc
Diffstat (limited to 'backend/core/src/utils/calculate_budgets_accrual.rs')
| -rw-r--r-- | backend/core/src/utils/calculate_budgets_accrual.rs | 67 |
1 files changed, 30 insertions, 37 deletions
diff --git a/backend/core/src/utils/calculate_budgets_accrual.rs b/backend/core/src/utils/calculate_budgets_accrual.rs index 22061ee..56171ca 100644 --- a/backend/core/src/utils/calculate_budgets_accrual.rs +++ b/backend/core/src/utils/calculate_budgets_accrual.rs @@ -1,10 +1,9 @@ -use crate::models::{ - budget_update::BudgetUpdate, - category::Category, - date_time_utc::DateTimeUtc -}; +use anyhow::Result; +use crate::{models::{ + budget_update::BudgetUpdate, category::Category, date_utc::DateUtc +}, traits::nowlike::Nowlike}; -pub fn calculate_budgets_accrual(category: &Category, budget_updates: &[BudgetUpdate]) -> i64 { +pub fn calculate_budgets_accrual(category: &Category, budget_updates: &[BudgetUpdate]) -> Result<i64> { let mut budget_updates = budget_updates .iter() .filter(|bu| bu.category_id == category.id) @@ -13,28 +12,30 @@ pub fn calculate_budgets_accrual(category: &Category, budget_updates: &[BudgetUp budget_updates.reverse(); let mut budgets_accrual = 0.0_f64; - let mut calculated_back_to_date = DateTimeUtc::now(); + let mut calculated_back_to_date = DateUtc::now(); for budget_update in budget_updates { let days_on_this_budget = calculated_back_to_date.day_diff(&budget_update.date); if days_on_this_budget == 0_u32 { - continue; + return Err(anyhow::Error::msg(format!( + "failed to calculate budgets accrual since two budget updates had the same date ({})", + budget_update.date, + ))); } let budget_per_day = budget_update.new_budget as f64 / budget_update.new_period as f64; budgets_accrual += days_on_this_budget as f64 * budget_per_day; calculated_back_to_date = budget_update.date.clone(); } - budgets_accrual.floor() as i64 + Ok(budgets_accrual.floor() as i64) } #[cfg(test)] mod test { - use chrono::{Days, Timelike, Utc}; + use chrono::{Days, Utc}; use crate::{ - models::{budget_update::BudgetUpdate, category::Category, date_time_utc::DateTimeUtc}, - utils::calculate_budgets_accrual, + models::{budget_update::BudgetUpdate, category::Category, date_utc::DateUtc}, traits::nowlike::Nowlike, utils::calculate_budgets_accrual }; #[test] @@ -47,7 +48,8 @@ mod test { let result = calculate_budgets_accrual(&category, &budget_updates); - assert_eq!(result, 0_i64); + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); } #[test] @@ -59,14 +61,15 @@ mod test { let budget_updates = [BudgetUpdate { id: 0, category_id: 1, - date: DateTimeUtc::now(), + date: DateUtc::now(), new_budget: 100, new_period: 1, }]; let result = calculate_budgets_accrual(&category, &budget_updates); - assert_eq!(result, 0_i64); + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 0_i64); } #[test] @@ -78,14 +81,15 @@ mod test { let budget_updates = [BudgetUpdate { id: 0, category_id: 0, - date: DateTimeUtc::new(&Utc::now().checked_sub_days(Days::new(120)).unwrap()), + date: DateUtc::from(Utc::now().checked_sub_days(Days::new(120)).unwrap()), new_budget: 100, new_period: 1, }]; let result = calculate_budgets_accrual(&category, &budget_updates); - assert_eq!(result, 12_000); + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 12_000); } #[test] @@ -98,14 +102,14 @@ mod test { BudgetUpdate { id: 0, category_id: 0, - date: DateTimeUtc::new(&Utc::now().checked_sub_days(Days::new(60)).unwrap()), + date: DateUtc::from(&Utc::now().checked_sub_days(Days::new(60)).unwrap()), new_budget: 200, new_period: 1, }, BudgetUpdate { id: 0, category_id: 0, - date: DateTimeUtc::new(&Utc::now().checked_sub_days(Days::new(120)).unwrap()), + date: DateUtc::from(&Utc::now().checked_sub_days(Days::new(120)).unwrap()), new_budget: 100, new_period: 1, }, @@ -113,11 +117,12 @@ mod test { let result = calculate_budgets_accrual(&category, &budget_updates); - assert_eq!(result, 18_000); + assert!(result.is_ok()); + assert_eq!(result.unwrap(), 18_000); } #[test] - fn when_two_budget_updates_on_same_day_then_uses_latest_only() { + fn when_two_budget_updates_on_same_day_then_returns_err() { let category = Category { id: 0, name: String::from("Groceries"), @@ -126,26 +131,14 @@ mod test { BudgetUpdate { id: 0, category_id: 0, - date: DateTimeUtc::new( - &Utc::now() - .checked_sub_days(Days::new(120)) - .unwrap() - .with_hour(13) - .unwrap(), - ), + date: DateUtc::from_ymd(2020, 12, 25).unwrap(), new_budget: 200, new_period: 1, }, BudgetUpdate { id: 0, category_id: 0, - date: DateTimeUtc::new( - &Utc::now() - .checked_sub_days(Days::new(120)) - .unwrap() - .with_hour(12) - .unwrap(), - ), + date: DateUtc::from_ymd(2020, 12, 25).unwrap(), new_budget: 100, new_period: 1, }, @@ -156,7 +149,7 @@ mod test { let result_leftways = calculate_budgets_accrual(&category, &budget_updates); let result_rightways = calculate_budgets_accrual(&category, &budget_updates_reversed); - assert_eq!(result_leftways, 24_000); - assert_eq!(result_rightways, 24_000); + assert!(result_leftways.is_err()); + assert!(result_rightways.is_err()); } } |
