Multitest
Sylvia exposes several types that build on top of the Multitest
. These
types are supposed to be used next to the types
generated
by contract
and interface
macros.
The types are hidden behind the mt
feature flag. We recommend enabling it in the
dev-dependencies.
Example usage of utilities described on this page as well as ones defined on the
generated types
page:
use sylvia::cw_multi_test::IntoAddr;
use sylvia::multitest::App;
use super::interface::sv::mt::InterfaceProxy;
use super::sv::mt::{CodeId, CounterContractProxy};
#[test]
fn example_test() {
// Define the [cosmwasm_std::Addr] of the message sender.
let owner = "owner".into_addr();
let dummy = "dummy".into_addr();
// Initialize the [sylvia::multitest::App].
let app = App::default();
// Initialize the generated [contract::sv::mt::CodeId] by storing the contract code on the App.
let code_id = CodeId::store_code(&app);
// Initialize the contract by calling the [contract::sv::mt::CodeId::instantiate] method.
let contract = code_id
.instantiate(true)
.with_label("MyContract")
.call(&owner)
.unwrap();
// Send messages through the [sylvia::multitest::Proxy] as you would call the methods on
// the contract type.
contract.some_exec(dummy.to_string()).call(&owner).unwrap();
contract.some_query(dummy.to_string()).unwrap();
// Send interface messages the same way.
contract
.interface_exec(dummy.to_string())
.call(&owner)
.unwrap();
contract.interface_query(dummy.to_string()).unwrap();
}
App
The App
is a wrapper around the
cw-multi-test::App
, stored
inside the RefCell
. It is done this way because the
App
has to be passed by
reference to multiple types, and we have to use the interior mutability to affect it’s state.
Proxy
The Proxy
represents a single,
initialized contract. It is generic over it, and the App
on which it’s installed. The Proxy
is
the structure through which you act on behalf of the contract, sending messages and querying the
state.
The Proxy
by itself doesn’t
have the methods defined in your contract. They are instead implemented via auto-generated traits by
contract
and interface
macros. Import the generated
proxy trait into your test scope to use these methods. If you want to learn more about the proxy
traits, you can go to this section
.
ExecProxy
The ExecProxy
is an
intermediate type, for setting additional data for the execute messages. It’s main functionality is
the call
method, requiring the user to specify the caller of the message.
The ExecProxy
should not
be constructed manually. Instead, it’s supposed to be returned by execute methods exposed in the
proxy traits
.
MigrateProxy
The MigrateProxy
is an
intermediate type for setting additional data for the migrate messages. It’s main functionality is
the call
method, requiring the user to specify the caller of the message.
The MigrateProxy
should not be constructed manually. Instead, it’s supposed to be returned by migrate methods
exposed in the proxy traits
.