tx-test-tube 6.0.0

CosmWasm integration testing for TX
use crate::{fn_execute, fn_query};
use tx_wasm_sdk::types::cosmos::bank::v1beta1::{
    MsgSend, MsgSendResponse, QueryAllBalancesRequest, QueryAllBalancesResponse,
    QueryBalanceRequest, QueryBalanceResponse, QueryTotalSupplyRequest, QueryTotalSupplyResponse,
};

use test_tube_tx::module::Module;
use test_tube_tx::runner::Runner;

pub struct Bank<'a, R: Runner<'a>> {
    runner: &'a R,
}

impl<'a, R: Runner<'a>> Module<'a, R> for Bank<'a, R> {
    fn new(runner: &'a R) -> Self {
        Self { runner }
    }
}

impl<'a, R> Bank<'a, R>
where
    R: Runner<'a>,
{
    fn_execute! {
        pub send: MsgSend["/cosmos.bank.v1beta1.MsgSend"] => MsgSendResponse
    }

    fn_query! {
        pub query_balance ["/cosmos.bank.v1beta1.Query/Balance"]: QueryBalanceRequest => QueryBalanceResponse
    }

    fn_query! {
        pub query_all_balances ["/cosmos.bank.v1beta1.Query/AllBalances"]: QueryAllBalancesRequest => QueryAllBalancesResponse
    }

    fn_query! {
        pub query_total_supply ["/cosmos.bank.v1beta1.Query/TotalSupply"]: QueryTotalSupplyRequest => QueryTotalSupplyResponse
    }
}

#[cfg(test)]
mod tests {
    use cosmwasm_std::Coin;
    use tx_wasm_sdk::types::cosmos::bank::v1beta1::{MsgSend, QueryBalanceRequest};
    use tx_wasm_sdk::types::cosmos::base::v1beta1::Coin as BaseCoin;

    use crate::runner::app::FEE_DENOM;
    use crate::{Account, Bank, Module, TXTestApp};

    #[test]
    fn bank_integration() {
        let app = TXTestApp::new();
        let signer = app
            .init_account(&[Coin::new(100_000_000_000_000_000_000u128, FEE_DENOM)])
            .unwrap();
        let receiver = app.init_account(&[Coin::new(1u128, FEE_DENOM)]).unwrap();
        let bank = Bank::new(&app);

        let response = bank
            .query_balance(&QueryBalanceRequest {
                address: receiver.address(),
                denom: FEE_DENOM.to_string(),
            })
            .unwrap();
        assert_eq!(
            response.balance.unwrap(),
            BaseCoin {
                amount: 1u128.to_string(),
                denom: FEE_DENOM.to_string(),
            }
        );

        bank.send(
            MsgSend {
                from_address: signer.address(),
                to_address: receiver.address(),
                amount: vec![BaseCoin {
                    amount: 9u128.to_string(),
                    denom: FEE_DENOM.to_string(),
                }],
            },
            &signer,
        )
        .unwrap();

        let response = bank
            .query_balance(&QueryBalanceRequest {
                address: receiver.address(),
                denom: FEE_DENOM.to_string(),
            })
            .unwrap();

        assert_eq!(
            response.balance.unwrap(),
            BaseCoin {
                amount: 10u128.to_string(),
                denom: FEE_DENOM.to_string(),
            }
        );
    }
}