pub fn parse_storage(storage: &[(Vec<u8>, Vec<u8>)]) -> Vec<(String, String)> {
storage
.iter()
.map(|(key, value)| {
(
String::from_utf8_lossy(key).to_string(),
String::from_utf8_lossy(value).to_string(),
)
})
.collect::<Vec<_>>()
}
#[macro_export]
macro_rules! take_storage_snapshot {
($chain: ident, $name: literal) => {
use ::cw_orch::environment::{ChainState as _, StateInterface as _};
let all_contracts = $chain.state().get_all_addresses()?;
let all_storage: ::std::collections::BTreeMap<_, _> = all_contracts
.iter()
.map(|(id, contract_addr)| {
(
id,
::cw_orch::snapshots::parse_storage(
&$chain.app.borrow().dump_wasm_raw(&contract_addr),
),
)
})
.collect();
::cw_orch::insta::assert_yaml_snapshot!(
::cw_orch::sanitize_filename::sanitize(format!("{}", $name)),
all_storage
)
};
}
#[cfg(test)]
pub mod tests {
use crate::mock::cw_multi_test::ContractWrapper;
use cosmwasm_std::Empty;
use cw_orch::prelude::{CwOrchInstantiate, CwOrchUpload, Mock};
use cw_orch_core::{
contract::{interface_traits::Uploadable, WasmPath},
environment::CwEnv,
};
#[test]
fn contract_snapshots() -> anyhow::Result<()> {
use counter_contract::CounterExecuteMsgFns;
let chain = Mock::new("sender");
let contract = counter_contract::CounterContract::new(chain.clone());
contract.upload()?;
contract.instantiate(
&counter_contract::msg::InstantiateMsg { count: 0 },
None,
None,
)?;
contract.increment()?;
take_storage_snapshot!(chain, "snapshot_test");
Ok(())
}
#[cw_orch::interface(
counter_contract::msg::InstantiateMsg,
counter_contract::msg::ExecuteMsg,
counter_contract::msg::QueryMsg,
counter_contract::msg::MigrateMsg
)]
pub struct CounterContractWithId;
impl<Chain: CwEnv> Uploadable for CounterContractWithId<Chain> {
fn wasm(&self) -> WasmPath {
unimplemented!()
}
fn wrapper(&self) -> Box<dyn cw_orch::prelude::MockContract<Empty>> {
Box::new(
ContractWrapper::new_with_empty(
counter_contract::contract::execute,
counter_contract::contract::instantiate,
counter_contract::contract::query,
)
.with_migrate(counter_contract::contract::migrate),
)
}
}
#[test]
fn multiple_contract_snapshot() -> anyhow::Result<()> {
use counter_contract::CounterExecuteMsgFns;
let chain = Mock::new("sender");
let contract = counter_contract::CounterContract::new(chain.clone());
contract.upload()?;
contract.instantiate(
&counter_contract::msg::InstantiateMsg { count: 0 },
None,
None,
)?;
contract.increment()?;
let contract = CounterContractWithId::new("second-counter-contract", chain.clone());
contract.upload()?;
contract.instantiate(
&counter_contract::msg::InstantiateMsg { count: 0 },
None,
None,
)?;
contract.increment()?;
contract.increment()?;
contract.increment()?;
contract.increment()?;
let contract = CounterContractWithId::new("third-counter-contract", chain.clone());
contract.upload()?;
contract.instantiate(
&counter_contract::msg::InstantiateMsg { count: 0 },
None,
None,
)?;
contract.increment()?;
contract.increment()?;
contract.increment()?;
take_storage_snapshot!(chain, "multiple_contracts_snapshot_test");
Ok(())
}
}