withdrawal.rs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  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(
  180. rev_id,
  181. "cancelled".into(),
  182. "cancelled by test".to_owned(),
  183. None,
  184. )
  185. .await
  186. .expect("valid tx");
  187. assert_eq!(
  188. vec![usd.from_human("17").expect("amount"),],
  189. ledger.get_balance(&source).await.expect("balance")
  190. );
  191. assert_eq!(
  192. vec![usd.from_human("12.5").expect("amount"),],
  193. ledger.get_balance(&dest).await.expect("balance")
  194. );
  195. assert_eq!(
  196. vec![usd.from_human("0.5").expect("amount"),],
  197. ledger.get_balance(&fee).await.expect("balance")
  198. );
  199. }
  200. #[tokio::test]
  201. async fn negative_withdrawal() {
  202. let source = "account1".parse::<AccountId>().expect("account");
  203. let ledger = get_asset_manager_and_ledger().await;
  204. let usd: Asset = "USD/2".parse().expect("asset");
  205. deposit(
  206. &ledger,
  207. &source,
  208. usd.from_human("-1000").expect("valid amount"),
  209. )
  210. .await;
  211. assert_eq!(
  212. vec![usd.from_human("-1000").expect("valid amount"),],
  213. ledger.get_balance(&source).await.expect("balance")
  214. );
  215. assert_eq!(
  216. vec![usd.from_human("-1000").expect("valid amount"),],
  217. ledger.get_balance(&source).await.expect("balance")
  218. );
  219. assert!(withdrawal(
  220. &ledger,
  221. &source,
  222. "settled".into(),
  223. usd.from_human("-1000").expect("valid amount"),
  224. )
  225. .await
  226. .is_err());
  227. assert!(withdrawal(
  228. &ledger,
  229. &source,
  230. "settled".into(),
  231. usd.from_human("-1").expect("valid amount"),
  232. )
  233. .await
  234. .is_err());
  235. assert!(withdrawal(
  236. &ledger,
  237. &source,
  238. "settled".into(),
  239. usd.from_human("0").expect("valid amount"),
  240. )
  241. .await
  242. .is_err());
  243. assert!(withdrawal(
  244. &ledger,
  245. &source,
  246. "settled".into(),
  247. usd.from_human("10").expect("valid amount"),
  248. )
  249. .await
  250. .is_err());
  251. assert_eq!(
  252. vec![usd.from_human("-1000").expect("valid amount"),],
  253. ledger.get_balance(&source).await.expect("balance")
  254. );
  255. }