summaryrefslogtreecommitdiff
path: root/backend/src/utils/calculate_category_balance.rs
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2024-09-17 11:28:56 +0100
committerJoe Carstairs <me@joeac.net>2024-09-17 11:28:56 +0100
commitf0e3e0cfb183253e03b1a61ddecb7b9330d47fdb (patch)
tree722eca369743dcfbb95f1efd58cc4cecc0fb8677 /backend/src/utils/calculate_category_balance.rs
parentc737b6df94eae4981bb03dda3583e24046e24865 (diff)
Refactors backend
Diffstat (limited to 'backend/src/utils/calculate_category_balance.rs')
-rw-r--r--backend/src/utils/calculate_category_balance.rs141
1 files changed, 141 insertions, 0 deletions
diff --git a/backend/src/utils/calculate_category_balance.rs b/backend/src/utils/calculate_category_balance.rs
new file mode 100644
index 0000000..3c1c62f
--- /dev/null
+++ b/backend/src/utils/calculate_category_balance.rs
@@ -0,0 +1,141 @@
+use crate::models::{budget_update::BudgetUpdate, category::Category};
+
+use super::{calculate_budgets_accrual, find_by_id_or};
+
+pub fn calculate_category_balance(
+ category: &Category,
+ transaction_sums: &[(i32, Option<i64>)],
+ category_transfer_from_sums: &[(i32, Option<i64>)],
+ category_transfer_to_sums: &[(i32, Option<i64>)],
+ budget_updates: &[BudgetUpdate],
+) -> 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_updates);
+
+ transaction_sum + budget_accruals_sum + category_transfer_to_sum - category_transfer_from_sum
+}
+
+#[cfg(test)]
+mod test {
+ use chrono::{Days, Utc};
+
+ use crate::{
+ models::{budget_update::BudgetUpdate, category::Category, date_time_utc::DateTimeUtc},
+ utils::calculate_category_balance,
+ };
+
+ #[test]
+ fn when_no_data_then_returns_zero() {
+ let category = Category {
+ id: 0,
+ name: String::new(),
+ };
+
+ let result = calculate_category_balance(&category, &[], &[], &[], &[]);
+
+ assert_eq!(result, 0_i64);
+ }
+
+ #[test]
+ fn when_data_only_for_another_category_then_returns_zero() {
+ let category = Category {
+ id: 0,
+ name: String::new(),
+ };
+ let transaction_sums = [(1, Some(100))];
+ let category_transfer_from_sums = [(1, Some(91))];
+ let category_transfer_to_sums = [(2, Some(79))];
+ let budget_updates = [BudgetUpdate {
+ id: 0,
+ category_id: 1,
+ date: DateTimeUtc::new(Utc::now().checked_sub_days(Days::new(120)).unwrap()),
+ new_budget: 77,
+ new_period: 1,
+ }];
+
+ let result = calculate_category_balance(
+ &category,
+ &transaction_sums,
+ &category_transfer_from_sums,
+ &category_transfer_to_sums,
+ &budget_updates,
+ );
+
+ assert_eq!(result, 0_i64);
+ }
+
+ #[test]
+ fn when_transaction_sum_is_none_then_returns_zero() {
+ let category = Category {
+ id: 0,
+ name: String::new(),
+ };
+ let transaction_sums = [(0, None)];
+ let category_transfer_from_sums = [];
+ let category_transfer_to_sums = [];
+ let budget_updates = [];
+
+ let result = calculate_category_balance(
+ &category,
+ &transaction_sums,
+ &category_transfer_from_sums,
+ &category_transfer_to_sums,
+ &budget_updates,
+ );
+
+ assert_eq!(result, 0_i64);
+ }
+
+ #[test]
+ fn when_category_transfers_are_none_then_returns_zero() {
+ let category = Category {
+ id: 0,
+ name: String::new(),
+ };
+ let transaction_sums = [];
+ let category_transfer_from_sums = [(0, None)];
+ let category_transfer_to_sums = [(0, None)];
+ let budget_updates = [];
+
+ let result = calculate_category_balance(
+ &category,
+ &transaction_sums,
+ &category_transfer_from_sums,
+ &category_transfer_to_sums,
+ &budget_updates,
+ );
+
+ assert_eq!(result, 0_i64);
+ }
+
+ #[test]
+ fn when_some_data_then_calculates_as_expected() {
+ let category = Category {
+ id: 0,
+ name: String::new(),
+ };
+ let transaction_sums = [(0, Some(100))];
+ let category_transfer_from_sums = [(0, Some(91))];
+ let category_transfer_to_sums = [(0, Some(79))];
+ let budget_updates = [BudgetUpdate {
+ id: 0,
+ category_id: 0,
+ date: DateTimeUtc::new(Utc::now().checked_sub_days(Days::new(120)).unwrap()),
+ new_budget: 77,
+ new_period: 1,
+ }];
+
+ let result = calculate_category_balance(
+ &category,
+ &transaction_sums,
+ &category_transfer_from_sums,
+ &category_transfer_to_sums,
+ &budget_updates,
+ );
+
+ let expected_result = 100 + (-91) + 79 + 77 * 120;
+ assert_eq!(result, expected_result);
+ }
+}