terra_asset/testing/
custom_mock_querier.rs1use cosmwasm_std::testing::MockQuerier;
2use cosmwasm_std::{
3 from_binary, from_slice, Addr, Coin, Decimal, Querier, QuerierResult, QueryRequest, StdResult,
4 SystemError, WasmQuery,
5};
6use cw20::Cw20QueryMsg;
7use terra_cosmwasm::TerraQueryWrapper;
8
9use super::{cw20_querier::Cw20Querier, native_querier::NativeQuerier};
10
11pub struct CustomMockQuerier {
12 base: MockQuerier<TerraQueryWrapper>,
13 native_querier: NativeQuerier,
14 cw20_querier: Cw20Querier,
15}
16
17impl Default for CustomMockQuerier {
18 fn default() -> Self {
19 CustomMockQuerier {
20 base: MockQuerier::new(&[]),
21 native_querier: NativeQuerier::default(),
22 cw20_querier: Cw20Querier::default(),
23 }
24 }
25}
26
27impl Querier for CustomMockQuerier {
28 fn raw_query(&self, bin_request: &[u8]) -> QuerierResult {
29 let request: QueryRequest<TerraQueryWrapper> = match from_slice(bin_request) {
30 Ok(v) => v,
31 Err(e) => {
32 return Err(SystemError::InvalidRequest {
33 error: format!("[mock]: failed to parse query request {}", e),
34 request: bin_request.into(),
35 })
36 .into()
37 }
38 };
39 self.handle_query(&request)
40 }
41}
42
43impl CustomMockQuerier {
44 pub fn handle_query(&self, request: &QueryRequest<TerraQueryWrapper>) -> QuerierResult {
45 match request {
46 QueryRequest::Custom(TerraQueryWrapper {
47 route,
48 query_data,
49 }) => self.native_querier.handle_query(route, query_data),
50
51 QueryRequest::Wasm(WasmQuery::Smart {
52 contract_addr,
53 msg,
54 }) => {
55 let contract_addr = Addr::unchecked(contract_addr);
56
57 let parse_cw20_query: StdResult<Cw20QueryMsg> = from_binary(msg);
58 if let Ok(cw20_query) = parse_cw20_query {
59 return self.cw20_querier.handle_query(&contract_addr, cw20_query);
60 }
61
62 panic!("[mock]: unsupported wasm query {:?}", msg);
63 }
64
65 _ => self.base.handle_query(request),
66 }
67 }
68
69 pub fn set_base_balances(&mut self, address: &str, balances: &[Coin]) {
70 self.base.update_balance(address, balances.to_vec());
71 }
72
73 pub fn set_cw20_balance(&mut self, contract: &str, user: &str, balance: u128) {
74 self.cw20_querier.set_balance(contract, user, balance);
75 }
76
77 pub fn set_native_tax_rate(&mut self, tax_rate: Decimal) {
78 self.native_querier.set_tax_rate(tax_rate);
79 }
80
81 pub fn set_native_tax_cap(&mut self, denom: &str, tax_cap: u128) {
82 self.native_querier.set_tax_cap(denom, tax_cap);
83 }
84}