withdrawal.rs 8.0 KB

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