123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- use super::{deposit, get_asset_manager_and_ledger, withdrawal};
- use crate::{AccountId, Status};
- #[tokio::test]
- async fn deposit_transfer_and_withdrawal() {
- let source = "account1".parse::<AccountId>().expect("account");
- let dest = "account2".parse::<AccountId>().expect("account");
- let fee = "fee".parse::<AccountId>().expect("account");
- let (assets, ledger) = get_asset_manager_and_ledger().await;
- deposit(
- &ledger,
- &source,
- assets.amount_by_and_cents(2, 1000).expect("amount"),
- )
- .await;
- deposit(
- &ledger,
- &source,
- assets.amount_by_and_cents(2, 2000).expect("amount"),
- )
- .await;
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 3000).expect("amount")],
- ledger.get_balance(&source).await.expect("balance")
- );
- ledger
- .new_transaction(
- "Exchange one".to_owned(),
- Status::Settled,
- vec![(
- source.clone(),
- assets.amount_by_and_cents(2, 1300).expect("amount"),
- )],
- vec![
- (
- dest.clone(),
- assets.amount_by_and_cents(2, 1250).expect("amount"),
- ),
- (
- fee.clone(),
- assets.amount_by_and_cents(2, 50).expect("amount"),
- ),
- ],
- )
- .await
- .expect("valid tx");
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 1700).expect("amount")],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
- ledger.get_balance(&dest).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 50).expect("amount")],
- ledger.get_balance(&fee).await.expect("balance")
- );
- assert!(withdrawal(
- &ledger,
- &source,
- Status::Settled,
- assets.amount_by_and_cents(2, 1700).expect("amount")
- )
- .await
- .is_ok());
- assert!(ledger
- .get_balance(&source)
- .await
- .expect("balance")
- .is_empty());
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
- ledger.get_balance(&dest).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 50).expect("amount")],
- ledger.get_balance(&fee).await.expect("balance")
- );
- }
- #[tokio::test]
- async fn fail_to_overwithdrawal() {
- let source = "account1".parse::<AccountId>().expect("account");
- let dest = "account2".parse::<AccountId>().expect("account");
- let fee = "fee".parse::<AccountId>().expect("account");
- let (assets, ledger) = get_asset_manager_and_ledger().await;
- deposit(
- &ledger,
- &source,
- assets.amount_by_and_cents(2, 1000).expect("amount"),
- )
- .await;
- deposit(
- &ledger,
- &source,
- assets.amount_by_and_cents(2, 2000).expect("amount"),
- )
- .await;
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 3000).expect("amount")],
- ledger.get_balance(&source).await.expect("balance")
- );
- ledger
- .new_transaction(
- "Exchange one".to_owned(),
- Status::Settled,
- vec![(
- source.clone(),
- assets.amount_by_and_cents(2, 1300).expect("amount"),
- )],
- vec![
- (
- dest.clone(),
- assets.amount_by_and_cents(2, 1250).expect("amount"),
- ),
- (
- fee.clone(),
- assets.amount_by_and_cents(2, 50).expect("amount"),
- ),
- ],
- )
- .await
- .expect("valid tx");
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 1700).expect("amount")],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
- ledger.get_balance(&dest).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 50).expect("amount")],
- ledger.get_balance(&fee).await.expect("balance")
- );
- assert!(withdrawal(
- &ledger,
- &source,
- Status::Settled,
- assets.amount_by_and_cents(2, 170000).expect("amount")
- )
- .await
- .is_err());
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 1700).expect("amount")],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
- ledger.get_balance(&dest).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 50).expect("amount")],
- ledger.get_balance(&fee).await.expect("balance")
- );
- }
- #[tokio::test]
- async fn cancelled_withdrawal() {
- let source = "account1".parse::<AccountId>().expect("account");
- let dest = "account2".parse::<AccountId>().expect("account");
- let fee = "fee".parse::<AccountId>().expect("account");
- let (assets, ledger) = get_asset_manager_and_ledger().await;
- deposit(
- &ledger,
- &source,
- assets.amount_by_and_cents(2, 1000).expect("amount"),
- )
- .await;
- deposit(
- &ledger,
- &source,
- assets.amount_by_and_cents(2, 2000).expect("amount"),
- )
- .await;
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 3000).expect("amount")],
- ledger.get_balance(&source).await.expect("balance")
- );
- ledger
- .new_transaction(
- "Exchange one".to_owned(),
- Status::Settled,
- vec![(
- source.clone(),
- assets.amount_by_and_cents(2, 1300).expect("amount"),
- )],
- vec![
- (
- dest.clone(),
- assets.amount_by_and_cents(2, 1250).expect("amount"),
- ),
- (
- fee.clone(),
- assets.amount_by_and_cents(2, 50).expect("amount"),
- ),
- ],
- )
- .await
- .expect("valid tx");
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 1700).expect("amount")],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
- ledger.get_balance(&dest).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 50).expect("amount")],
- ledger.get_balance(&fee).await.expect("balance")
- );
- let tx_id = withdrawal(
- &ledger,
- &source,
- Status::Pending,
- assets.amount_by_and_cents(2, 1700).expect("amount"),
- )
- .await
- .expect("valid tx");
- assert!(ledger
- .get_balance(&source)
- .await
- .expect("balance")
- .is_empty());
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
- ledger.get_balance(&dest).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 50).expect("amount")],
- ledger.get_balance(&fee).await.expect("balance")
- );
- ledger
- .change_status(&tx_id, Status::Cancelled, "cancelled by test".to_owned())
- .await
- .expect("valid tx");
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 1700).expect("amount")],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
- ledger.get_balance(&dest).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, 50).expect("amount")],
- ledger.get_balance(&fee).await.expect("balance")
- );
- }
- #[tokio::test]
- async fn negative_withdrawal() {
- let source = "account1".parse::<AccountId>().expect("account");
- let (assets, ledger) = get_asset_manager_and_ledger().await;
- deposit(
- &ledger,
- &source,
- assets.amount_by_and_cents(2, -1000).expect("amount"),
- )
- .await;
- assert_eq!(
- vec![assets.amount_by_and_cents(2, -1000).expect("amount")],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert_eq!(
- vec![assets.amount_by_and_cents(2, -1000).expect("amount")],
- ledger.get_balance(&source).await.expect("balance")
- );
- assert!(withdrawal(
- &ledger,
- &source,
- Status::Settled,
- assets.amount_by_and_cents(2, -1000).expect("amount"),
- )
- .await
- .is_err());
- assert!(withdrawal(
- &ledger,
- &source,
- Status::Settled,
- assets.amount_by_and_cents(2, -1).expect("amount"),
- )
- .await
- .is_err());
- assert!(withdrawal(
- &ledger,
- &source,
- Status::Settled,
- assets.amount_by_and_cents(2, 0).expect("amount"),
- )
- .await
- .is_err());
- assert!(withdrawal(
- &ledger,
- &source,
- Status::Settled,
- assets.amount_by_and_cents(2, 10).expect("amount"),
- )
- .await
- .is_err());
- assert_eq!(
- vec![assets.amount_by_and_cents(2, -1000).expect("amount")],
- ledger.get_balance(&source).await.expect("balance")
- );
- }
|