package ru.orangesoftware.financisto2.test.db; import java.util.List; import java.util.Map; import ru.orangesoftware.financisto2.model.Account; import ru.orangesoftware.financisto2.model.Category; import ru.orangesoftware.financisto2.model.Transaction; import ru.orangesoftware.financisto2.test.builders.AccountBuilder; import ru.orangesoftware.financisto2.test.builders.CategoryBuilder; import ru.orangesoftware.financisto2.test.builders.TransactionBuilder; import ru.orangesoftware.financisto2.test.builders.TransferBuilder; public class AccountTotalTest extends AbstractDbTest { Account a1; Account a2; Account a3; Map<String, Category> categoriesMap; @Override public void setUp() throws Exception { super.setUp(); a1 = AccountBuilder.createDefault(db); a2 = AccountBuilder.createDefault(db); a3 = AccountBuilder.createDefault(db); categoriesMap = CategoryBuilder.createDefaultHierarchy(categoryRepository); } public void test_should_update_account_total_when_credit_transaction_is_added() { TransactionBuilder.withDb(db).account(a1).amount(1000).create(); assertAccountTotal(a1, 1000); TransactionBuilder.withDb(db).account(a1).amount(1234).create(); assertAccountTotal(a1, 2234); db.recalculateAccountsBalances(); assertAccountTotal(a1, 2234); } public void test_should_update_account_total_when_debit_transaction_is_added() { TransactionBuilder.withDb(db).account(a1).amount(-1000).create(); assertAccountTotal(a1, -1000); TransactionBuilder.withDb(db).account(a1).amount(-1234).create(); assertAccountTotal(a1, -2234); db.recalculateAccountsBalances(); assertAccountTotal(a1, -2234); } public void test_should_update_account_total_when_credit_transaction_is_updated_with_bigger_amount() { Transaction t = TransactionBuilder.withDb(db).account(a1).amount(1000).create(); assertAccountTotal(a1, 1000); t.fromAmount = 1234; db.insertOrUpdate(t); assertAccountTotal(a1, 1234); db.recalculateAccountsBalances(); assertAccountTotal(a1, 1234); } public void test_should_update_account_total_when_credit_transaction_is_updated_with_lesser_amount() { Transaction t = TransactionBuilder.withDb(db).account(a1).amount(1000).create(); assertAccountTotal(a1, 1000); t.fromAmount = 900; db.insertOrUpdate(t); assertAccountTotal(a1, 900); db.recalculateAccountsBalances(); assertAccountTotal(a1, 900); } public void test_should_update_account_total_when_debit_transaction_is_updated_with_lesser_amount() { Transaction t = TransactionBuilder.withDb(db).account(a1).amount(-1000).create(); assertAccountTotal(a1, -1000); t.fromAmount = -900; db.insertOrUpdate(t); assertAccountTotal(a1, -900); db.recalculateAccountsBalances(); assertAccountTotal(a1, -900); } public void test_should_update_account_total_when_debit_transaction_is_updated_with_bigger_amount() { Transaction t = TransactionBuilder.withDb(db).account(a1).amount(-1000).create(); assertAccountTotal(a1, -1000); t.fromAmount = -1920; db.insertOrUpdate(t); assertAccountTotal(a1, -1920); db.recalculateAccountsBalances(); assertAccountTotal(a1, -1920); } public void test_should_update_account_total_when_credit_transaction_is_converted_to_debit_and_back() { Transaction t = TransactionBuilder.withDb(db).account(a1).amount(1000).create(); assertAccountTotal(a1, 1000); t.fromAmount = -550; db.insertOrUpdate(t); assertAccountTotal(a1, -550); t.fromAmount = 226; db.insertOrUpdate(t); assertAccountTotal(a1, 226); db.recalculateAccountsBalances(); assertAccountTotal(a1, 226); } public void test_should_update_account_total_when_debit_transaction_is_converted_to_credit_and_back() { Transaction t = TransactionBuilder.withDb(db).account(a1).amount(-1000).create(); assertAccountTotal(a1, -1000); t.fromAmount = 245; db.insertOrUpdate(t); assertAccountTotal(a1, 245); t.fromAmount = -110; db.insertOrUpdate(t); assertAccountTotal(a1, -110); db.recalculateAccountsBalances(); assertAccountTotal(a1, -110); } public void test_should_update_account_total_after_mix_of_debit_and_credit_transactions() { Transaction t = TransactionBuilder.withDb(db).account(a1).amount(1000).create(); assertAccountTotal(a1, 1000); t.fromAmount = 900; // 1000 - 100 db.insertOrUpdate(t); assertAccountTotal(a1, 900); t = TransactionBuilder.withDb(db).account(a1).amount(-123).create(); // 900 - 123 assertAccountTotal(a1, 777); t.fromAmount = -120; // 777 + 3 db.insertOrUpdate(t); assertAccountTotal(a1, 780); TransactionBuilder.withDb(db).account(a1).amount(100).create(); // 780 + 100 assertAccountTotal(a1, 880); TransactionBuilder.withDb(db).account(a1).amount(-80).create(); // 880 - 80 assertAccountTotal(a1, 800); db.recalculateAccountsBalances(); assertAccountTotal(a1, 800); } public void test_should_update_account_total_when_transaction_is_deleted() { TransactionBuilder.withDb(db).account(a1).amount(1000).create(); assertAccountTotal(a1, 1000); Transaction t = TransactionBuilder.withDb(db).account(a1).amount(1234).create(); assertAccountTotal(a1, 2234); TransactionBuilder.withDb(db).account(a1).amount(-234).create(); assertAccountTotal(a1, 2000); db.deleteTransaction(t.id); assertAccountTotal(a1, 766); db.recalculateAccountsBalances(); assertAccountTotal(a1, 766); } public void test_should_update_accounts_total_when_transfer_is_added_a() { TransactionBuilder.withDb(db).account(a1).amount(1000).create(); TransactionBuilder.withDb(db).account(a2).amount(2000).create(); assertAccountTotal(a1, 1000); assertAccountTotal(a2, 2000); TransferBuilder.withDb(db).fromAccount(a1).fromAmount(-500).toAccount(a2).toAmount(400).create(); assertAccountTotal(a1, 500); assertAccountTotal(a2, 2400); db.recalculateAccountsBalances(); assertAccountTotal(a1, 500); assertAccountTotal(a2, 2400); } public void test_should_update_accounts_total_when_transfer_is_updated() { TransactionBuilder.withDb(db).account(a1).amount(1000).create(); TransactionBuilder.withDb(db).account(a2).amount(2000).create(); assertAccountTotal(a1, 1000); assertAccountTotal(a2, 2000); Transaction t = TransferBuilder.withDb(db).fromAccount(a1).fromAmount(-500).toAccount(a2).toAmount(400).create(); assertAccountTotal(a1, 500); assertAccountTotal(a2, 2400); t.fromAmount = -600; t.toAmount = 500; db.insertOrUpdate(t); assertAccountTotal(a1, 400); assertAccountTotal(a2, 2500); db.recalculateAccountsBalances(); assertAccountTotal(a1, 400); assertAccountTotal(a2, 2500); } public void test_should_update_accounts_total_when_transfer_is_deleted() { TransactionBuilder.withDb(db).account(a1).amount(1000).create(); TransactionBuilder.withDb(db).account(a2).amount(2000).create(); assertAccountTotal(a1, 1000); assertAccountTotal(a2, 2000); Transaction t = TransferBuilder.withDb(db).fromAccount(a1).fromAmount(-500).toAccount(a2).toAmount(400).create(); assertAccountTotal(a1, 500); assertAccountTotal(a2, 2400); db.deleteTransaction(t.id); assertAccountTotal(a1, 1000); assertAccountTotal(a2, 2000); db.recalculateAccountsBalances(); assertAccountTotal(a1, 1000); assertAccountTotal(a2, 2000); } public void test_should_update_account_total_when_regular_split_is_added() { TransactionBuilder.withDb(db).account(a1).amount(1000).create(); assertAccountTotal(a1, 1000); TransactionBuilder.withDb(db).account(a1).amount(-500) .withSplit(categoriesMap.get("A1"), -400) .withSplit(categoriesMap.get("A2"), -100) .create(); assertAccountTotal(a1, 500); db.recalculateAccountsBalances(); assertAccountTotal(a1, 500); } public void test_should_update_account_total_when_regular_split_is_updated() { TransactionBuilder.withDb(db).account(a1).amount(1000).create(); assertAccountTotal(a1, 1000); Transaction t = TransactionBuilder.withDb(db).account(a1).amount(500) .withSplit(categoriesMap.get("A1"), 400) .withSplit(categoriesMap.get("A2"), 100) .create(); assertAccountTotal(a1, 1500); List<Transaction> splits = db.getSplitsForTransaction(t.id); assertEquals(2, splits.size()); t.fromAmount = 800; splits.get(0).fromAmount = 500; splits.get(1).fromAmount = 300; t.splits = splits; db.insertOrUpdate(t); assertAccountTotal(a1, 1800); db.recalculateAccountsBalances(); assertAccountTotal(a1, 1800); } public void test_should_update_account_total_when_regular_split_is_deleted() { TransactionBuilder.withDb(db).account(a1).amount(1000).create(); assertAccountTotal(a1, 1000); Transaction t = TransactionBuilder.withDb(db).account(a1).amount(500) .withSplit(categoriesMap.get("A1"), 400) .withSplit(categoriesMap.get("A2"), 100) .create(); assertAccountTotal(a1, 1500); db.deleteTransaction(t.id); assertAccountTotal(a1, 1000); db.recalculateAccountsBalances(); assertAccountTotal(a1, 1000); } public void test_should_update_account_total_when_transfer_split_is_added() { TransactionBuilder.withDb(db).account(a1).amount(1000).create(); TransactionBuilder.withDb(db).account(a2).amount(2000).create(); assertAccountTotal(a1, 1000); assertAccountTotal(a2, 2000); TransactionBuilder.withDb(db).account(a1).amount(-500) .withTransferSplit(a2, -500, 200) .create(); assertAccountTotal(a1, 500); assertAccountTotal(a2, 2200); db.recalculateAccountsBalances(); assertAccountTotal(a1, 500); assertAccountTotal(a2, 2200); } public void test_should_update_account_total_when_transfer_split_is_updated() { TransactionBuilder.withDb(db).account(a1).amount(1000).create(); TransactionBuilder.withDb(db).account(a2).amount(2000).create(); assertAccountTotal(a1, 1000); assertAccountTotal(a2, 2000); Transaction t = TransactionBuilder.withDb(db).account(a1).amount(-500) .withTransferSplit(a2, -500, 200) .create(); assertAccountTotal(a1, 500); assertAccountTotal(a2, 2200); List<Transaction> splits = db.getSplitsForTransaction(t.id); t.fromAmount = -400; splits.get(0).fromAmount = -400; splits.get(0).toAmount = 100; t.splits = splits; db.insertOrUpdate(t); assertAccountTotal(a1, 600); assertAccountTotal(a2, 2100); db.recalculateAccountsBalances(); assertAccountTotal(a1, 600); assertAccountTotal(a2, 2100); } public void test_should_update_account_total_when_transfer_split_is_deleted() { TransactionBuilder.withDb(db).account(a1).amount(1000).create(); TransactionBuilder.withDb(db).account(a2).amount(2000).create(); assertAccountTotal(a1, 1000); assertAccountTotal(a2, 2000); Transaction t = TransactionBuilder.withDb(db).account(a1).amount(-500) .withTransferSplit(a2, -500, 200) .create(); assertAccountTotal(a1, 500); assertAccountTotal(a2, 2200); db.deleteTransaction(t.id); assertAccountTotal(a1, 1000); assertAccountTotal(a2, 2000); db.recalculateAccountsBalances(); assertAccountTotal(a1, 1000); assertAccountTotal(a2, 2000); } public void test_should_update_account_total_when_transfer_split_with_multiple_transfers_is_added() { TransactionBuilder.withDb(db).account(a1).amount(2000).create(); TransactionBuilder.withDb(db).account(a2).amount(3000).create(); TransactionBuilder.withDb(db).account(a3).amount(4000).create(); Transaction t = TransactionBuilder.withDb(db).account(a1).amount(-1000) .withTransferSplit(a2, -100, 50) .withTransferSplit(a2, -200, 60) .withTransferSplit(a2, -300, 70) .withTransferSplit(a3, -100, 80) .withTransferSplit(a3, -300, 90) .create(); assertAccountTotal(a1, 1000); assertAccountTotal(a2, 3180); assertAccountTotal(a3, 4170); db.deleteTransaction(t.id); assertAccountTotal(a1, 2000); assertAccountTotal(a2, 3000); assertAccountTotal(a3, 4000); db.recalculateAccountsBalances(); assertAccountTotal(a1, 2000); assertAccountTotal(a2, 3000); assertAccountTotal(a3, 4000); } }