summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2024-11-09 00:29:27 +0000
committerJoe Carstairs <me@joeac.net>2024-11-09 00:41:24 +0000
commit5fced470220a9355a5b7ba0bb2858e1733b706dd (patch)
tree87bf376a415a494aa14b7c7021f3edfd80cd70db
parent5b9aa41283f22988512b4142f7b66b9aa7a04ab3 (diff)
Tests category_transfers queries
-rw-r--r--backend/core/src/queries/category_transfers/sum_quantity_per_from_category_id.rs3
-rw-r--r--backend/core/src/queries/category_transfers/sum_quantity_per_to_category_id.rs3
-rw-r--r--backend/core/src/queries/transaction_categorisations/sum_quantity_per_category_id.rs3
-rw-r--r--backend/core/src/utils/calculate_category_balance.rs28
-rw-r--r--backend/core/src/utils/find_by_id_or.rs22
-rw-r--r--backend/core/tests/queries/category_transfers.rs44
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<Vec<(i32, Option<i64>)>, Error> {
+) -> Result<Vec<(i32, i64)>, 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<i64>)>(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<Vec<(i32, Option<i64>)>, Error> {
+) -> Result<Vec<(i32, i64)>, 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<i64>)>(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<Vec<(i32, Option<i64>)>, Error> {
+) -> Result<Vec<(i32, i64)>, 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<i64>)>(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<i64>)],
- category_transfer_from_sums: &[(i32, Option<i64>)],
- category_transfer_to_sums: &[(i32, Option<i64>)],
+ transaction_sums: &[(i32, i64)],
+ category_transfer_from_sums: &[(i32, i64)],
+ category_transfer_to_sums: &[(i32, i64)],
budget_updates: &[BudgetUpdate],
) -> Result<i64> {
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<Id: PartialEq, Val: Copy>(
- arr: &[(Id, Option<Val>)],
+ 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);
}