summaryrefslogtreecommitdiff
path: root/rust
diff options
context:
space:
mode:
Diffstat (limited to 'rust')
-rw-r--r--rust/Cargo.lock1
-rw-r--r--rust/actualbudget_to_schist_transformer/Cargo.toml1
-rw-r--r--rust/actualbudget_to_schist_transformer/tests/common/account_matchers.rs32
-rw-r--r--rust/actualbudget_to_schist_transformer/tests/common/account_transfer_matchers.rs6
-rw-r--r--rust/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs6
-rw-r--r--rust/actualbudget_to_schist_transformer/tests/common/category_matchers.rs6
-rw-r--r--rust/actualbudget_to_schist_transformer/tests/common/category_transfer_matchers.rs6
-rw-r--r--rust/actualbudget_to_schist_transformer/tests/common/db_url.rs2
-rw-r--r--rust/actualbudget_to_schist_transformer/tests/common/mod.rs20
-rw-r--r--rust/actualbudget_to_schist_transformer/tests/common/test_context.rs42
-rw-r--r--rust/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs6
-rw-r--r--rust/actualbudget_to_schist_transformer/tests/common/transaction_matchers.rs6
l---------rust/actualbudget_to_schist_transformer/tests/resources/actualbudget_test_db.sqlite1
-rw-r--r--rust/actualbudget_to_schist_transformer/tests/run.rs90
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,
+ );
+ }
+}