1#![cfg(not(target_arch = "wasm32"))]
2use bvs_guardrail::testing::GuardrailContract;
5pub use bvs_library::testing::{Cw20TokenContract, TestingContract};
6pub use bvs_pauser::testing::PauserContract;
7pub use bvs_registry::testing::RegistryContract;
8pub use bvs_vault_bank::testing::VaultBankContract;
9pub use bvs_vault_cw20::testing::VaultCw20Contract;
10pub use bvs_vault_router::testing::VaultRouterContract;
11use cosmwasm_std::{Addr, Env};
12use cw20::MinterResponse;
13use cw_multi_test::App;
14
15pub struct BvsMultiTest {
16 pub pauser: PauserContract,
17 pub registry: RegistryContract,
18 pub guardrail: GuardrailContract,
19 pub vault_router: VaultRouterContract,
20}
21
22impl BvsMultiTest {
25 pub fn new(app: &mut App, env: &Env) -> Self {
28 let pauser = PauserContract::new(app, env, None);
29 let registry = RegistryContract::new(app, env, None);
30 let guardrail = GuardrailContract::new(app, env, None);
31 let vault_router = VaultRouterContract::new(app, env, None);
32
33 Self {
34 pauser,
35 registry,
36 guardrail,
37 vault_router,
38 }
39 }
40
41 pub fn deploy_bank_vault(
43 &self,
44 app: &mut App,
45 env: &Env,
46 operator: impl Into<String>,
47 denom: impl Into<String>,
48 ) -> VaultBankContract {
49 let init_msg = bvs_vault_bank::msg::InstantiateMsg {
50 pauser: self.pauser.addr.to_string(),
51 router: self.vault_router.addr.to_string(),
52 operator: operator.into(),
53 denom: denom.into(),
54 };
55
56 let bank_contract = VaultBankContract::new(app, env, Some(init_msg));
57 let set_vault = &bvs_vault_router::msg::ExecuteMsg::SetVault {
58 vault: bank_contract.addr.to_string(),
59 whitelisted: true,
60 };
61 let owner = app.api().addr_make("owner");
62 self.vault_router.execute(app, &owner, set_vault).unwrap();
63 bank_contract
64 }
65
66 pub fn deploy_cw20_vault(
68 &self,
69 app: &mut App,
70 env: &Env,
71 operator: impl Into<String>,
72 cw20_contract: Addr,
73 ) -> VaultCw20Contract {
74 let init_msg = bvs_vault_cw20::msg::InstantiateMsg {
75 pauser: self.pauser.addr.to_string(),
76 router: self.vault_router.addr.to_string(),
77 operator: operator.into(),
78 cw20_contract: cw20_contract.to_string(),
79 };
80
81 let bank_contract = VaultCw20Contract::new(app, env, Some(init_msg));
82 let set_vault = &bvs_vault_router::msg::ExecuteMsg::SetVault {
83 vault: bank_contract.addr.to_string(),
84 whitelisted: true,
85 };
86 let owner = app.api().addr_make("owner");
87 self.vault_router.execute(app, &owner, set_vault).unwrap();
88 bank_contract
89 }
90
91 pub fn deploy_cw20_token(
93 &self,
94 app: &mut App,
95 env: &Env,
96 symbol: impl Into<String>,
97 minter: impl Into<String>,
98 ) -> Cw20TokenContract {
99 let symbol = symbol.into();
100 let init_msg = cw20_base::msg::InstantiateMsg {
101 symbol: symbol.clone(),
102 name: format!("Token {symbol}"),
103 decimals: 18,
104 initial_balances: vec![],
105 mint: Some(MinterResponse {
106 minter: minter.into(),
107 cap: None,
108 }),
109 marketing: None,
110 };
111
112 Cw20TokenContract::new(app, env, Some(init_msg))
113 }
114}
115
116#[cfg(test)]
117mod tests {
118 use super::*;
119 use cosmwasm_std::testing::mock_env;
120 use cw_multi_test::App;
121
122 #[test]
123 fn test_new() {
124 let mut app = App::default();
125 let env = mock_env();
126 BvsMultiTest::new(&mut app, &env);
127 }
128
129 #[test]
130 fn test_deploy_bank_vault() {
131 let mut app = App::default();
132 let env = mock_env();
133 let bvs = BvsMultiTest::new(&mut app, &env);
134
135 let operator = app.api().addr_make("operator");
136 let denom = "denom".to_string();
137
138 let bank_vault = bvs.deploy_bank_vault(&mut app, &env, operator.clone(), denom.clone());
139 assert_eq!(bank_vault.init.operator, operator.to_string());
140 assert_eq!(bank_vault.init.denom, denom);
141 }
142
143 #[test]
144 fn test_deploy_cw20_vault() {
145 let mut app = App::default();
146 let env = mock_env();
147 let bvs = BvsMultiTest::new(&mut app, &env);
148
149 let owner = app.api().addr_make("owner").to_string();
150 let token = bvs.deploy_cw20_token(&mut app, &env, "FRUIT", owner.clone());
151
152 let operator = app.api().addr_make("operator");
153 let cw20_vault =
154 bvs.deploy_cw20_vault(&mut app, &env, operator.clone(), token.addr.clone());
155 assert_eq!(cw20_vault.init.operator, operator.to_string());
156 assert_eq!(cw20_vault.init.cw20_contract, token.addr.to_string());
157 }
158}