123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- use super::{deposit, get_asset_manager_and_ledger};
- use crate::{AccountId, Asset};
- #[tokio::test]
- async fn pending_deposit_and_failure() {
- let source = "account1".parse::<AccountId>().expect("account");
- let ledger = get_asset_manager_and_ledger().await;
- let usd: Asset = "USD/2".parse().expect("asset");
- let rev_id = ledger
- .deposit(
- &source,
- usd.from_human("30").expect("amount"),
- "processing".into(),
- vec![],
- "Test".to_owned(),
- )
- .await
- .expect("valid tx")
- .revision_id
- .clone();
- assert!(ledger
- .get_balance(&source)
- .await
- .expect("balance")
- .is_empty());
- ledger
- .change_status(rev_id, "failed".into(), "failed due test".to_owned())
- .await
- .expect("valid tx");
- assert!(ledger
- .get_balance(&source)
- .await
- .expect("balance")
- .is_empty());
- }
- #[tokio::test]
- async fn deposit_and_transfer() {
- let source = "account1".parse::<AccountId>().expect("account");
- let dest = "account2".parse::<AccountId>().expect("account");
- let fee = "fee".parse::<AccountId>().expect("account");
- let ledger = get_asset_manager_and_ledger().await;
- let usd: Asset = "USD/2".parse().expect("asset");
- let btc: Asset = "BTC/8".parse().expect("asset");
- deposit(&ledger, &source, usd.from_human("10").expect("amount")).await;
- deposit(&ledger, &source, usd.from_human("20").expect("amount")).await;
- deposit(&ledger, &source, btc.from_human(".2").expect("amount")).await;
- let mut balances = ledger.get_balance(&source).await.expect("balance");
- balances.sort_by(|a, b| a.asset().name.cmp(&b.asset().name));
- assert_eq!(
- vec![
- btc.from_human("0.2").expect("amount"),
- usd.from_human("30").expect("amount")
- ],
- balances
- );
- ledger
- .new_transaction(
- "Exchange one".to_owned(),
- "settled".into(),
- vec![(source.clone(), usd.from_human("13").expect("amount"))],
- vec![
- (dest.clone(), usd.from_human("12.5").expect("amount")),
- (fee.clone(), usd.from_human("0.5").expect("amount")),
- ],
- )
- .await
- .expect("valid tx");
- let mut balances = ledger.get_balance(&source).await.expect("balance");
- balances.sort_by(|a, b| a.asset().name.cmp(&b.asset().name));
- assert_eq!(
- vec![
- btc.from_human("0.2").expect("amount"),
- usd.from_human("17").expect("amount")
- ],
- balances
- );
- assert_eq!(
- vec![usd.from_human("12.5").expect("amount"),],
- ledger.get_balance(&dest).await.expect("balance")
- );
- assert_eq!(
- vec![usd.from_human("0.5").expect("amount"),],
- ledger.get_balance(&fee).await.expect("balance")
- );
- }
- #[tokio::test]
- async fn balance_decreases_while_pending_spending_and_confirm() {
- let source = "account1".parse::<AccountId>().expect("account");
- let dest = "account2".parse::<AccountId>().expect("account");
- let fee = "fee".parse::<AccountId>().expect("account");
- let ledger = get_asset_manager_and_ledger().await;
- let usd: Asset = "USD/2".parse().expect("asset");
- deposit(&ledger, &source, usd.from_human("10").expect("amount")).await;
- deposit(&ledger, &source, usd.from_human("20").expect("amount")).await;
- assert_eq!(
- vec![usd.from_human("30").expect("amount"),],
- ledger.get_balance(&source).await.expect("balance")
- );
- let rev_id = ledger
- .new_transaction(
- "Exchange one".to_owned(),
- "pending".into(),
- vec![(source.clone(), usd.from_human("13").expect("amount"))],
- vec![
- (dest.clone(), usd.from_human("12.5").expect("amount")),
- (fee.clone(), usd.from_human("0.5").expect("amount")),
- ],
- )
- .await
- .expect("valid tx")
- .revision_id
- .clone();
- assert_eq!(
- vec![usd.from_human("17").expect("amount"),],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
- assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
- ledger
- .change_status(rev_id, "settled".into(), "ready".to_owned())
- .await
- .expect("valid tx");
- assert_eq!(
- vec![usd.from_human("17").expect("amount"),],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert_eq!(
- vec![usd.from_human("12.5").expect("amount"),],
- ledger.get_balance(&dest).await.expect("balance")
- );
- assert_eq!(
- vec![usd.from_human("0.5").expect("amount"),],
- ledger.get_balance(&fee).await.expect("balance")
- );
- }
- #[tokio::test]
- async fn balance_decreases_while_pending_spending_and_cancel() {
- let source = "account1".parse::<AccountId>().expect("account");
- let dest = "account2".parse::<AccountId>().expect("account");
- let fee = "fee".parse::<AccountId>().expect("account");
- let ledger = get_asset_manager_and_ledger().await;
- let usd: Asset = "USD/2".parse().expect("asset");
- deposit(&ledger, &source, usd.from_human("10").expect("amount")).await;
- deposit(&ledger, &source, usd.from_human("20").expect("amount")).await;
- assert_eq!(
- vec![usd.from_human("30").expect("amount"),],
- ledger.get_balance(&source).await.expect("balance")
- );
- let rev_id = ledger
- .new_transaction(
- "Exchange one".to_owned(),
- "pending".into(),
- vec![(source.clone(), usd.from_human("13").expect("amount"))],
- vec![
- (dest.clone(), usd.from_human("12.5").expect("amount")),
- (fee.clone(), usd.from_human("0.5").expect("amount")),
- ],
- )
- .await
- .expect("valid tx")
- .revision_id
- .clone();
- assert_eq!(
- vec![usd.from_human("17").expect("amount"),],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
- assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
- ledger
- .change_status(rev_id, "cancelled".into(), "cancelled by test".to_owned())
- .await
- .expect("valid tx");
- assert_eq!(
- vec![usd.from_human("30").expect("amount"),],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
- assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
- }
- #[tokio::test]
- async fn balance_decreases_while_pending_spending_and_failed() {
- let source = "account1".parse::<AccountId>().expect("account");
- let dest = "account2".parse::<AccountId>().expect("account");
- let fee = "fee".parse::<AccountId>().expect("account");
- let ledger = get_asset_manager_and_ledger().await;
- let usd: Asset = "USD/2".parse().expect("asset");
- deposit(&ledger, &source, usd.from_human("10").expect("amount")).await;
- deposit(&ledger, &source, usd.from_human("20").expect("amount")).await;
- assert_eq!(
- vec![usd.from_human("30").expect("amount"),],
- ledger.get_balance(&source).await.expect("balance")
- );
- let rev_id = ledger
- .new_transaction(
- "Exchange one".to_owned(),
- "pending".into(),
- vec![(source.clone(), usd.from_human("13").expect("amount"))],
- vec![
- (dest.clone(), usd.from_human("12.5").expect("amount")),
- (fee.clone(), usd.from_human("0.5").expect("amount")),
- ],
- )
- .await
- .expect("valid tx")
- .revision_id
- .clone();
- assert_eq!(
- vec![usd.from_human("17").expect("amount"),],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
- assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
- let new_rev_id = ledger
- .change_status(rev_id, "processing".into(), "processing now".to_owned())
- .await
- .expect("valid tx")
- .revision_id;
- assert_eq!(
- vec![usd.from_human("17").expect("amount"),],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
- assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
- assert_eq!(
- "Transaction: Error in status: Invalid transition from processing to cancelled".to_owned(),
- ledger
- .change_status(
- new_rev_id.clone(),
- "cancelled".into(),
- "cancelled by user".to_owned()
- )
- .await
- .unwrap_err()
- .to_string()
- );
- assert_eq!(
- vec![usd.from_human("17").expect("amount"),],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
- assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
- ledger
- .change_status(new_rev_id, "failed".into(), "it has failed".to_owned())
- .await
- .expect("valid");
- assert_eq!(
- vec![usd.from_human("30").expect("amount"),],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
- assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
- }
|