summaryrefslogtreecommitdiff
path: root/backend/core/tests
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2024-11-04 06:54:05 +0000
committerJoe Carstairs <me@joeac.net>2024-11-04 06:55:18 +0000
commit5b9aa41283f22988512b4142f7b66b9aa7a04ab3 (patch)
treefb0c5f9792442372f703438aa873327e16d5295d /backend/core/tests
parent8be41935b15dfd2e4894f959874c24260a715aa1 (diff)
Test & fix get_most_recent_budget_per_category_id query
Diffstat (limited to 'backend/core/tests')
-rw-r--r--backend/core/tests/queries/budget_updates.rs133
-rw-r--r--backend/core/tests/queries/categories.rs68
2 files changed, 155 insertions, 46 deletions
diff --git a/backend/core/tests/queries/budget_updates.rs b/backend/core/tests/queries/budget_updates.rs
index 503e51c..6641b25 100644
--- a/backend/core/tests/queries/budget_updates.rs
+++ b/backend/core/tests/queries/budget_updates.rs
@@ -1,18 +1,19 @@
-use budgeting_app_core::{models::date_utc::DateUtc, queries, traits::nowlike::Nowlike};
+use budgeting_app_core::{models::{category::Category, date_utc::DateUtc}, queries, traits::nowlike::Nowlike};
use diesel::{Connection, SqliteConnection};
use crate::common::{fakes::{budget_update::make_fake_budget_update_builder, category::make_fake_category}, test_context::TestContext};
-fn insert_prerequisite_data(connection: &mut SqliteConnection) {
- let categories = [make_fake_category(0), make_fake_category(1)];
+fn given_categories(connection: &mut SqliteConnection) -> Vec<Category> {
+ let categories = vec![make_fake_category(0), make_fake_category(1)];
let _ = queries::categories::insert_categories(&categories, connection);
+ categories
}
#[test]
fn when_insert_budget_updates_then_returns_num_budget_updates() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- insert_prerequisite_data(connection);
+ let _categories = given_categories(connection);
let budget_updates = [
make_fake_budget_update_builder(0)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
@@ -33,7 +34,7 @@ fn when_insert_budget_updates_then_returns_num_budget_updates() {
fn given_budget_update_when_insert_budget_update_same_category_and_same_date_then_return_err() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- insert_prerequisite_data(connection);
+ let _categories = given_categories(connection);
let budget_updates_1 = [
make_fake_budget_update_builder(0)
@@ -58,7 +59,7 @@ fn given_budget_update_when_insert_budget_update_same_category_and_same_date_the
fn given_budget_update_when_insert_budget_update_different_category_and_same_date_then_return_num_budget_updates_inserted() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- insert_prerequisite_data(connection);
+ let _categories = given_categories(connection);
let budget_updates_1 = [
make_fake_budget_update_builder(0)
@@ -84,7 +85,7 @@ fn given_budget_update_when_insert_budget_update_different_category_and_same_dat
fn given_budget_update_when_insert_budget_update_same_category_and_different_date_then_return_num_budget_updates_inserted() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- insert_prerequisite_data(connection);
+ let _categories = given_categories(connection);
let budget_updates_1 = [
make_fake_budget_update_builder(0)
@@ -110,7 +111,7 @@ fn given_budget_update_when_insert_budget_update_same_category_and_different_dat
fn given_budget_updates_when_get_all_budget_updates_then_return_budget_updates() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- insert_prerequisite_data(connection);
+ let _categories = given_categories(connection);
let budget_updates = [
make_fake_budget_update_builder(0)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
@@ -140,7 +141,7 @@ fn given_budget_updates_when_get_all_budget_updates_then_return_budget_updates()
fn given_budget_updates_when_delete_all_budget_updates_then_return_num_of_budget_updates() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- insert_prerequisite_data(connection);
+ let _categories = given_categories(connection);
let budget_updates = [
make_fake_budget_update_builder(0)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
@@ -162,7 +163,7 @@ fn given_budget_updates_when_delete_all_budget_updates_then_return_num_of_budget
fn given_deleted_budget_updates_when_get_all_budget_updates_then_return_empty() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- insert_prerequisite_data(connection);
+ let _categories = given_categories(connection);
let budget_updates = [
make_fake_budget_update_builder(0)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
@@ -182,79 +183,127 @@ fn given_deleted_budget_updates_when_get_all_budget_updates_then_return_empty()
}
#[test]
-fn given_no_budget_updates_when_get_first_with_date_then_return_none() {
+fn given_no_categories_when_get_first_with_date_and_category_id_then_return_none() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let first_with_date = queries::budget_updates::get_first_budget_update_with_date(&DateUtc::now(), connection).unwrap();
+ let first_with_date_and_category_id =
+ queries::budget_updates::get_first_budget_update_with_date_and_category_id(
+ &DateUtc::now(),
+ 0,
+ connection,
+ ).unwrap();
- assert!(first_with_date.is_none());
+ assert!(first_with_date_and_category_id.is_none());
+}
+
+#[test]
+fn given_no_budget_updates_when_get_first_with_date_and_category_id_then_return_none() {
+ let context = TestContext::new();
+ let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
+ let _categories = given_categories(connection);
+
+ let first_with_date_and_category_id =
+ queries::budget_updates::get_first_budget_update_with_date_and_category_id(
+ &DateUtc::now(),
+ 0,
+ connection,
+ ).unwrap();
+
+ assert!(first_with_date_and_category_id.is_none());
}
#[test]
fn given_budget_update_when_get_first_with_date_then_return_budget_update() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- insert_prerequisite_data(connection);
+ let _categories = given_categories(connection);
+ let date: DateUtc = "2024-10-28".parse().unwrap();
+ let budget_update = make_fake_budget_update_builder(0).date(date.clone()).build().unwrap();
+ let _ = queries::budget_updates::insert_budget_updates(&[budget_update.clone()], connection).unwrap();
+
+ let first_with_date_and_category_id =
+ queries::budget_updates::get_first_budget_update_with_date_and_category_id(
+ &date,
+ 0,
+ connection,
+ ).unwrap();
+
+ assert!(first_with_date_and_category_id.is_some());
+ assert_eq!(first_with_date_and_category_id.unwrap(), budget_update);
+}
+
+#[test]
+fn given_budget_update_when_get_first_with_date_and_different_category_id_then_return_none() {
+ let context = TestContext::new();
+ let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
+ let _categories = given_categories(connection);
let date: DateUtc = "2024-10-28".parse().unwrap();
+ let different_date: DateUtc = "2024-10-29".parse().unwrap();
let budget_update = make_fake_budget_update_builder(0).date(date.clone()).build().unwrap();
let _ = queries::budget_updates::insert_budget_updates(&[budget_update.clone()], connection).unwrap();
- let first_with_date = queries::budget_updates::get_first_budget_update_with_date(&date, connection).unwrap();
+ let first_with_date_and_category_id =
+ queries::budget_updates::get_first_budget_update_with_date_and_category_id(
+ &different_date,
+ 2,
+ connection
+ ).unwrap();
- assert!(first_with_date.is_some());
- assert_eq!(first_with_date.unwrap(), budget_update);
+ assert!(first_with_date_and_category_id.is_none());
}
#[test]
-fn given_budget_update_when_get_first_with_different_date_then_return_none() {
+fn given_budget_update_when_get_first_with_different_date_and_category_id_then_return_none() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- insert_prerequisite_data(connection);
+ let _categories = given_categories(connection);
let date: DateUtc = "2024-10-28".parse().unwrap();
let different_date: DateUtc = "2024-10-29".parse().unwrap();
let budget_update = make_fake_budget_update_builder(0).date(date.clone()).build().unwrap();
let _ = queries::budget_updates::insert_budget_updates(&[budget_update.clone()], connection).unwrap();
- let first_with_date = queries::budget_updates::get_first_budget_update_with_date(
- &different_date,
- connection
- ).unwrap();
+ let first_with_date_and_category_id =
+ queries::budget_updates::get_first_budget_update_with_date_and_category_id(
+ &different_date,
+ 0,
+ connection
+ ).unwrap();
- assert!(first_with_date.is_none());
+ assert!(first_with_date_and_category_id.is_none());
}
#[test]
-fn given_many_budget_updates_when_get_first_with_date_then_return_any_with_date() {
+fn given_many_budget_updates_when_get_first_with_date_and_category_id_then_return_any_with_date() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- insert_prerequisite_data(connection);
+ let _categories = given_categories(connection);
let budget_updates = [
- make_fake_budget_update_builder(0).date("2024-12-25".parse().unwrap()).build().unwrap(),
- make_fake_budget_update_builder(1).date("2020-12-26".parse().unwrap()).build().unwrap(),
- make_fake_budget_update_builder(2).date("2020-12-27".parse().unwrap()).build().unwrap(),
- make_fake_budget_update_builder(3).date("2020-12-28".parse().unwrap()).build().unwrap(),
- make_fake_budget_update_builder(4).date("2020-12-29".parse().unwrap()).build().unwrap(),
- make_fake_budget_update_builder(5).date("2020-12-30".parse().unwrap()).build().unwrap(),
- make_fake_budget_update_builder(6).date("2020-12-31".parse().unwrap()).build().unwrap(),
- make_fake_budget_update_builder(7).date("2021-01-01".parse().unwrap()).build().unwrap(),
+ make_fake_budget_update_builder(0).date("2024-12-25".parse().unwrap()).category_id(0).build().unwrap(),
+ make_fake_budget_update_builder(1).date("2024-12-25".parse().unwrap()).category_id(1).build().unwrap(),
+ make_fake_budget_update_builder(2).date("2020-12-26".parse().unwrap()).category_id(0).build().unwrap(),
+ make_fake_budget_update_builder(3).date("2020-12-26".parse().unwrap()).category_id(1).build().unwrap(),
+ make_fake_budget_update_builder(4).date("2020-12-27".parse().unwrap()).category_id(0).build().unwrap(),
+ make_fake_budget_update_builder(5).date("2020-12-27".parse().unwrap()).category_id(1).build().unwrap(),
];
let _ = queries::budget_updates::insert_budget_updates(&budget_updates, connection).unwrap();
- let first_with_date = queries::budget_updates::get_first_budget_update_with_date(
- &"2024-12-25".parse().unwrap(),
- connection,
- ).unwrap();
+ let first_with_date_and_category_id =
+ queries::budget_updates::get_first_budget_update_with_date_and_category_id(
+ &"2024-12-25".parse().unwrap(),
+ 0,
+ connection,
+ ).unwrap();
- assert!(first_with_date.is_some());
- assert_eq!(first_with_date.unwrap(), budget_updates[0]);
+ assert!(first_with_date_and_category_id.is_some());
+ assert_eq!(first_with_date_and_category_id.unwrap(), budget_updates[0]);
}
#[test]
fn given_many_budget_updates_when_get_most_recent_with_category_id_then_return_correct_date() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- insert_prerequisite_data(connection);
+ let _categories = given_categories(connection);
let budget_updates = [
make_fake_budget_update_builder(0)
.category_id(0)
@@ -286,7 +335,7 @@ fn given_many_budget_updates_when_get_most_recent_with_category_id_then_return_c
fn given_budget_update_when_get_most_recent_with_different_category_id_then_return_none() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- insert_prerequisite_data(connection);
+ let _categories = given_categories(connection);
let budget_updates = [
make_fake_budget_update_builder(0)
.category_id(1)
diff --git a/backend/core/tests/queries/categories.rs b/backend/core/tests/queries/categories.rs
index 104cedc..4ab3f68 100644
--- a/backend/core/tests/queries/categories.rs
+++ b/backend/core/tests/queries/categories.rs
@@ -1,7 +1,8 @@
-use budgeting_app_core::{models::{account::Account, category::Category, transaction::Transaction, transaction_categorisation::TransactionCategorisation}, queries};
+use budgeting_app_core::{models::{account::Account, budget::Budget, budget_update::BudgetUpdate, category::Category, date_utc::DateUtc, transaction::Transaction, transaction_categorisation::TransactionCategorisation}, queries};
+use chrono::{Days, Utc};
use diesel::{Connection, SqliteConnection};
-use crate::common::{fakes::{account::make_fake_account, category::make_fake_category, transaction::make_fake_transaction_builder, transaction_categorisation::make_fake_transaction_categorisation_builder}, test_context::TestContext};
+use crate::common::{fakes::{account::make_fake_account, budget_update::make_fake_budget_update_builder, category::make_fake_category, transaction::make_fake_transaction_builder, transaction_categorisation::make_fake_transaction_categorisation_builder}, test_context::TestContext};
fn given_categories(connection: &mut SqliteConnection) -> Vec<Category> {
let categories = vec![make_fake_category(0), make_fake_category(1)];
@@ -41,6 +42,20 @@ fn given_transaction_categorisations(connection: &mut SqliteConnection) -> Vec<T
transaction_categorisations
}
+fn given_budget_updates(connection: &mut SqliteConnection) -> Vec<BudgetUpdate> {
+ let now = Utc::now();
+ let twenty_days_ago = DateUtc::from(now.checked_sub_days(Days::new(20)).unwrap());
+ let ten_days_ago = DateUtc::from(now.checked_sub_days(Days::new(10)).unwrap());
+ let budget_updates = vec![
+ make_fake_budget_update_builder(0).category_id(0).date(twenty_days_ago.clone()).new_budget(100).new_period(1).build().unwrap(),
+ make_fake_budget_update_builder(1).category_id(0).date(ten_days_ago.clone()).new_budget(50).new_period(2).build().unwrap(),
+ make_fake_budget_update_builder(2).category_id(1).date(twenty_days_ago.clone()).new_budget(90).new_period(4).build().unwrap(),
+ make_fake_budget_update_builder(3).category_id(1).date(ten_days_ago.clone()).new_budget(40).new_period(8).build().unwrap(),
+ ];
+ let _ = queries::budget_updates::insert_budget_updates(&budget_updates, connection);
+ budget_updates
+}
+
#[test]
fn when_insert_categories_then_returns_num_categories() {
let context = TestContext::new();
@@ -153,6 +168,51 @@ fn given_categories_when_get_all_ids_then_return_all_ids() {
}
#[test]
-fn todo3() {
- todo!("test get_most_recent_per_category_id");
+fn given_categories_and_no_budget_updates_when_get_most_recent_budget_per_category_id_then_return_none() {
+ let context = TestContext::new();
+ let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
+ let categories = given_categories(connection);
+
+ let most_recent_budget_per_category_id = queries::categories::get_most_recent_category_budget_per_category_id(connection);
+
+ assert!(most_recent_budget_per_category_id.is_ok());
+ let most_recent_budget_per_category_id = most_recent_budget_per_category_id.unwrap();
+ assert_eq!(categories.len(), most_recent_budget_per_category_id.len());
+ for category in categories {
+ let most_recent_budget = most_recent_budget_per_category_id.iter().find(|b| b.category_id == category.id);
+ assert!(most_recent_budget.is_some());
+ let most_recent_budget = most_recent_budget.unwrap();
+ assert!(most_recent_budget.budget.is_none());
+ }
+}
+
+#[test]
+fn given_categories_and_budget_updates_when_get_most_recent_budget_per_category_id_then_return_most_recent_budget() {
+ let context = TestContext::new();
+ let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
+ let categories = given_categories(connection);
+ let budget_updates = given_budget_updates(connection);
+
+ let most_recent_budget_per_category_id = queries::categories::get_most_recent_category_budget_per_category_id(connection);
+
+ assert!(most_recent_budget_per_category_id.is_ok());
+ let most_recent_budget_per_category_id = most_recent_budget_per_category_id.unwrap();
+ assert_eq!(categories.len(), most_recent_budget_per_category_id.len());
+ for category in categories {
+ let most_recent_budget_update = budget_updates
+ .iter()
+ .filter(|bu| bu.category_id == category.id)
+ .max_by_key(|bu| bu.date.clone())
+ .unwrap();
+
+ let most_recent_budget = most_recent_budget_per_category_id.iter().find(|b| b.category_id == category.id);
+ assert!(most_recent_budget.is_some());
+ let most_recent_budget = most_recent_budget.unwrap();
+ assert!(most_recent_budget.budget.is_some());
+ let most_recent_budget = most_recent_budget.budget.unwrap();
+ assert_eq!(most_recent_budget, Budget {
+ quantity: most_recent_budget_update.new_budget,
+ period: most_recent_budget_update.new_period,
+ });
+ }
}