cw_orch_clone_testing/
lib.rs

1//! Integration testing execution environment backed by a [cw-multi-test](cw_multi_test) App.
2//! It has an associated state that stores deployment information for easy retrieval and contract interactions.
3
4mod contract_instance;
5mod core;
6pub mod queriers;
7mod state;
8
9pub use self::core::CloneTesting;
10pub use clone_cw_multi_test as cw_multi_test;
11pub use contract_instance::WasmUpload;
12pub use state::MockState;
13
14// We define a new structure to reunite the ContractWrapper objects
15mod contract {
16    use clone_cw_multi_test::wasm_emulation::storage::storage_wrappers::{
17        ReadonlyStorageWrapper, StorageWrapper,
18    };
19    use clone_cw_multi_test::{
20        wasm_emulation::{
21            query::{mock_querier::ForkState, MockQuerier},
22            storage::dual_std_storage::DualStorage,
23        },
24        Contract,
25    };
26    use cosmwasm_std::{Checksum, Deps, DepsMut, Empty, QuerierWrapper};
27
28    pub struct CloneTestingContract(Box<dyn cw_orch_mock::cw_multi_test::Contract<Empty, Empty>>);
29
30    impl CloneTestingContract {
31        pub fn new(contract: Box<dyn cw_orch_mock::cw_multi_test::Contract<Empty, Empty>>) -> Self {
32            Self(contract)
33        }
34    }
35
36    impl Contract<Empty, Empty> for CloneTestingContract {
37        fn execute(
38            &self,
39            deps: cosmwasm_std::DepsMut<cosmwasm_std::Empty>,
40            env: cosmwasm_std::Env,
41            info: cosmwasm_std::MessageInfo,
42            msg: Vec<u8>,
43            fork_state: ForkState<Empty, Empty>,
44        ) -> anyhow::Result<cosmwasm_std::Response> {
45            let querier = MockQuerier::new(fork_state.clone());
46            let mut storage = DualStorage::new(
47                fork_state.remote,
48                env.contract.address.to_string(),
49                Box::new(StorageWrapper::new(deps.storage)),
50            )?;
51            let deps = DepsMut {
52                storage: &mut storage,
53                api: deps.api,
54                querier: QuerierWrapper::new(&querier),
55            };
56            self.0.execute(deps, env, info, msg)
57        }
58
59        fn instantiate(
60            &self,
61            deps: cosmwasm_std::DepsMut<cosmwasm_std::Empty>,
62            env: cosmwasm_std::Env,
63            info: cosmwasm_std::MessageInfo,
64            msg: Vec<u8>,
65            fork_state: ForkState<Empty, Empty>,
66        ) -> anyhow::Result<cosmwasm_std::Response> {
67            let querier = MockQuerier::new(fork_state.clone());
68            let mut storage = DualStorage::new(
69                fork_state.remote,
70                env.contract.address.to_string(),
71                Box::new(StorageWrapper::new(deps.storage)),
72            )?;
73            let deps = DepsMut {
74                storage: &mut storage,
75                api: deps.api,
76                querier: QuerierWrapper::new(&querier),
77            };
78            self.0.instantiate(deps, env, info, msg)
79        }
80
81        fn query(
82            &self,
83            deps: cosmwasm_std::Deps<cosmwasm_std::Empty>,
84            env: cosmwasm_std::Env,
85            msg: Vec<u8>,
86            fork_state: ForkState<Empty, Empty>,
87        ) -> anyhow::Result<cosmwasm_std::Binary> {
88            let querier = MockQuerier::new(fork_state.clone());
89            let storage = DualStorage::new(
90                fork_state.remote,
91                env.contract.address.to_string(),
92                Box::new(ReadonlyStorageWrapper::new(deps.storage)),
93            )?;
94            let deps = Deps {
95                storage: &storage,
96                api: deps.api,
97                querier: QuerierWrapper::new(&querier),
98            };
99            self.0.query(deps, env, msg)
100        }
101
102        fn sudo(
103            &self,
104            deps: cosmwasm_std::DepsMut<cosmwasm_std::Empty>,
105            env: cosmwasm_std::Env,
106            msg: Vec<u8>,
107            fork_state: ForkState<Empty, Empty>,
108        ) -> anyhow::Result<cosmwasm_std::Response> {
109            let querier = MockQuerier::new(fork_state.clone());
110            let mut storage = DualStorage::new(
111                fork_state.remote,
112                env.contract.address.to_string(),
113                Box::new(StorageWrapper::new(deps.storage)),
114            )?;
115            let deps = DepsMut {
116                storage: &mut storage,
117                api: deps.api,
118                querier: QuerierWrapper::new(&querier),
119            };
120            self.0.sudo(deps, env, msg)
121        }
122
123        fn reply(
124            &self,
125            deps: cosmwasm_std::DepsMut<cosmwasm_std::Empty>,
126            env: cosmwasm_std::Env,
127            msg: cosmwasm_std::Reply,
128            fork_state: ForkState<Empty, Empty>,
129        ) -> anyhow::Result<cosmwasm_std::Response> {
130            let querier = MockQuerier::new(fork_state.clone());
131            let mut storage = DualStorage::new(
132                fork_state.remote,
133                env.contract.address.to_string(),
134                Box::new(StorageWrapper::new(deps.storage)),
135            )?;
136            let deps = DepsMut {
137                storage: &mut storage,
138                api: deps.api,
139                querier: QuerierWrapper::new(&querier),
140            };
141            self.0.reply(deps, env, msg)
142        }
143
144        fn migrate(
145            &self,
146            deps: cosmwasm_std::DepsMut<cosmwasm_std::Empty>,
147            env: cosmwasm_std::Env,
148            msg: Vec<u8>,
149            fork_state: ForkState<Empty, Empty>,
150        ) -> anyhow::Result<cosmwasm_std::Response> {
151            let querier = MockQuerier::new(fork_state.clone());
152            let mut storage = DualStorage::new(
153                fork_state.remote,
154                env.contract.address.to_string(),
155                Box::new(StorageWrapper::new(deps.storage)),
156            )?;
157            let deps = DepsMut {
158                storage: &mut storage,
159                api: deps.api,
160                querier: QuerierWrapper::new(&querier),
161            };
162            self.0.migrate(deps, env, msg)
163        }
164
165        /// Returns the provided checksum of the contract's Wasm blob.
166        fn checksum(&self) -> Option<Checksum> {
167            self.0.checksum()
168        }
169    }
170}