From 5fced470220a9355a5b7ba0bb2858e1733b706dd Mon Sep 17 00:00:00 2001 From: Joe Carstairs Date: Sat, 9 Nov 2024 00:29:27 +0000 Subject: Tests category_transfers queries --- .../sum_quantity_per_from_category_id.rs | 3 +- .../sum_quantity_per_to_category_id.rs | 3 +- .../sum_quantity_per_category_id.rs | 3 +- .../core/src/utils/calculate_category_balance.rs | 28 +++++++------- backend/core/src/utils/find_by_id_or.rs | 22 +++-------- backend/core/tests/queries/category_transfers.rs | 44 ++++++++++++++++++++-- 6 files changed, 65 insertions(+), 38 deletions(-) diff --git a/backend/core/src/queries/category_transfers/sum_quantity_per_from_category_id.rs b/backend/core/src/queries/category_transfers/sum_quantity_per_from_category_id.rs index cd4137d..a9c2a8c 100644 --- a/backend/core/src/queries/category_transfers/sum_quantity_per_from_category_id.rs +++ b/backend/core/src/queries/category_transfers/sum_quantity_per_from_category_id.rs @@ -6,7 +6,7 @@ use diesel::{dsl::sum, result::Error, QueryDsl, RunQueryDsl, SqliteConnection}; pub fn sum_category_transfer_quantity_per_from_category_id( connection: &mut SqliteConnection, -) -> Result)>, Error> { +) -> Result, Error> { category_transfers_table .group_by(category_transfers_schema::from_category_id) .select(( @@ -14,4 +14,5 @@ pub fn sum_category_transfer_quantity_per_from_category_id( sum(category_transfers_schema::quantity), )) .load::<(i32, Option)>(connection) + .map(|result| result.iter().map(|sum| (sum.0, sum.1.unwrap_or(0))).collect()) } diff --git a/backend/core/src/queries/category_transfers/sum_quantity_per_to_category_id.rs b/backend/core/src/queries/category_transfers/sum_quantity_per_to_category_id.rs index f5fb561..f041477 100644 --- a/backend/core/src/queries/category_transfers/sum_quantity_per_to_category_id.rs +++ b/backend/core/src/queries/category_transfers/sum_quantity_per_to_category_id.rs @@ -6,7 +6,7 @@ use diesel::{dsl::sum, result::Error, QueryDsl, RunQueryDsl, SqliteConnection}; pub fn sum_category_transfer_quantity_per_to_category_id( connection: &mut SqliteConnection, -) -> Result)>, Error> { +) -> Result, Error> { category_transfers_table .group_by(category_transfers_schema::to_category_id) .select(( @@ -14,4 +14,5 @@ pub fn sum_category_transfer_quantity_per_to_category_id( sum(category_transfers_schema::quantity), )) .load::<(i32, Option)>(connection) + .map(|vec| vec.iter().map(|(id, sum)| (*id, sum.unwrap_or(0))).collect()) } diff --git a/backend/core/src/queries/transaction_categorisations/sum_quantity_per_category_id.rs b/backend/core/src/queries/transaction_categorisations/sum_quantity_per_category_id.rs index 7f93e0c..61f3492 100644 --- a/backend/core/src/queries/transaction_categorisations/sum_quantity_per_category_id.rs +++ b/backend/core/src/queries/transaction_categorisations/sum_quantity_per_category_id.rs @@ -6,7 +6,7 @@ use diesel::{dsl::sum, result::Error, QueryDsl, RunQueryDsl, SqliteConnection}; pub fn sum_transaction_categorisation_quantity_per_category_id( connection: &mut SqliteConnection, -) -> Result)>, Error> { +) -> Result, Error> { transaction_categorisations_table .group_by(transaction_categorisations_schema::category_id) .select(( @@ -14,4 +14,5 @@ pub fn sum_transaction_categorisation_quantity_per_category_id( sum(transaction_categorisations_schema::quantity), )) .load::<(i32, Option)>(connection) + .map(|vec| vec.iter().map(|(category_id, sum)| (*category_id, sum.unwrap_or(0))).collect()) } diff --git a/backend/core/src/utils/calculate_category_balance.rs b/backend/core/src/utils/calculate_category_balance.rs index 296b9de..61b94a8 100644 --- a/backend/core/src/utils/calculate_category_balance.rs +++ b/backend/core/src/utils/calculate_category_balance.rs @@ -6,9 +6,9 @@ use crate::{ pub fn calculate_category_balance( category: &Category, - transaction_sums: &[(i32, Option)], - category_transfer_from_sums: &[(i32, Option)], - category_transfer_to_sums: &[(i32, Option)], + transaction_sums: &[(i32, i64)], + category_transfer_from_sums: &[(i32, i64)], + category_transfer_to_sums: &[(i32, i64)], budget_updates: &[BudgetUpdate], ) -> Result { let transaction_sum = find_by_id_or(transaction_sums, category.id, 0); @@ -52,9 +52,9 @@ mod test { 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 transaction_sums = [(1, 100)]; + let category_transfer_from_sums = [(1, 91)]; + let category_transfer_to_sums = [(2, 79)]; let budget_updates = [BudgetUpdate { id: 0, category_id: 1, @@ -76,12 +76,12 @@ mod test { } #[test] - fn when_transaction_sum_is_none_then_returns_zero() { + fn when_transaction_sum_is_zero_then_returns_zero() { let category = Category { id: 0, name: String::new(), }; - let transaction_sums = [(0, None)]; + let transaction_sums = [(0, 0)]; let category_transfer_from_sums = []; let category_transfer_to_sums = []; let budget_updates = []; @@ -99,14 +99,14 @@ mod test { } #[test] - fn when_category_transfers_are_none_then_returns_zero() { + fn when_category_transfers_are_zero_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 category_transfer_from_sums = [(0, 0)]; + let category_transfer_to_sums = [(0, 0)]; let budget_updates = []; let result = calculate_category_balance( @@ -127,9 +127,9 @@ mod test { 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 transaction_sums = [(0, 100)]; + let category_transfer_from_sums = [(0, 91)]; + let category_transfer_to_sums = [(0, 79)]; let budget_updates = [BudgetUpdate { id: 0, category_id: 0, diff --git a/backend/core/src/utils/find_by_id_or.rs b/backend/core/src/utils/find_by_id_or.rs index f5add30..8335e5c 100644 --- a/backend/core/src/utils/find_by_id_or.rs +++ b/backend/core/src/utils/find_by_id_or.rs @@ -1,14 +1,11 @@ pub fn find_by_id_or( - arr: &[(Id, Option)], + arr: &[(Id, Val)], id: Id, default: Val, ) -> Val { arr.iter() .find(|(elem_id, _)| *elem_id == id) - .map_or(default, |row| match row { - (_, Some(quantity)) => *quantity, - (_, _) => default, - }) + .map_or(default, |row| row.1) } #[cfg(test)] @@ -26,7 +23,7 @@ mod test { #[test] fn when_id_not_in_elements_then_return_default() { - let arr = [(0, Some(100)), (2, Some(200))]; + let arr = [(0, 100), (2, 200)]; let result = find_by_id_or(&arr, 1, 42); @@ -34,17 +31,8 @@ mod test { } #[test] - fn when_value_is_none_then_return_default() { - let arr = [(1, None)]; - - let result = find_by_id_or(&arr, 1, 42); - - assert_eq!(result, 42); - } - - #[test] - fn when_value_is_some_then_return_value() { - let arr = [(1, Some(67))]; + fn when_id_in_elements_then_return_value() { + let arr = [(1, 67)]; let result = find_by_id_or(&arr, 1, 42); diff --git a/backend/core/tests/queries/category_transfers.rs b/backend/core/tests/queries/category_transfers.rs index 80ec70f..0df144f 100644 --- a/backend/core/tests/queries/category_transfers.rs +++ b/backend/core/tests/queries/category_transfers.rs @@ -78,11 +78,47 @@ fn given_deleted_category_transfers_when_get_all_category_transfers_then_return_ } #[test] -fn todo() { - todo!("test sum_quantity_per_from_category_id"); +fn given_category_transfers_when_sum_quantity_per_from_category_id_then_returns_sum_per_from_category_id() { + let context = TestContext::new(); + let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); + let categories = [make_fake_category(0), make_fake_category(1)]; + let category_transfers = [ + make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).quantity(1).build().unwrap(), + make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).quantity(2).build().unwrap(), + make_fake_category_transfer_builder(2).from_category_id(1).to_category_id(0).quantity(4).build().unwrap(), + ]; + let _ = queries::categories::insert_categories(&categories, connection); + let _ = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap(); + + let sums = queries::category_transfers::sum_category_transfer_quantity_per_from_category_id(connection); + + assert!(sums.is_ok()); + let mut sums = sums.unwrap(); + sums.sort_by_key(|sum| sum.0); + assert_eq!(categories.len(), sums.len()); + assert_eq!(3, sums[0].1); + assert_eq!(4, sums[1].1); } #[test] -fn todo2() { - todo!("test sum_quantity_per_from_category_id"); +fn given_category_transfers_when_sum_quantity_per_to_category_id_then_returns_sum_per_to_category_id() { + let context = TestContext::new(); + let connection = &mut SqliteConnection::establish(&context.db_url).unwrap(); + let categories = [make_fake_category(0), make_fake_category(1)]; + let category_transfers = [ + make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).quantity(1).build().unwrap(), + make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).quantity(2).build().unwrap(), + make_fake_category_transfer_builder(2).from_category_id(1).to_category_id(0).quantity(4).build().unwrap(), + ]; + let _ = queries::categories::insert_categories(&categories, connection); + let _ = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap(); + + let sums = queries::category_transfers::sum_category_transfer_quantity_per_to_category_id(connection); + + assert!(sums.is_ok()); + let mut sums = sums.unwrap(); + sums.sort_by_key(|sum| sum.0); + assert_eq!(categories.len(), sums.len()); + assert_eq!(4, sums[0].1); + assert_eq!(3, sums[1].1); } -- cgit v1.2.3