deposit.rs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. use super::{deposit, get_asset_manager_and_ledger};
  2. use crate::{AccountId, Asset};
  3. #[tokio::test]
  4. async fn pending_deposit_and_failure() {
  5. let source = "account1".parse::<AccountId>().expect("account");
  6. let ledger = get_asset_manager_and_ledger().await;
  7. let usd: Asset = "USD/2".parse().expect("asset");
  8. let rev_id = ledger
  9. .deposit(
  10. &source,
  11. usd.from_human("30").expect("amount"),
  12. "processing".into(),
  13. vec![],
  14. "Test".to_owned(),
  15. )
  16. .await
  17. .expect("valid tx")
  18. .revision_id
  19. .clone();
  20. assert!(ledger
  21. .get_balance(&source)
  22. .await
  23. .expect("balance")
  24. .is_empty());
  25. ledger
  26. .change_status(rev_id, "failed".into(), "failed due test".to_owned())
  27. .await
  28. .expect("valid tx");
  29. assert!(ledger
  30. .get_balance(&source)
  31. .await
  32. .expect("balance")
  33. .is_empty());
  34. }
  35. #[tokio::test]
  36. async fn deposit_and_transfer() {
  37. let source = "account1".parse::<AccountId>().expect("account");
  38. let dest = "account2".parse::<AccountId>().expect("account");
  39. let fee = "fee".parse::<AccountId>().expect("account");
  40. let ledger = get_asset_manager_and_ledger().await;
  41. let usd: Asset = "USD/2".parse().expect("asset");
  42. let btc: Asset = "BTC/8".parse().expect("asset");
  43. deposit(&ledger, &source, usd.from_human("10").expect("amount")).await;
  44. deposit(&ledger, &source, usd.from_human("20").expect("amount")).await;
  45. deposit(&ledger, &source, btc.from_human(".2").expect("amount")).await;
  46. let mut balances = ledger.get_balance(&source).await.expect("balance");
  47. balances.sort_by(|a, b| a.asset().name.cmp(&b.asset().name));
  48. assert_eq!(
  49. vec![
  50. btc.from_human("0.2").expect("amount"),
  51. usd.from_human("30").expect("amount")
  52. ],
  53. balances
  54. );
  55. ledger
  56. .new_transaction(
  57. "Exchange one".to_owned(),
  58. "settled".into(),
  59. vec![(source.clone(), usd.from_human("13").expect("amount"))],
  60. vec![
  61. (dest.clone(), usd.from_human("12.5").expect("amount")),
  62. (fee.clone(), usd.from_human("0.5").expect("amount")),
  63. ],
  64. )
  65. .await
  66. .expect("valid tx");
  67. let mut balances = ledger.get_balance(&source).await.expect("balance");
  68. balances.sort_by(|a, b| a.asset().name.cmp(&b.asset().name));
  69. assert_eq!(
  70. vec![
  71. btc.from_human("0.2").expect("amount"),
  72. usd.from_human("17").expect("amount")
  73. ],
  74. balances
  75. );
  76. assert_eq!(
  77. vec![usd.from_human("12.5").expect("amount"),],
  78. ledger.get_balance(&dest).await.expect("balance")
  79. );
  80. assert_eq!(
  81. vec![usd.from_human("0.5").expect("amount"),],
  82. ledger.get_balance(&fee).await.expect("balance")
  83. );
  84. }
  85. #[tokio::test]
  86. async fn balance_decreases_while_pending_spending_and_confirm() {
  87. let source = "account1".parse::<AccountId>().expect("account");
  88. let dest = "account2".parse::<AccountId>().expect("account");
  89. let fee = "fee".parse::<AccountId>().expect("account");
  90. let ledger = get_asset_manager_and_ledger().await;
  91. let usd: Asset = "USD/2".parse().expect("asset");
  92. deposit(&ledger, &source, usd.from_human("10").expect("amount")).await;
  93. deposit(&ledger, &source, usd.from_human("20").expect("amount")).await;
  94. assert_eq!(
  95. vec![usd.from_human("30").expect("amount"),],
  96. ledger.get_balance(&source).await.expect("balance")
  97. );
  98. let rev_id = ledger
  99. .new_transaction(
  100. "Exchange one".to_owned(),
  101. "pending".into(),
  102. vec![(source.clone(), usd.from_human("13").expect("amount"))],
  103. vec![
  104. (dest.clone(), usd.from_human("12.5").expect("amount")),
  105. (fee.clone(), usd.from_human("0.5").expect("amount")),
  106. ],
  107. )
  108. .await
  109. .expect("valid tx")
  110. .revision_id
  111. .clone();
  112. assert_eq!(
  113. vec![usd.from_human("17").expect("amount"),],
  114. ledger.get_balance(&source).await.expect("balance")
  115. );
  116. assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
  117. assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
  118. ledger
  119. .change_status(rev_id, "settled".into(), "ready".to_owned())
  120. .await
  121. .expect("valid tx");
  122. assert_eq!(
  123. vec![usd.from_human("17").expect("amount"),],
  124. ledger.get_balance(&source).await.expect("balance")
  125. );
  126. assert_eq!(
  127. vec![usd.from_human("12.5").expect("amount"),],
  128. ledger.get_balance(&dest).await.expect("balance")
  129. );
  130. assert_eq!(
  131. vec![usd.from_human("0.5").expect("amount"),],
  132. ledger.get_balance(&fee).await.expect("balance")
  133. );
  134. }
  135. #[tokio::test]
  136. async fn balance_decreases_while_pending_spending_and_cancel() {
  137. let source = "account1".parse::<AccountId>().expect("account");
  138. let dest = "account2".parse::<AccountId>().expect("account");
  139. let fee = "fee".parse::<AccountId>().expect("account");
  140. let ledger = get_asset_manager_and_ledger().await;
  141. let usd: Asset = "USD/2".parse().expect("asset");
  142. deposit(&ledger, &source, usd.from_human("10").expect("amount")).await;
  143. deposit(&ledger, &source, usd.from_human("20").expect("amount")).await;
  144. assert_eq!(
  145. vec![usd.from_human("30").expect("amount"),],
  146. ledger.get_balance(&source).await.expect("balance")
  147. );
  148. let rev_id = ledger
  149. .new_transaction(
  150. "Exchange one".to_owned(),
  151. "pending".into(),
  152. vec![(source.clone(), usd.from_human("13").expect("amount"))],
  153. vec![
  154. (dest.clone(), usd.from_human("12.5").expect("amount")),
  155. (fee.clone(), usd.from_human("0.5").expect("amount")),
  156. ],
  157. )
  158. .await
  159. .expect("valid tx")
  160. .revision_id
  161. .clone();
  162. assert_eq!(
  163. vec![usd.from_human("17").expect("amount"),],
  164. ledger.get_balance(&source).await.expect("balance")
  165. );
  166. assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
  167. assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
  168. ledger
  169. .change_status(rev_id, "cancelled".into(), "cancelled by test".to_owned())
  170. .await
  171. .expect("valid tx");
  172. assert_eq!(
  173. vec![usd.from_human("30").expect("amount"),],
  174. ledger.get_balance(&source).await.expect("balance")
  175. );
  176. assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
  177. assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
  178. }
  179. #[tokio::test]
  180. async fn balance_decreases_while_pending_spending_and_failed() {
  181. let source = "account1".parse::<AccountId>().expect("account");
  182. let dest = "account2".parse::<AccountId>().expect("account");
  183. let fee = "fee".parse::<AccountId>().expect("account");
  184. let ledger = get_asset_manager_and_ledger().await;
  185. let usd: Asset = "USD/2".parse().expect("asset");
  186. deposit(&ledger, &source, usd.from_human("10").expect("amount")).await;
  187. deposit(&ledger, &source, usd.from_human("20").expect("amount")).await;
  188. assert_eq!(
  189. vec![usd.from_human("30").expect("amount"),],
  190. ledger.get_balance(&source).await.expect("balance")
  191. );
  192. let rev_id = ledger
  193. .new_transaction(
  194. "Exchange one".to_owned(),
  195. "pending".into(),
  196. vec![(source.clone(), usd.from_human("13").expect("amount"))],
  197. vec![
  198. (dest.clone(), usd.from_human("12.5").expect("amount")),
  199. (fee.clone(), usd.from_human("0.5").expect("amount")),
  200. ],
  201. )
  202. .await
  203. .expect("valid tx")
  204. .revision_id
  205. .clone();
  206. assert_eq!(
  207. vec![usd.from_human("17").expect("amount"),],
  208. ledger.get_balance(&source).await.expect("balance")
  209. );
  210. assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
  211. assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
  212. let new_rev_id = ledger
  213. .change_status(rev_id, "processing".into(), "processing now".to_owned())
  214. .await
  215. .expect("valid tx")
  216. .revision_id;
  217. assert_eq!(
  218. vec![usd.from_human("17").expect("amount"),],
  219. ledger.get_balance(&source).await.expect("balance")
  220. );
  221. assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
  222. assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
  223. assert_eq!(
  224. "Transaction: Error in status: Invalid transition from processing to cancelled".to_owned(),
  225. ledger
  226. .change_status(
  227. new_rev_id.clone(),
  228. "cancelled".into(),
  229. "cancelled by user".to_owned()
  230. )
  231. .await
  232. .unwrap_err()
  233. .to_string()
  234. );
  235. assert_eq!(
  236. vec![usd.from_human("17").expect("amount"),],
  237. ledger.get_balance(&source).await.expect("balance")
  238. );
  239. assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
  240. assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
  241. ledger
  242. .change_status(new_rev_id, "failed".into(), "it has failed".to_owned())
  243. .await
  244. .expect("valid");
  245. assert_eq!(
  246. vec![usd.from_human("30").expect("amount"),],
  247. ledger.get_balance(&source).await.expect("balance")
  248. );
  249. assert!(ledger.get_balance(&dest).await.expect("balance").is_empty());
  250. assert!(ledger.get_balance(&fee).await.expect("balance").is_empty());
  251. }