Skip to content

Commit

Permalink
refactor: Add setup_test_env
Browse files Browse the repository at this point in the history
  • Loading branch information
kovipu committed Feb 18, 2025
1 parent ac4eaf7 commit 317878d
Showing 1 changed file with 133 additions and 136 deletions.
269 changes: 133 additions & 136 deletions contracts/loan_manager/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,6 @@ impl LoanManager {
#[cfg(test)]
mod tests {
use super::*;
use loan_pool::Currency;
use soroban_sdk::{
testutils::{Address as _, Ledger},
token::{Client as TokenClient, StellarAssetClient},
Expand All @@ -500,62 +499,91 @@ mod tests {

struct TestEnv<'a> {
admin: Address,
admin2: Address,
user: Address,
manager_addr: Address,
manager_client: LoanManagerClient<'a>,
token_xlm_addr: Address,
xlm_token_client: TokenClient<'a>,
usdc_token_client: TokenClient<'a>,
pool_xlm_addr: Address,
pool_xlm_client: loan_pool::Client<'a>,
pool_usdc_addr: Address,
pool_usdc_client: loan_pool::Client<'a>,
}

fn setup_test_env(e: &Env) -> TestEnv {
let admin = Address::generate(&e);
let admin = Address::generate(e);
let admin2 = Address::generate(e);
let user = Address::generate(e);

// loan manager
let manager_addr = e.register(LoanManager, ());
let manager_client = LoanManagerClient::new(e, &manager_addr);
manager_client.initialize(&admin);

let wasm_hash = e.deployer().upload_contract_wasm(loan_pool::WASM);
const LIQUIDATION_THRESHOLD: i128 = 8_000_000; // 80%

// XLM Pool
let token_xlm_ticker = Symbol::new(&e, "XLM");
let token_xlm_addr = e
// XLM asset
let xlm_ticker = Symbol::new(e, "XLM");
let xlm_addr = e
.register_stellar_asset_contract_v2(admin.clone())
.address();
let salt = e
.crypto()
.sha256(&token_xlm_addr.clone().to_xdr(&e))
.to_bytes();
let pool_xlm_addr = manager_client.deploy_pool(
&wasm_hash,
&salt,
&token_xlm_addr,
&token_xlm_ticker,
&LIQUIDATION_THRESHOLD,
);
let pool_xlm_client = loan_pool::Client::new(&e, &pool_xlm_addr);
let xlm_asset_client = StellarAssetClient::new(&e, &xlm_addr);
let xlm_token_client = TokenClient::new(e, &xlm_addr);

// XLM pool
let pool_xlm_addr = deploy_pool(e, &manager_client, &xlm_ticker, &xlm_addr);
let pool_xlm_client = loan_pool::Client::new(e, &pool_xlm_addr);

// USDC asset
let usdc_ticker = Symbol::new(e, "USDC");
let usdc_addr = e
.register_stellar_asset_contract_v2(admin2.clone())
.address();
let usdc_asset_client = StellarAssetClient::new(&e, &usdc_addr);
let usdc_token_client = TokenClient::new(e, &usdc_addr);

// USDC pool
let pool_usdc_addr = deploy_pool(e, &manager_client, &usdc_ticker, &usdc_addr);
let pool_usdc_client = loan_pool::Client::new(e, &pool_usdc_addr);

// Mint the admin and the user some coins
xlm_asset_client.mint(&admin, &1_000_000);
usdc_asset_client.mint(&user, &1000);

// Setup mock price oracle
let reflector_addr = Address::from_string(&String::from_str(&e, REFLECTOR_ADDRESS));
e.register_at(&reflector_addr, oracle::WASM, ());

TestEnv {
admin,
admin2,
user,
manager_addr,
manager_client,
token_xlm_addr,
xlm_token_client,
usdc_token_client,
pool_xlm_addr,
pool_xlm_client,
pool_usdc_addr,
pool_usdc_client,
}
}

fn deploy_pool(e: &Env, manager_client: &LoanManagerClient, currency: &Currency) -> Address {
fn deploy_pool(
e: &Env,
manager_client: &LoanManagerClient,
ticker: &Symbol,
token_address: &Address,
) -> Address {
const LIQUIDATION_THRESHOLD: i128 = 8_000_000; // 80%
let wasm_hash = e.deployer().upload_contract_wasm(loan_pool::WASM);
let xdr_bytes = currency.token_address.clone().to_xdr(e);
let xdr_bytes = token_address.clone().to_xdr(e);
let salt = e.crypto().sha256(&xdr_bytes).to_bytes();
manager_client.deploy_pool(
&wasm_hash,
&salt,
&currency.token_address,
&currency.ticker,
&8_000_000,
&token_address,
&ticker,
&LIQUIDATION_THRESHOLD,
)
}

Expand Down Expand Up @@ -623,57 +651,27 @@ mod tests {
let e = Env::default();
e.mock_all_auths_allowing_non_root_auth();

let admin = Address::generate(&e);
let loan_token = e.register_stellar_asset_contract_v2(admin.clone());
let loan_currency = loan_pool::Currency {
token_address: loan_token.address(),
ticker: Symbol::new(&e, "XLM"),
};

let loan_asset = StellarAssetClient::new(&e, &loan_token.address());
let loan_token_client = TokenClient::new(&e, &loan_token.address());
loan_asset.mint(&admin, &1000);

let admin2 = Address::generate(&e);
let collateral_token = e.register_stellar_asset_contract_v2(admin2.clone());
let collateral_asset = StellarAssetClient::new(&e, &collateral_token.address());
let collateral_token_client = TokenClient::new(&e, &collateral_token.address());
let collateral_currency = loan_pool::Currency {
token_address: collateral_token.address(),
ticker: Symbol::new(&e, "USDC"),
};

// Register mock Reflector contract.
let reflector_addr = Address::from_string(&String::from_str(&e, REFLECTOR_ADDRESS));
e.register_at(&reflector_addr, oracle::WASM, ());

// Mint the user some coins
let user = Address::generate(&e);
collateral_asset.mint(&user, &1000);

assert_eq!(collateral_token_client.balance(&user), 1000);

// Register loan manager contract.
let manager_addr = e.register(LoanManager, ());
let manager_client = LoanManagerClient::new(&e, &manager_addr);
manager_client.initialize(&admin);

// Set up a loan pool with funds for borrowing.
let loan_pool_addr = deploy_pool(&e, &manager_client, &loan_currency);
let loan_pool_client = loan_pool::Client::new(&e, &loan_pool_addr);

// Set up a loan_pool for the collaterals.
let collateral_pool_addr = deploy_pool(&e, &manager_client, &collateral_currency);
let TestEnv {
admin,
user,
manager_client,
pool_xlm_client,
pool_xlm_addr,
pool_usdc_addr,
xlm_token_client,
usdc_token_client,
..
} = setup_test_env(&e);

// ACT
// Initialize the loan pool and deposit some of the admin's funds.
loan_pool_client.deposit(&admin, &1000);
pool_xlm_client.deposit(&admin, &1000);

manager_client.create_loan(&user, &10, &loan_pool_addr, &100, &collateral_pool_addr);
manager_client.create_loan(&user, &10, &pool_xlm_addr, &100, &pool_usdc_addr);

// ASSERT
assert_eq!(loan_token_client.balance(&user), 10);
assert_eq!(collateral_token_client.balance(&user), 900);
assert_eq!(xlm_token_client.balance(&user), 10);
assert_eq!(usdc_token_client.balance(&user), 900);
}

#[test]
Expand All @@ -689,72 +687,31 @@ mod tests {
li.max_entry_ttl = 1_000_001;
});

let admin = Address::generate(&e);
let loan_token = e.register_stellar_asset_contract_v2(admin.clone());
let loan_asset = StellarAssetClient::new(&e, &loan_token.address());
loan_asset.mint(&admin, &1_000_000);
let loan_currency = loan_pool::Currency {
token_address: loan_token.address(),
ticker: Symbol::new(&e, "XLM"),
};

let admin2 = Address::generate(&e);
let collateral_token = e.register_stellar_asset_contract_v2(admin2.clone());
let collateral_asset = StellarAssetClient::new(&e, &collateral_token.address());
let collateral_token_client = TokenClient::new(&e, &collateral_token.address());
let collateral_currency = loan_pool::Currency {
token_address: collateral_token.address(),
ticker: Symbol::new(&e, "USDC"),
};

// Register mock Reflector contract.
let reflector_addr = Address::from_string(&String::from_str(&e, REFLECTOR_ADDRESS));
e.register_at(&reflector_addr, oracle::WASM, ());

// Mint the user some coins
let user = Address::generate(&e);
collateral_asset.mint(&user, &1_000_000);

assert_eq!(collateral_token_client.balance(&user), 1_000_000);

let manager_addr = e.register(LoanManager, ());
let manager_client = LoanManagerClient::new(&e, &manager_addr);
manager_client.initialize(&admin);

// Set up a loan pool with funds for borrowing.
let loan_pool_addr = deploy_pool(&e, &manager_client, &loan_currency);
let loan_pool_client = loan_pool::Client::new(&e, &loan_pool_addr);

// Set up a loan_pool for the collaterals.
let collateral_pool_addr = deploy_pool(&e, &manager_client, &collateral_currency);
let collateral_pool_client = loan_pool::Client::new(&e, &collateral_pool_addr);
let TestEnv {
admin,
user,
manager_client,
pool_xlm_addr,
pool_xlm_client,
pool_usdc_addr,
pool_usdc_client,
usdc_token_client,
..
} = setup_test_env(&e);

// Register loan manager contract.
// ACT
// Initialize the loan pool and deposit some of the admin's funds.
loan_pool_client.initialize(&manager_addr, &loan_currency, &8_000_000);
loan_pool_client.deposit(&admin, &10_001);

collateral_pool_client.initialize(&manager_addr, &collateral_currency, &8_000_000);
// deposit some of the admin's funds.
pool_xlm_client.deposit(&admin, &10_001);

// Create a loan.
manager_client.create_loan(
&user,
&10_000,
&loan_pool_addr,
&100_000,
&collateral_pool_addr,
);
manager_client.create_loan(&user, &10_000, &pool_xlm_addr, &100_000, &pool_usdc_addr);

let user_loan = manager_client.get_loan(&user).unwrap();

assert_eq!(user_loan.borrowed_amount, 10_000);
assert_eq!(collateral_token_client.balance(&user), 900_000);

// Here borrowed amount should be the same as time has not moved. add_interest() is only called to store the LastUpdate sequence number.
assert_eq!(user_loan.borrowed_amount, 10_000);
assert_eq!(user_loan.health_factor, 80_000_000);
assert_eq!(collateral_token_client.balance(&user), 900_000);
assert_eq!(usdc_token_client.balance(&user), 900_000);

// Move time
e.ledger().with_mut(|li| {
Expand Down Expand Up @@ -823,11 +780,21 @@ mod tests {
manager_client.initialize(&admin);

// Set up a loan pool with funds for borrowing.
let loan_pool_addr = deploy_pool(&e, &manager_client, &loan_currency);
let loan_pool_addr = deploy_pool(
&e,
&manager_client,
&loan_currency.ticker,
&loan_currency.token_address,
);
let loan_pool_client = loan_pool::Client::new(&e, &loan_pool_addr);

// Set up a loan_pool for the collaterals.
let collateral_pool_addr = deploy_pool(&e, &manager_client, &collateral_currency);
let collateral_pool_addr = deploy_pool(
&e,
&manager_client,
&collateral_currency.ticker,
&collateral_currency.token_address,
);
let collateral_pool_client = loan_pool::Client::new(&e, &collateral_pool_addr);

// ACT
Expand Down Expand Up @@ -923,11 +890,21 @@ mod tests {
manager_client.initialize(&admin);

// Set up a loan pool with funds for borrowing.
let loan_pool_addr = deploy_pool(&e, &manager_client, &loan_currency);
let loan_pool_addr = deploy_pool(
&e,
&manager_client,
&loan_currency.ticker,
&loan_currency.token_address,
);
let loan_pool_client = loan_pool::Client::new(&e, &loan_pool_addr);

// Set up a loan_pool for the collaterals.
let collateral_pool_addr = deploy_pool(&e, &manager_client, &collateral_currency);
let collateral_pool_addr = deploy_pool(
&e,
&manager_client,
&collateral_currency.ticker,
&collateral_currency.token_address,
);
let collateral_pool_client = loan_pool::Client::new(&e, &collateral_pool_addr);

// ACT
Expand Down Expand Up @@ -1016,11 +993,21 @@ mod tests {
manager_client.initialize(&admin);

// Set up a loan pool with funds for borrowing.
let loan_pool_addr = deploy_pool(&e, &manager_client, &loan_currency);
let loan_pool_addr = deploy_pool(
&e,
&manager_client,
&loan_currency.ticker,
&loan_currency.token_address,
);
let loan_pool_client = loan_pool::Client::new(&e, &loan_pool_addr);

// Set up a loan_pool for the collaterals.
let collateral_pool_addr = deploy_pool(&e, &manager_client, &collateral_currency);
let collateral_pool_addr = deploy_pool(
&e,
&manager_client,
&collateral_currency.ticker,
&collateral_currency.token_address,
);
let collateral_pool_client = loan_pool::Client::new(&e, &collateral_pool_addr);

// ACT
Expand Down Expand Up @@ -1088,11 +1075,21 @@ mod tests {
manager_client.initialize(&admin);

// Set up a loan pool with funds for borrowing.
let loan_pool_addr = deploy_pool(&e, &manager_client, &loan_currency);
let loan_pool_addr = deploy_pool(
&e,
&manager_client,
&loan_currency.ticker,
&loan_currency.token_address,
);
let loan_pool_client = loan_pool::Client::new(&e, &loan_pool_addr);

// Set up a loan_pool for the collaterals.
let collateral_pool_addr = deploy_pool(&e, &manager_client, &collateral_currency);
let collateral_pool_addr = deploy_pool(
&e,
&manager_client,
&collateral_currency.ticker,
&collateral_currency.token_address,
);
let collateral_pool_client = loan_pool::Client::new(&e, &collateral_pool_addr);

// ACT
Expand Down

0 comments on commit 317878d

Please sign in to comment.