Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: test transaction calculators #14

Merged
merged 20 commits into from
Jun 1, 2023
Merged
Changes from 1 commit
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
43d455d
refactor: Refactor transaction worker struct and category validation …
matiasvillaverde May 31, 2023
def7181
refactor: Refactor capital calculations and add new calculator.
matiasvillaverde May 31, 2023
535a5f5
refactor: Refactor trade capital calculations for approved trades
matiasvillaverde May 31, 2023
f9ec7f8
refactor: Refactor transaction and capital calculation modules.
matiasvillaverde Jun 1, 2023
c1c4c36
test: trade calculators
matiasvillaverde Jun 1, 2023
e9e111c
refactor: Refactor trade calculator to use UUIDs for database integra…
matiasvillaverde Jun 1, 2023
bbe1a5f
refactor: Refactor capital calculation modules and functions.
matiasvillaverde Jun 1, 2023
5f06aba
refactor: Simplify and optimize code by removing unused imports, func…
matiasvillaverde Jun 1, 2023
3efc453
refactor: Refactor trade calculations and remove redundant funding fu…
matiasvillaverde Jun 1, 2023
029160d
refactor: Refactor trade taxation with new module and function
matiasvillaverde Jun 1, 2023
a0e4d2a
refactor: Refactor trade performance calculation logic.
matiasvillaverde Jun 1, 2023
a57bfbb
refactor: Refactor unused imports and remove transaction calculator.
matiasvillaverde Jun 1, 2023
7ff9365
refactor: Refactor account calculators for better organization and re…
matiasvillaverde Jun 1, 2023
6fa71d1
refactor: Refactor trade and capital calculations with MockDatabase a…
matiasvillaverde Jun 1, 2023
56072f3
refactor: Simplify risk calculations and improve tests in trade calcu…
matiasvillaverde Jun 1, 2023
ee51ef7
test: Improve trade capital calculation testing.
matiasvillaverde Jun 1, 2023
87f0443
feat: Calculate total capital not at risk for trades.
matiasvillaverde Jun 1, 2023
6a7101e
refactor: Refactor test suite and mock database for better testing.
matiasvillaverde Jun 1, 2023
9cb82a9
chore: Bump up version numbers across multiple packages
matiasvillaverde Jun 1, 2023
f959b8d
refactor: Refactor `calculate` function in `AccountCapitalAvailable` …
matiasvillaverde Jun 1, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
refactor: Refactor account calculators for better organization and re…
…adability

- Refactor and rename files related to account calculators
- Rename `calculators` to `account_calculators` throughout the codebase
- Refactor functions to improve readability and remove unused parameters/imports
- Add new tests for improved test coverage
- Modify trade calculations to ignore certain transaction categories in `trade_calculators/capital_in_market.rs`
matiasvillaverde committed Jun 1, 2023
commit 7ff93657fb1b33e4cf3a92ff0ccce7e23f8f612b
Original file line number Diff line number Diff line change
@@ -3,12 +3,9 @@ mod capital_balance;
mod capital_beginning_of_month;
mod capital_in_trades;
mod capital_taxable;
mod quantity_calculator;
mod risk_calculator;

pub use capital_available::AccountCapitalAvailable;
pub use capital_balance::AccountCapitalBalance;
pub use capital_beginning_of_month::AccountCapitalBeginningOfMonth;
pub use capital_in_trades::AccountCapitalInApprovedTrades;
pub use capital_taxable::AccountCapitalTaxable;
pub use quantity_calculator::QuantityCalculator;
pub use risk_calculator::RiskCalculator;
Original file line number Diff line number Diff line change
@@ -20,7 +20,7 @@ impl AccountCapitalAvailable {
}

// Sum all transactions
let total_available: Decimal = transactions
let total: Decimal = transactions
.iter()
.map(|transaction| match transaction.category {
TransactionCategory::FundTrade(_) | TransactionCategory::Withdrawal | TransactionCategory::FeeOpen(_) | TransactionCategory::FeeClose(_) => {
@@ -36,15 +36,13 @@ impl AccountCapitalAvailable {
})
.sum();

if total_available.is_sign_negative() {
return Err(format!(
"capital_available: total available is negative: {}",
total_available
)
.into());
if total.is_sign_negative() {
return Err(
format!("capital_available: total available is negative: {}", total).into(),
);
}

Ok(total_available)
Ok(total)
}
}

@@ -56,46 +54,41 @@ mod tests {

#[test]
fn test_capital_available_with_empty_transactions() {
let account_id = Uuid::new_v4();
let currency = Currency::USD;
let mut database = MockDatabase::new();

let result = AccountCapitalAvailable::calculate(account_id, &currency, &mut database);
let result =
AccountCapitalAvailable::calculate(Uuid::new_v4(), &Currency::USD, &mut database);
assert_eq!(result.unwrap(), dec!(0));
}

#[test]
fn test_capital_available_with_positive_transactions() {
let account_id = Uuid::new_v4();
let currency = Currency::USD;
let mut database = MockDatabase::new();

// One deposit transaction in the database
database.set_transaction(TransactionCategory::Deposit, dec!(100));
database.set_transaction(TransactionCategory::Deposit, dec!(100));

let result = AccountCapitalAvailable::calculate(account_id, &currency, &mut database);
let result =
AccountCapitalAvailable::calculate(Uuid::new_v4(), &Currency::USD, &mut database);
assert_eq!(result.unwrap(), dec!(200));
}

#[test]
fn test_capital_available_with_negative_transactions() {
let account_id = Uuid::new_v4();
let currency = Currency::USD;
let mut database = MockDatabase::new();

// Transactions
database.set_transaction(TransactionCategory::Deposit, dec!(100));
database.set_transaction(TransactionCategory::Withdrawal, dec!(50));

let result = AccountCapitalAvailable::calculate(account_id, &currency, &mut database);
let result =
AccountCapitalAvailable::calculate(Uuid::new_v4(), &Currency::USD, &mut database);
assert_eq!(result.unwrap(), dec!(50));
}

#[test]
fn test_capital_available_with_multiple_transactions() {
let account_id = Uuid::new_v4();
let currency = Currency::USD;
let mut database = MockDatabase::new();

// Transactions
@@ -113,14 +106,13 @@ mod tests {
database.set_transaction(TransactionCategory::Deposit, dec!(100));
database.set_transaction(TransactionCategory::Withdrawal, dec!(50));

let result = AccountCapitalAvailable::calculate(account_id, &currency, &mut database);
let result =
AccountCapitalAvailable::calculate(Uuid::new_v4(), &Currency::USD, &mut database);
assert_eq!(result.unwrap(), dec!(3526));
}

#[test]
fn test_capital_available_with_with() {
let account_id = Uuid::new_v4();
let currency = Currency::USD;
let mut database = MockDatabase::new();

// Transactions
@@ -138,7 +130,8 @@ mod tests {
database.set_transaction(TransactionCategory::Deposit, dec!(100));
database.set_transaction(TransactionCategory::Withdrawal, dec!(50));

let result = AccountCapitalAvailable::calculate(account_id, &currency, &mut database);
let result =
AccountCapitalAvailable::calculate(Uuid::new_v4(), &Currency::USD, &mut database);
assert_eq!(result.unwrap(), dec!(3526));
}

@@ -147,27 +140,23 @@ mod tests {
expected = "capital_available: does not know how to calculate transaction with category: withdrawal_tax"
)]
fn test_capital_available_with_unknown_category() {
let account_id = Uuid::new_v4();
let currency = Currency::USD;
let mut database = MockDatabase::new();

// Transactions
database.set_transaction(TransactionCategory::WithdrawalTax, dec!(100));

AccountCapitalAvailable::calculate(account_id, &currency, &mut database).unwrap();
AccountCapitalAvailable::calculate(Uuid::new_v4(), &Currency::USD, &mut database).unwrap();
}

#[test]
fn test_capital_available_is_negative() {
let account_id = Uuid::new_v4();
let currency = Currency::USD;
let mut database = MockDatabase::new();

// Transactions
database.set_transaction(TransactionCategory::Deposit, dec!(100));
database.set_transaction(TransactionCategory::Withdrawal, dec!(200));

AccountCapitalAvailable::calculate(account_id, &currency, &mut database)
AccountCapitalAvailable::calculate(Uuid::new_v4(), &Currency::USD, &mut database)
.expect_err("capital_available: total available is negative: -100");
}
}
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@ impl AccountCapitalBalance {
currency: &Currency,
database: &mut dyn ReadTransactionDB,
) -> Result<Decimal, Box<dyn std::error::Error>> {
let total_balance = database
let total = database
.all_transactions(account_id, currency)?
.into_iter()
.fold(dec!(0), |acc, tx| match tx.category {
@@ -28,7 +28,7 @@ impl AccountCapitalBalance {
_ => acc,
});

Ok(total_balance)
Ok(total)
}
}

@@ -42,53 +42,53 @@ mod tests {
let account_id = Uuid::new_v4();
let mut database = MockDatabase::new();

let result = AccountCapitalBalance::calculate(account_id, &Currency::USD, &mut database);
let result =
AccountCapitalBalance::calculate(Uuid::new_v4(), &Currency::USD, &mut database);
assert_eq!(result.unwrap(), dec!(0));
}

#[test]
fn test_total_balance_with_positive_transactions() {
let account_id = Uuid::new_v4();
let mut database = MockDatabase::new();

// One deposit transaction in the database
database.set_transaction(TransactionCategory::Deposit, dec!(100));
database.set_transaction(TransactionCategory::Deposit, dec!(100));

let result = AccountCapitalBalance::calculate(account_id, &Currency::USD, &mut database);
let result =
AccountCapitalBalance::calculate(Uuid::new_v4(), &Currency::USD, &mut database);
assert_eq!(result.unwrap(), dec!(200));
}

#[test]
fn test_total_balance_with_negative_transactions() {
let account_id = Uuid::new_v4();
let mut database = MockDatabase::new();

// One withdrawal transaction in the database
database.set_transaction(TransactionCategory::Deposit, dec!(100));
database.set_transaction(TransactionCategory::Withdrawal, dec!(50));

let result = AccountCapitalBalance::calculate(account_id, &Currency::USD, &mut database);
let result =
AccountCapitalBalance::calculate(Uuid::new_v4(), &Currency::USD, &mut database);
assert_eq!(result.unwrap(), dec!(50));
}

#[test]
fn test_total_balance_with_open_trade_transactions() {
let account_id = Uuid::new_v4();
let mut database = MockDatabase::new();

// One open trade transaction in the database
database.set_transaction(TransactionCategory::Deposit, dec!(250));
database.set_transaction(TransactionCategory::FundTrade(Uuid::new_v4()), dec!(100));
database.set_transaction(TransactionCategory::OpenTrade(Uuid::new_v4()), dec!(100));

let result = AccountCapitalBalance::calculate(account_id, &Currency::USD, &mut database);
let result =
AccountCapitalBalance::calculate(Uuid::new_v4(), &Currency::USD, &mut database);
assert_eq!(result.unwrap(), dec!(150));
}

#[test]
fn test_total_balance_with_close_trade_transactions() {
let account_id = Uuid::new_v4();
let mut database = MockDatabase::new();

// One close trade transaction in the database
@@ -100,13 +100,13 @@ mod tests {
dec!(90),
);

let result = AccountCapitalBalance::calculate(account_id, &Currency::USD, &mut database);
let result =
AccountCapitalBalance::calculate(Uuid::new_v4(), &Currency::USD, &mut database);
assert_eq!(result.unwrap(), dec!(240));
}

#[test]
fn test_total_balance_with_mixed_transactions() {
let account_id = Uuid::new_v4();
let mut database = MockDatabase::new();

// Mix of transactions in the database
@@ -119,13 +119,13 @@ mod tests {
dec!(10),
);

let result = AccountCapitalBalance::calculate(account_id, &Currency::USD, &mut database);
let result =
AccountCapitalBalance::calculate(Uuid::new_v4(), &Currency::USD, &mut database);
assert_eq!(result.unwrap(), dec!(860));
}

#[test]
fn test_total_balance_with_mixed_transactions_including_ignored_transactions() {
let account_id = Uuid::new_v4();
let mut database = MockDatabase::new();

// Mix of transactions in the database
@@ -145,7 +145,8 @@ mod tests {
dec!(10),
);

let result = AccountCapitalBalance::calculate(account_id, &Currency::USD, &mut database);
let result =
AccountCapitalBalance::calculate(Uuid::new_v4(), &Currency::USD, &mut database);
assert_eq!(result.unwrap(), dec!(860));
}
}
Loading