diff options
Diffstat (limited to 'rust')
14 files changed, 225 insertions, 0 deletions
diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 1acaf33..f19975d 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -45,6 +45,7 @@ dependencies = [ "actualbudget_queries", "anyhow", "diesel", + "diesel_migrations", "itertools", "libsqlite3-sys", "schist_models", diff --git a/rust/actualbudget_to_schist_transformer/Cargo.toml b/rust/actualbudget_to_schist_transformer/Cargo.toml index f892bde..9676954 100644 --- a/rust/actualbudget_to_schist_transformer/Cargo.toml +++ b/rust/actualbudget_to_schist_transformer/Cargo.toml @@ -9,6 +9,7 @@ actualbudget_models = { path = "../actualbudget_models" } actualbudget_queries = { path = "../actualbudget_queries" } anyhow = { workspace = true } diesel = { workspace = true, features = ["sqlite"] } +diesel_migrations = { workspace = true } itertools = { workspace = true } libsqlite3-sys = { workspace = true, features = ["bundled"] } schist_models = { path = "../schist_models" } diff --git a/rust/actualbudget_to_schist_transformer/tests/common/account_matchers.rs b/rust/actualbudget_to_schist_transformer/tests/common/account_matchers.rs new file mode 100644 index 0000000..599f31f --- /dev/null +++ b/rust/actualbudget_to_schist_transformer/tests/common/account_matchers.rs @@ -0,0 +1,32 @@ +use schist_models::account::Account; + +pub fn get_account_matchers() -> Vec<Box<dyn Fn(&Account) -> bool>> { + vec![ + Box::new(|a| matches_bank_account(a)), + Box::new(|a| matches_cash_account(a)), + ] +} + +fn matches_bank_account(account: &Account) -> bool { + match account { + Account { + name, + opening_balance: 0, + opening_date, + .. + } => name == "My bank account" && *opening_date == "2024-08-01".parse().unwrap(), + _ => false, + } +} + +fn matches_cash_account(account: &Account) -> bool { + match account { + Account { + name, + opening_balance: 0, + opening_date, + .. + } => name == "My cash account" && *opening_date == "2024-08-01".parse().unwrap(), + _ => false, + } +} diff --git a/rust/actualbudget_to_schist_transformer/tests/common/account_transfer_matchers.rs b/rust/actualbudget_to_schist_transformer/tests/common/account_transfer_matchers.rs new file mode 100644 index 0000000..c881ada --- /dev/null +++ b/rust/actualbudget_to_schist_transformer/tests/common/account_transfer_matchers.rs @@ -0,0 +1,6 @@ +use schist_models::account_transfer::AccountTransfer; + +pub fn get_account_transfer_matchers( +) -> Vec<Box<dyn Fn(&AccountTransfer) -> bool>> { + todo!() +} diff --git a/rust/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs b/rust/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs new file mode 100644 index 0000000..ae86102 --- /dev/null +++ b/rust/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs @@ -0,0 +1,6 @@ +use schist_models::budget_drip::BudgetDrip; + +pub fn get_budget_drip_matchers( +) -> Vec<Box<dyn Fn(&BudgetDrip) -> bool>> { + todo!() +} diff --git a/rust/actualbudget_to_schist_transformer/tests/common/category_matchers.rs b/rust/actualbudget_to_schist_transformer/tests/common/category_matchers.rs new file mode 100644 index 0000000..8a76259 --- /dev/null +++ b/rust/actualbudget_to_schist_transformer/tests/common/category_matchers.rs @@ -0,0 +1,6 @@ +use schist_models::category::Category; + +pub fn get_category_matchers( +) -> Vec<Box<dyn Fn(&Category) -> bool>> { + todo!() +} diff --git a/rust/actualbudget_to_schist_transformer/tests/common/category_transfer_matchers.rs b/rust/actualbudget_to_schist_transformer/tests/common/category_transfer_matchers.rs new file mode 100644 index 0000000..c7f5c87 --- /dev/null +++ b/rust/actualbudget_to_schist_transformer/tests/common/category_transfer_matchers.rs @@ -0,0 +1,6 @@ +use schist_models::category_transfer::CategoryTransfer; + +pub fn get_category_transfer_matchers( +) -> Vec<Box<dyn Fn(&CategoryTransfer) -> bool>> { + todo!() +} diff --git a/rust/actualbudget_to_schist_transformer/tests/common/db_url.rs b/rust/actualbudget_to_schist_transformer/tests/common/db_url.rs new file mode 100644 index 0000000..9cd8e39 --- /dev/null +++ b/rust/actualbudget_to_schist_transformer/tests/common/db_url.rs @@ -0,0 +1,2 @@ +pub const TEST_IN_DB_URL: &str = "tests/resources/actualbudget_test_db.sqlite"; +pub const TEST_OUT_DB_URL: &str = "tests/resources/.schist_test_out_db.sqlite"; diff --git a/rust/actualbudget_to_schist_transformer/tests/common/mod.rs b/rust/actualbudget_to_schist_transformer/tests/common/mod.rs new file mode 100644 index 0000000..2ea37d4 --- /dev/null +++ b/rust/actualbudget_to_schist_transformer/tests/common/mod.rs @@ -0,0 +1,20 @@ +mod account_matchers; +mod account_transfer_matchers; +mod budget_drip_matchers; +mod category_matchers; +mod category_transfer_matchers; +mod db_url; +mod test_context; +mod transaction_matchers; +mod transaction_categorisation_matchers; + +pub use account_matchers::get_account_matchers; +pub use account_transfer_matchers::get_account_transfer_matchers; +pub use budget_drip_matchers::get_budget_drip_matchers; +pub use category_matchers::get_category_matchers; +pub use category_transfer_matchers::get_category_transfer_matchers; +pub use db_url::TEST_IN_DB_URL; +pub use db_url::TEST_OUT_DB_URL; +pub use test_context::TestContext; +pub use transaction_matchers::get_transaction_matchers; +pub use transaction_categorisation_matchers::get_transaction_categorisation_matchers; diff --git a/rust/actualbudget_to_schist_transformer/tests/common/test_context.rs b/rust/actualbudget_to_schist_transformer/tests/common/test_context.rs new file mode 100644 index 0000000..e59c5f8 --- /dev/null +++ b/rust/actualbudget_to_schist_transformer/tests/common/test_context.rs @@ -0,0 +1,42 @@ +use anyhow::Context; +use diesel::{Connection, SqliteConnection}; +use diesel_migrations::MigrationHarness; +use schist_queries::clear::clear; +use schist_models::migrations::MIGRATIONS; + +use super::{TEST_IN_DB_URL, TEST_OUT_DB_URL}; + +pub struct TestContext { +} + +impl TestContext { + pub fn new() -> Self { + let _in_connection = &mut SqliteConnection + ::establish(&TEST_IN_DB_URL) + .with_context(|| format!("failed to establish connection to in database at {}", TEST_IN_DB_URL)) + .unwrap(); + + let out_connection = &mut SqliteConnection + ::establish(&TEST_OUT_DB_URL) + .with_context(|| format!("failed to establish connection to out database at {}", TEST_OUT_DB_URL)) + .unwrap(); + + out_connection + .run_pending_migrations(MIGRATIONS) + .expect("failed to run migrations on out database"); + + clear(out_connection) + .expect("failed to clear database"); + + Self { + } + } +} + +impl Drop for TestContext { + fn drop(&mut self) { + std::fs::remove_file(&TEST_OUT_DB_URL) + .with_context(|| format!("failed to delete out database at {}", TEST_OUT_DB_URL)) + .unwrap(); + } +} diff --git a/rust/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs b/rust/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs new file mode 100644 index 0000000..20846e2 --- /dev/null +++ b/rust/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs @@ -0,0 +1,6 @@ +use schist_models::transaction_categorisation::TransactionCategorisation; + +pub fn get_transaction_categorisation_matchers( +) -> Vec<Box<dyn Fn(&TransactionCategorisation) -> bool>> { + todo!() +} diff --git a/rust/actualbudget_to_schist_transformer/tests/common/transaction_matchers.rs b/rust/actualbudget_to_schist_transformer/tests/common/transaction_matchers.rs new file mode 100644 index 0000000..3f126fd --- /dev/null +++ b/rust/actualbudget_to_schist_transformer/tests/common/transaction_matchers.rs @@ -0,0 +1,6 @@ +use schist_models::transaction::Transaction; + +pub fn get_transaction_matchers( +) -> Vec<Box<dyn Fn(&Transaction) -> bool>> { + todo!() +} diff --git a/rust/actualbudget_to_schist_transformer/tests/resources/actualbudget_test_db.sqlite b/rust/actualbudget_to_schist_transformer/tests/resources/actualbudget_test_db.sqlite new file mode 120000 index 0000000..f8d3f5d --- /dev/null +++ b/rust/actualbudget_to_schist_transformer/tests/resources/actualbudget_test_db.sqlite @@ -0,0 +1 @@ +../../../actualbudget_queries/tests/resources/actualbudget_test_db.sqlite
\ No newline at end of file diff --git a/rust/actualbudget_to_schist_transformer/tests/run.rs b/rust/actualbudget_to_schist_transformer/tests/run.rs new file mode 100644 index 0000000..3a55812 --- /dev/null +++ b/rust/actualbudget_to_schist_transformer/tests/run.rs @@ -0,0 +1,90 @@ +pub mod common; + +use actualbudget_to_schist_transformer::run::run; +use common::{get_account_matchers, get_account_transfer_matchers, get_budget_drip_matchers, get_category_matchers, get_category_transfer_matchers, get_transaction_categorisation_matchers, get_transaction_matchers, TestContext, TEST_IN_DB_URL, TEST_OUT_DB_URL}; +use diesel::{Connection, SqliteConnection}; +use schist_queries::{account_transfers::get_all_account_transfers, accounts::get_all_accounts, budget_drips::get_all_budget_drips, categories::get_all_categories, category_transfers::get_all_category_transfers, transaction_categorisations::get_all_transaction_categorisations, transactions::get_all_transactions}; + +#[test] +fn given_test_database_when_run_then_exports_expected_schist_state() { + let _context = TestContext::new(); + run(TEST_IN_DB_URL, TEST_OUT_DB_URL).unwrap(); + let connection = &mut SqliteConnection::establish(TEST_OUT_DB_URL).unwrap(); + let accounts = get_all_accounts(connection).unwrap(); + let account_transfers = get_all_account_transfers(connection).unwrap(); + let budget_drips = get_all_budget_drips(connection).unwrap(); + let categories = get_all_categories(connection).unwrap(); + let category_transfers = get_all_category_transfers(connection).unwrap(); + let transactions = get_all_transactions(connection).unwrap(); + let transaction_categorisations = get_all_transaction_categorisations(connection).unwrap(); + + let account_matchers = get_account_matchers(); + assert_eq!(account_matchers.len(), accounts.len()); + for account in accounts { + assert!( + account_matchers.iter().any(|m| m(&account)), + "no match found for account {:?}", + account, + ); + } + + let account_transfer_matchers = get_account_transfer_matchers(); + assert_eq!(account_transfer_matchers.len(), account_transfers.len()); + for account_transfer in account_transfers { + assert!( + account_transfer_matchers.iter().any(|m| m(&account_transfer)), + "no match found for account_transfer {:?}", + account_transfer, + ); + } + + let budget_drip_matchers = get_budget_drip_matchers(); + assert_eq!(budget_drip_matchers.len(), budget_drips.len()); + for budget_drip in budget_drips { + assert!( + budget_drip_matchers.iter().any(|m| m(&budget_drip)), + "no match found for budget_drip {:?}", + budget_drip, + ); + } + + let category_matchers = get_category_matchers(); + assert_eq!(category_matchers.len(), categories.len()); + for category in categories { + assert!( + category_matchers.iter().any(|m| m(&category)), + "no match found for category {:?}", + category, + ); + } + + let category_transfer_matchers = get_category_transfer_matchers(); + assert_eq!(category_transfer_matchers.len(), category_transfers.len()); + for category_transfer in category_transfers { + assert!( + category_transfer_matchers.iter().any(|m| m(&category_transfer)), + "no match found for category_transfer {:?}", + category_transfer, + ); + } + + let transaction_matchers = get_transaction_matchers(); + assert_eq!(transaction_matchers.len(), transactions.len()); + for transaction in transactions { + assert!( + transaction_matchers.iter().any(|m| m(&transaction)), + "no match found for transaction {:?}", + transaction, + ); + } + + let transaction_categorisation_matchers = get_transaction_categorisation_matchers(); + assert_eq!(transaction_categorisation_matchers.len(), transaction_categorisations.len()); + for transaction_categorisation in transaction_categorisations { + assert!( + transaction_categorisation_matchers.iter().any(|m| m(&transaction_categorisation)), + "no match found for transaction_categorisation {:?}", + transaction_categorisation, + ); + } +} |
