withdrawal.rs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. use super::{deposit, get_asset_manager_and_ledger, withdrawal};
  2. use crate::{AccountId, Status};
  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 (assets, ledger) = get_asset_manager_and_ledger().await;
  9. deposit(
  10. &ledger,
  11. &source,
  12. assets.amount_by_and_cents(2, 1000).expect("amount"),
  13. )
  14. .await;
  15. deposit(
  16. &ledger,
  17. &source,
  18. assets.amount_by_and_cents(2, 2000).expect("amount"),
  19. )
  20. .await;
  21. assert_eq!(
  22. vec![assets.amount_by_and_cents(2, 3000).expect("amount")],
  23. ledger.get_balance(&source).await.expect("balance")
  24. );
  25. ledger
  26. .new_transaction(
  27. "Exchange one".to_owned(),
  28. Status::Settled,
  29. vec![(
  30. source.clone(),
  31. assets.amount_by_and_cents(2, 1300).expect("amount"),
  32. )],
  33. vec![
  34. (
  35. dest.clone(),
  36. assets.amount_by_and_cents(2, 1250).expect("amount"),
  37. ),
  38. (
  39. fee.clone(),
  40. assets.amount_by_and_cents(2, 50).expect("amount"),
  41. ),
  42. ],
  43. )
  44. .await
  45. .expect("valid tx");
  46. assert_eq!(
  47. vec![assets.amount_by_and_cents(2, 1700).expect("amount")],
  48. ledger.get_balance(&source).await.expect("balance")
  49. );
  50. assert_eq!(
  51. vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
  52. ledger.get_balance(&dest).await.expect("balance")
  53. );
  54. assert_eq!(
  55. vec![assets.amount_by_and_cents(2, 50).expect("amount")],
  56. ledger.get_balance(&fee).await.expect("balance")
  57. );
  58. assert!(withdrawal(
  59. &ledger,
  60. &source,
  61. Status::Settled,
  62. assets.amount_by_and_cents(2, 1700).expect("amount")
  63. )
  64. .await
  65. .is_ok());
  66. assert!(ledger
  67. .get_balance(&source)
  68. .await
  69. .expect("balance")
  70. .is_empty());
  71. assert_eq!(
  72. vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
  73. ledger.get_balance(&dest).await.expect("balance")
  74. );
  75. assert_eq!(
  76. vec![assets.amount_by_and_cents(2, 50).expect("amount")],
  77. ledger.get_balance(&fee).await.expect("balance")
  78. );
  79. }
  80. #[tokio::test]
  81. async fn fail_to_overwithdrawal() {
  82. let source = "account1".parse::<AccountId>().expect("account");
  83. let dest = "account2".parse::<AccountId>().expect("account");
  84. let fee = "fee".parse::<AccountId>().expect("account");
  85. let (assets, ledger) = get_asset_manager_and_ledger().await;
  86. deposit(
  87. &ledger,
  88. &source,
  89. assets.amount_by_and_cents(2, 1000).expect("amount"),
  90. )
  91. .await;
  92. deposit(
  93. &ledger,
  94. &source,
  95. assets.amount_by_and_cents(2, 2000).expect("amount"),
  96. )
  97. .await;
  98. assert_eq!(
  99. vec![assets.amount_by_and_cents(2, 3000).expect("amount")],
  100. ledger.get_balance(&source).await.expect("balance")
  101. );
  102. ledger
  103. .new_transaction(
  104. "Exchange one".to_owned(),
  105. Status::Settled,
  106. vec![(
  107. source.clone(),
  108. assets.amount_by_and_cents(2, 1300).expect("amount"),
  109. )],
  110. vec![
  111. (
  112. dest.clone(),
  113. assets.amount_by_and_cents(2, 1250).expect("amount"),
  114. ),
  115. (
  116. fee.clone(),
  117. assets.amount_by_and_cents(2, 50).expect("amount"),
  118. ),
  119. ],
  120. )
  121. .await
  122. .expect("valid tx");
  123. assert_eq!(
  124. vec![assets.amount_by_and_cents(2, 1700).expect("amount")],
  125. ledger.get_balance(&source).await.expect("balance")
  126. );
  127. assert_eq!(
  128. vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
  129. ledger.get_balance(&dest).await.expect("balance")
  130. );
  131. assert_eq!(
  132. vec![assets.amount_by_and_cents(2, 50).expect("amount")],
  133. ledger.get_balance(&fee).await.expect("balance")
  134. );
  135. assert!(withdrawal(
  136. &ledger,
  137. &source,
  138. Status::Settled,
  139. assets.amount_by_and_cents(2, 170000).expect("amount")
  140. )
  141. .await
  142. .is_err());
  143. assert_eq!(
  144. vec![assets.amount_by_and_cents(2, 1700).expect("amount")],
  145. ledger.get_balance(&source).await.expect("balance")
  146. );
  147. assert_eq!(
  148. vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
  149. ledger.get_balance(&dest).await.expect("balance")
  150. );
  151. assert_eq!(
  152. vec![assets.amount_by_and_cents(2, 50).expect("amount")],
  153. ledger.get_balance(&fee).await.expect("balance")
  154. );
  155. }
  156. #[tokio::test]
  157. async fn cancelled_withdrawal() {
  158. let source = "account1".parse::<AccountId>().expect("account");
  159. let dest = "account2".parse::<AccountId>().expect("account");
  160. let fee = "fee".parse::<AccountId>().expect("account");
  161. let (assets, ledger) = get_asset_manager_and_ledger().await;
  162. deposit(
  163. &ledger,
  164. &source,
  165. assets.amount_by_and_cents(2, 1000).expect("amount"),
  166. )
  167. .await;
  168. deposit(
  169. &ledger,
  170. &source,
  171. assets.amount_by_and_cents(2, 2000).expect("amount"),
  172. )
  173. .await;
  174. assert_eq!(
  175. vec![assets.amount_by_and_cents(2, 3000).expect("amount")],
  176. ledger.get_balance(&source).await.expect("balance")
  177. );
  178. ledger
  179. .new_transaction(
  180. "Exchange one".to_owned(),
  181. Status::Settled,
  182. vec![(
  183. source.clone(),
  184. assets.amount_by_and_cents(2, 1300).expect("amount"),
  185. )],
  186. vec![
  187. (
  188. dest.clone(),
  189. assets.amount_by_and_cents(2, 1250).expect("amount"),
  190. ),
  191. (
  192. fee.clone(),
  193. assets.amount_by_and_cents(2, 50).expect("amount"),
  194. ),
  195. ],
  196. )
  197. .await
  198. .expect("valid tx");
  199. assert_eq!(
  200. vec![assets.amount_by_and_cents(2, 1700).expect("amount")],
  201. ledger.get_balance(&source).await.expect("balance")
  202. );
  203. assert_eq!(
  204. vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
  205. ledger.get_balance(&dest).await.expect("balance")
  206. );
  207. assert_eq!(
  208. vec![assets.amount_by_and_cents(2, 50).expect("amount")],
  209. ledger.get_balance(&fee).await.expect("balance")
  210. );
  211. let tx_id = withdrawal(
  212. &ledger,
  213. &source,
  214. Status::Pending,
  215. assets.amount_by_and_cents(2, 1700).expect("amount"),
  216. )
  217. .await
  218. .expect("valid tx");
  219. assert!(ledger
  220. .get_balance(&source)
  221. .await
  222. .expect("balance")
  223. .is_empty());
  224. assert_eq!(
  225. vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
  226. ledger.get_balance(&dest).await.expect("balance")
  227. );
  228. assert_eq!(
  229. vec![assets.amount_by_and_cents(2, 50).expect("amount")],
  230. ledger.get_balance(&fee).await.expect("balance")
  231. );
  232. ledger
  233. .change_status(&tx_id, Status::Cancelled, "cancelled by test".to_owned())
  234. .await
  235. .expect("valid tx");
  236. assert_eq!(
  237. vec![assets.amount_by_and_cents(2, 1700).expect("amount")],
  238. ledger.get_balance(&source).await.expect("balance")
  239. );
  240. assert_eq!(
  241. vec![assets.amount_by_and_cents(2, 1250).expect("amount")],
  242. ledger.get_balance(&dest).await.expect("balance")
  243. );
  244. assert_eq!(
  245. vec![assets.amount_by_and_cents(2, 50).expect("amount")],
  246. ledger.get_balance(&fee).await.expect("balance")
  247. );
  248. }
  249. #[tokio::test]
  250. async fn negative_withdrawal() {
  251. let source = "account1".parse::<AccountId>().expect("account");
  252. let (assets, ledger) = get_asset_manager_and_ledger().await;
  253. deposit(
  254. &ledger,
  255. &source,
  256. assets.amount_by_and_cents(2, -1000).expect("amount"),
  257. )
  258. .await;
  259. assert_eq!(
  260. vec![assets.amount_by_and_cents(2, -1000).expect("amount")],
  261. ledger.get_balance(&source).await.expect("balance")
  262. );
  263. assert_eq!(
  264. vec![assets.amount_by_and_cents(2, -1000).expect("amount")],
  265. ledger.get_balance(&source).await.expect("balance")
  266. );
  267. assert!(withdrawal(
  268. &ledger,
  269. &source,
  270. Status::Settled,
  271. assets.amount_by_and_cents(2, -1000).expect("amount"),
  272. )
  273. .await
  274. .is_err());
  275. assert!(withdrawal(
  276. &ledger,
  277. &source,
  278. Status::Settled,
  279. assets.amount_by_and_cents(2, -1).expect("amount"),
  280. )
  281. .await
  282. .is_err());
  283. assert!(withdrawal(
  284. &ledger,
  285. &source,
  286. Status::Settled,
  287. assets.amount_by_and_cents(2, 0).expect("amount"),
  288. )
  289. .await
  290. .is_err());
  291. assert!(withdrawal(
  292. &ledger,
  293. &source,
  294. Status::Settled,
  295. assets.amount_by_and_cents(2, 10).expect("amount"),
  296. )
  297. .await
  298. .is_err());
  299. assert_eq!(
  300. vec![assets.amount_by_and_cents(2, -1000).expect("amount")],
  301. ledger.get_balance(&source).await.expect("balance")
  302. );
  303. }