diff options
Diffstat (limited to 'rust')
5 files changed, 295 insertions, 4 deletions
diff --git a/rust/actualbudget_models/src/actualbudget_schema.rs b/rust/actualbudget_models/src/actualbudget_schema.rs index 02907c0..706fb00 100644 --- a/rust/actualbudget_models/src/actualbudget_schema.rs +++ b/rust/actualbudget_models/src/actualbudget_schema.rs @@ -47,7 +47,7 @@ diesel::table! { category_id -> Text, amount -> Integer, #[sql_name = "carryover"] - do_carry_over -> Integer, + do_carry_over -> Bool, // goal -> Integer, // long_goal -> Integer, } diff --git a/rust/actualbudget_models/src/actualbudget_zero_budget.rs b/rust/actualbudget_models/src/actualbudget_zero_budget.rs index 41b3443..f55972e 100644 --- a/rust/actualbudget_models/src/actualbudget_zero_budget.rs +++ b/rust/actualbudget_models/src/actualbudget_zero_budget.rs @@ -9,5 +9,5 @@ pub struct ActualbudgetZeroBudget { pub month: ActualbudgetDate, pub category_id: String, pub amount: i32, - pub do_carry_over: i32, + pub do_carry_over: bool, } diff --git a/rust/actualbudget_queries/tests/actualbudget_zero_budgets.rs b/rust/actualbudget_queries/tests/actualbudget_zero_budgets.rs index 4e9ea19..a10af31 100644 --- a/rust/actualbudget_queries/tests/actualbudget_zero_budgets.rs +++ b/rust/actualbudget_queries/tests/actualbudget_zero_budgets.rs @@ -1,16 +1,21 @@ mod common; use actualbudget_queries::actualbudget_zero_budgets::get_all_actualbudget_zero_budgets; -use common::db_url::DB_URL; +use common::{db_url::DB_URL, get_reference_data::get_categories, zero_budget_matchers::get_zero_budget_matchers}; use diesel::{Connection, SqliteConnection}; #[test] fn given_test_database_when_get_all_zero_budgets_then_return_zero_budgets() { let connection = &mut SqliteConnection::establish(DB_URL).unwrap(); + let categories = get_categories(connection); let zero_budgets = get_all_actualbudget_zero_budgets(connection); assert!(zero_budgets.is_ok()); let zero_budgets = zero_budgets.unwrap(); - assert_eq!(25, zero_budgets.len()); + let zero_budget_matchers = get_zero_budget_matchers(); + assert_eq!(zero_budget_matchers.len(), zero_budgets.len()); + for matcher in zero_budget_matchers { + assert!(zero_budgets.iter().any(|zb| matcher(zb, &categories))) + } } diff --git a/rust/actualbudget_queries/tests/common/mod.rs b/rust/actualbudget_queries/tests/common/mod.rs index 01112b3..9c24578 100644 --- a/rust/actualbudget_queries/tests/common/mod.rs +++ b/rust/actualbudget_queries/tests/common/mod.rs @@ -3,3 +3,4 @@ pub mod category_names; pub mod db_url; pub mod get_reference_data; pub mod transaction_matchers; +pub mod zero_budget_matchers; diff --git a/rust/actualbudget_queries/tests/common/zero_budget_matchers.rs b/rust/actualbudget_queries/tests/common/zero_budget_matchers.rs new file mode 100644 index 0000000..46b893d --- /dev/null +++ b/rust/actualbudget_queries/tests/common/zero_budget_matchers.rs @@ -0,0 +1,285 @@ +use std::collections::HashMap; + +use actualbudget_models::{actualbudget_category::ActualbudgetCategory, actualbudget_zero_budget::ActualbudgetZeroBudget}; + +use super::category_names::CATEGORY_NAMES_DICT; + +pub fn get_zero_budget_matchers() -> Vec<Box<dyn Fn(&ActualbudgetZeroBudget, &HashMap<String, ActualbudgetCategory>) -> bool>> { + vec![ + Box::new(|t, c| matches_food_budget(t, c, "08")), + Box::new(|t, c| matches_food_budget(t, c, "09")), + Box::new(|t, c| matches_food_budget(t, c, "10")), + Box::new(|t, c| matches_food_budget(t, c, "11")), + Box::new(|t, c| matches_zero_food_budget(t, c, "12")), + Box::new(|t, c| matches_general_budget(t, c, "08")), + Box::new(|t, c| matches_general_budget(t, c, "09")), + Box::new(|t, c| matches_general_budget(t, c, "10")), + Box::new(|t, c| matches_general_budget(t, c, "11")), + Box::new(|t, c| matches_zero_general_budget(t, c, "12")), + Box::new(|t, c| matches_bills_budget(t, c, "08")), + Box::new(|t, c| matches_bills_budget(t, c, "09")), + Box::new(|t, c| matches_bills_budget(t, c, "10")), + Box::new(|t, c| matches_bills_budget(t, c, "11")), + Box::new(|t, c| matches_zero_bills_budget(t, c, "12")), + Box::new(|t, c| matches_bills_flexible_budget(t, c, "08")), + Box::new(|t, c| matches_bills_flexible_budget(t, c, "09")), + Box::new(|t, c| matches_bills_flexible_budget(t, c, "10")), + Box::new(|t, c| matches_bills_flexible_budget(t, c, "11")), + Box::new(|t, c| matches_zero_bills_flexible_budget(t, c, "12")), + Box::new(|t, c| matches_savings_budget(t, c, "08")), + Box::new(|t, c| matches_savings_budget(t, c, "09")), + Box::new(|t, c| matches_savings_budget(t, c, "10")), + Box::new(|t, c| matches_savings_budget(t, c, "11")), + Box::new(|t, c| matches_zero_savings_budget(t, c, "12")), + ] +} + +fn matches_food_budget( + t: &ActualbudgetZeroBudget, + categories: &HashMap<String, ActualbudgetCategory>, + month: &str, +) -> bool { + let food_category_id = categories + .get(CATEGORY_NAMES_DICT.food) + .expect("failed to find food category") + .id + .clone(); + + match t { + ActualbudgetZeroBudget { + month: date, + category_id, + amount: 200_00, + do_carry_over: false, + .. + } => + *category_id == food_category_id + && date.month() == month, + _ => false, + } +} + +fn matches_zero_food_budget( + t: &ActualbudgetZeroBudget, + categories: &HashMap<String, ActualbudgetCategory>, + month: &str, +) -> bool { + let food_category_id = categories + .get(CATEGORY_NAMES_DICT.food) + .expect("failed to find food category") + .id + .clone(); + + match t { + ActualbudgetZeroBudget { + month: date, + category_id, + amount: 0, + do_carry_over: false, + .. + } => + *category_id == food_category_id + && date.month() == month, + _ => false, + } +} + +fn matches_general_budget( + t: &ActualbudgetZeroBudget, + categories: &HashMap<String, ActualbudgetCategory>, + month: &str, +) -> bool { + let general_category_id = categories + .get(CATEGORY_NAMES_DICT.general) + .expect("failed to find general category") + .id + .clone(); + + match t { + ActualbudgetZeroBudget { + month: date, + category_id, + amount: 100_00, + do_carry_over: false, + .. + } => + *category_id == general_category_id + && date.month() == month, + _ => false, + } +} + +fn matches_zero_general_budget( + t: &ActualbudgetZeroBudget, + categories: &HashMap<String, ActualbudgetCategory>, + month: &str, +) -> bool { + let general_category_id = categories + .get(CATEGORY_NAMES_DICT.general) + .expect("failed to find general category") + .id + .clone(); + + match t { + ActualbudgetZeroBudget { + month: date, + category_id, + amount: 0, + do_carry_over: false, + .. + } => + *category_id == general_category_id + && date.month() == month, + _ => false, + } +} + +fn matches_bills_budget( + t: &ActualbudgetZeroBudget, + categories: &HashMap<String, ActualbudgetCategory>, + month: &str, +) -> bool { + let bills_category_id = categories + .get(CATEGORY_NAMES_DICT.bills) + .expect("failed to find bills category") + .id + .clone(); + + match t { + ActualbudgetZeroBudget { + month: date, + category_id, + amount: 125_00, + do_carry_over: false, + .. + } => + *category_id == bills_category_id + && date.month() == month, + _ => false, + } +} + +fn matches_zero_bills_budget( + t: &ActualbudgetZeroBudget, + categories: &HashMap<String, ActualbudgetCategory>, + month: &str, +) -> bool { + let bills_category_id = categories + .get(CATEGORY_NAMES_DICT.bills) + .expect("failed to find bills category") + .id + .clone(); + + match t { + ActualbudgetZeroBudget { + month: date, + category_id, + amount: 0, + do_carry_over: false, + .. + } => + *category_id == bills_category_id + && date.month() == month, + _ => false, + } +} + +fn matches_bills_flexible_budget( + t: &ActualbudgetZeroBudget, + categories: &HashMap<String, ActualbudgetCategory>, + month: &str, +) -> bool { + let bills_flexible_category_id = categories + .get(CATEGORY_NAMES_DICT.bills_flexible) + .expect("failed to find bills (flexible) category") + .id + .clone(); + + match t { + ActualbudgetZeroBudget { + month: date, + category_id, + amount: 25_00, + do_carry_over: false, + .. + } => + *category_id == bills_flexible_category_id + && date.month() == month, + _ => false, + } +} + +fn matches_zero_bills_flexible_budget( + t: &ActualbudgetZeroBudget, + categories: &HashMap<String, ActualbudgetCategory>, + month: &str, +) -> bool { + let bills_flexible_category_id = categories + .get(CATEGORY_NAMES_DICT.bills_flexible) + .expect("failed to find bills (flexible) category") + .id + .clone(); + + match t { + ActualbudgetZeroBudget { + month: date, + category_id, + amount: 0, + do_carry_over: false, + .. + } => + *category_id == bills_flexible_category_id + && date.month() == month, + _ => false, + } +} + +fn matches_savings_budget( + t: &ActualbudgetZeroBudget, + categories: &HashMap<String, ActualbudgetCategory>, + month: &str, +) -> bool { + let savings_category_id = categories + .get(CATEGORY_NAMES_DICT.savings) + .expect("failed to find savings category") + .id + .clone(); + + match t { + ActualbudgetZeroBudget { + month: date, + category_id, + amount: 400_00, + do_carry_over: false, + .. + } => + *category_id == savings_category_id + && date.month() == month, + _ => false, + } +} + +fn matches_zero_savings_budget( + t: &ActualbudgetZeroBudget, + categories: &HashMap<String, ActualbudgetCategory>, + month: &str, +) -> bool { + let savings_category_id = categories + .get(CATEGORY_NAMES_DICT.savings) + .expect("failed to find savings category") + .id + .clone(); + + match t { + ActualbudgetZeroBudget { + month: date, + category_id, + amount: 0, + do_carry_over: false, + .. + } => + *category_id == savings_category_id + && date.month() == month, + _ => false, + } +} |
