integration.rs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. use cosmwasm_std::{
  2. from_slice,
  3. testing::{
  4. mock_dependencies,
  5. mock_env,
  6. mock_info,
  7. MockApi,
  8. MockQuerier,
  9. MockStorage,
  10. },
  11. Addr,
  12. Api,
  13. OwnedDeps,
  14. Response,
  15. Storage,
  16. Uint128,
  17. };
  18. use cosmwasm_storage::to_length_prefixed;
  19. use cw20::TokenInfoResponse;
  20. use cw20_wrapped::{
  21. contract::{
  22. execute,
  23. instantiate,
  24. query,
  25. },
  26. msg::{
  27. ExecuteMsg,
  28. InstantiateMsg,
  29. QueryMsg,
  30. WrappedAssetInfoResponse,
  31. },
  32. state::{
  33. WrappedAssetInfo,
  34. KEY_WRAPPED_ASSET,
  35. },
  36. ContractError,
  37. };
  38. static INITIALIZER: &str = "addr0000";
  39. static RECIPIENT: &str = "addr2222";
  40. static SENDER: &str = "addr3333";
  41. fn get_wrapped_asset_info<S: Storage>(storage: &S) -> WrappedAssetInfo {
  42. let key = to_length_prefixed(KEY_WRAPPED_ASSET);
  43. let data = storage
  44. .get(&key)
  45. .expect("data should exist");
  46. from_slice(&data).expect("invalid data")
  47. }
  48. fn do_init() -> OwnedDeps<MockStorage, MockApi, MockQuerier> {
  49. let mut deps = mock_dependencies(&[]);
  50. let init_msg = InstantiateMsg {
  51. name: "Integers".into(),
  52. symbol: "INT".into(),
  53. asset_chain: 1,
  54. asset_address: vec![1; 32].into(),
  55. decimals: 10,
  56. mint: None,
  57. init_hook: None,
  58. };
  59. let env = mock_env();
  60. let info = mock_info(INITIALIZER, &[]);
  61. let res: Response = instantiate(deps.as_mut(), env, info, init_msg).unwrap();
  62. assert_eq!(0, res.messages.len());
  63. // query the store directly
  64. let bridge = deps.api.addr_canonicalize(INITIALIZER).unwrap();
  65. assert_eq!(
  66. get_wrapped_asset_info(&deps.storage),
  67. WrappedAssetInfo {
  68. asset_chain: 1,
  69. asset_address: vec![1; 32].into(),
  70. bridge,
  71. }
  72. );
  73. deps
  74. }
  75. fn do_mint(
  76. deps: &mut OwnedDeps<MockStorage, MockApi, MockQuerier>,
  77. recipient: &Addr,
  78. amount: &Uint128,
  79. ) {
  80. let mint_msg = ExecuteMsg::Mint {
  81. recipient: recipient.to_string(),
  82. amount: amount.clone(),
  83. };
  84. let info = mock_info(INITIALIZER, &[]);
  85. let handle_response: Response = execute(deps.as_mut(), mock_env(), info, mint_msg).unwrap();
  86. assert_eq!(0, handle_response.messages.len());
  87. }
  88. fn do_transfer(
  89. deps: &mut OwnedDeps<MockStorage, MockApi, MockQuerier>,
  90. sender: &Addr,
  91. recipient: &Addr,
  92. amount: &Uint128,
  93. ) {
  94. let transfer_msg = ExecuteMsg::Transfer {
  95. recipient: recipient.to_string(),
  96. amount: amount.clone(),
  97. };
  98. let env = mock_env();
  99. let info = mock_info(sender.as_str(), &[]);
  100. let handle_response: Response = execute(deps.as_mut(), env, info, transfer_msg).unwrap();
  101. assert_eq!(0, handle_response.messages.len());
  102. }
  103. fn check_balance(
  104. deps: &OwnedDeps<MockStorage, MockApi, MockQuerier>,
  105. address: &Addr,
  106. amount: &Uint128,
  107. ) {
  108. let query_response = query(
  109. deps.as_ref(),
  110. mock_env(),
  111. QueryMsg::Balance {
  112. address: address.to_string(),
  113. },
  114. )
  115. .unwrap();
  116. assert_eq!(
  117. query_response.as_slice(),
  118. format!("{{\"balance\":\"{}\"}}", amount.u128()).as_bytes()
  119. );
  120. }
  121. fn check_token_details(deps: &OwnedDeps<MockStorage, MockApi, MockQuerier>, supply: Uint128) {
  122. let query_response = query(deps.as_ref(), mock_env(), QueryMsg::TokenInfo {}).unwrap();
  123. assert_eq!(
  124. from_slice::<TokenInfoResponse>(query_response.as_slice()).unwrap(),
  125. TokenInfoResponse {
  126. name: "Integers (Wormhole)".into(),
  127. symbol: "INT".into(),
  128. decimals: 10,
  129. total_supply: supply,
  130. }
  131. );
  132. }
  133. #[test]
  134. fn init_works() {
  135. let mut deps = do_init();
  136. check_token_details(&mut deps, Uint128::new(0));
  137. }
  138. #[test]
  139. fn query_works() {
  140. let deps = do_init();
  141. let query_response = query(deps.as_ref(), mock_env(), QueryMsg::WrappedAssetInfo {}).unwrap();
  142. assert_eq!(
  143. from_slice::<WrappedAssetInfoResponse>(&query_response.as_slice()).unwrap(),
  144. WrappedAssetInfoResponse {
  145. asset_chain: 1,
  146. asset_address: vec![1; 32].into(),
  147. bridge: Addr::unchecked(INITIALIZER),
  148. }
  149. );
  150. }
  151. #[test]
  152. fn mint_works() {
  153. let mut deps = do_init();
  154. let recipient = Addr::unchecked(RECIPIENT);
  155. do_mint(&mut deps, &recipient, &Uint128::new(123_123_123));
  156. check_balance(&deps, &recipient, &Uint128::new(123_123_123));
  157. check_token_details(&deps, Uint128::new(123_123_123));
  158. }
  159. #[test]
  160. fn others_cannot_mint() {
  161. let mut deps = do_init();
  162. let mint_msg = ExecuteMsg::Mint {
  163. recipient: RECIPIENT.into(),
  164. amount: Uint128::new(123_123_123),
  165. };
  166. let env = mock_env();
  167. let info = mock_info(RECIPIENT, &[]);
  168. let handle_result = execute(deps.as_mut(), env, info, mint_msg);
  169. assert_eq!(
  170. format!("{}", handle_result.unwrap_err()),
  171. format!("{}", ContractError::Unauthorized {})
  172. );
  173. }
  174. #[test]
  175. fn transfer_works() {
  176. let mut deps = do_init();
  177. let sender = Addr::unchecked(SENDER);
  178. let recipient = Addr::unchecked(RECIPIENT);
  179. do_mint(&mut deps, &sender, &Uint128::new(123_123_123));
  180. do_transfer(&mut deps, &sender, &recipient, &Uint128::new(123_123_000));
  181. check_balance(&mut deps, &sender, &Uint128::new(123));
  182. check_balance(&mut deps, &recipient, &Uint128::new(123_123_000));
  183. }