mock-cosmwasm-contract 0.1.2

Mock CosmWasm contract that can set predetermined responses to queries and keep track of execution for testing purposes.
#[cfg(not(feature = "library"))]
use cosmwasm_std::entry_point;
use cosmwasm_std::{to_json_binary, Binary, Deps, DepsMut, Env, MessageInfo, Response};

use crate::error::ContractError;
use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg};
use crate::state::STUBS;

#[cfg_attr(not(feature = "library"), entry_point)]
pub fn instantiate(
    _deps: DepsMut,
    _env: Env,
    _info: MessageInfo,
    _msg: InstantiateMsg,
) -> Result<Response, ContractError> {
    Ok(Response::default())
}

#[cfg_attr(not(feature = "library"), entry_point)]
pub fn execute(
    deps: DepsMut,
    _env: Env,
    _info: MessageInfo,
    msg: ExecuteMsg,
) -> Result<Response, ContractError> {
    match msg {
        ExecuteMsg::SetStubQuery { query, response } => {
            STUBS.save(deps.storage, query.0, &to_json_binary(&response)?)?;
        }
        ExecuteMsg::RemoveStubQuery { query } => {
            STUBS.remove(deps.storage, query.0);
        }
    }

    Ok(Response::default())
}

#[cfg_attr(not(feature = "library"), entry_point)]
pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result<Binary, ContractError> {
    let response = STUBS.may_load(deps.storage, msg.0.clone())?;
    response.ok_or_else(|| ContractError::NoStubQuery { query: msg.0 })
}

#[cfg(test)]
mod tests {
    use cosmwasm_schema::cw_serde;
    use cosmwasm_std::{
        from_json,
        testing::{mock_dependencies, mock_env, mock_info},
        to_json_string,
    };

    use crate::msg::{query_msg, set_stub_query_msg};

    use super::*;

    #[cw_serde]
    enum TestQueryMsg {
        QueryVariant { arg: String },
    }

    #[cw_serde]
    struct QueryResponse {
        value: String,
    }

    #[test]
    fn test_stub_query() {
        let mut deps = mock_dependencies();

        let q = TestQueryMsg::QueryVariant {
            arg: "first".to_string(),
        };

        let query_response = QueryResponse {
            value: "first".to_string(),
        };

        execute(
            deps.as_mut(),
            mock_env(),
            mock_info("sender", &[]),
            set_stub_query_msg(&q, &query_response).unwrap(),
        )
        .unwrap();

        let actual_query_response =
            query(deps.as_ref(), mock_env(), query_msg(&q).unwrap()).unwrap();

        assert_eq!(
            to_json_string(&query_response).unwrap(),
            from_json::<String>(&actual_query_response.as_slice()).unwrap()
        );

        let q = query_msg(&TestQueryMsg::QueryVariant {
            arg: "first_no_stub".to_string(),
        })
        .unwrap();

        let err = query(deps.as_ref(), mock_env(), q).unwrap_err();

        assert_eq!(
            err,
            ContractError::NoStubQuery {
                query: to_json_string(&TestQueryMsg::QueryVariant {
                    arg: "first_no_stub".to_string()
                })
                .unwrap()
            }
        );
    }
}