cyber_std_test/
multitest.rs

1use std::cmp::max;
2use std::fmt::Debug;
3use std::ops::{Deref, DerefMut};
4
5use anyhow::{bail, Result as AnyResult};
6use cosmwasm_std::{Addr, Api, Binary, BlockInfo, CustomQuery, Empty, Querier, QuerierResult, Storage};
7use cosmwasm_std::testing::{MockApi, MockStorage};
8use cw_multi_test::{App, AppResponse, BankKeeper, BasicAppBuilder, CosmosRouter, Module, WasmKeeper};
9use schemars::JsonSchema;
10use serde::de::DeserializeOwned;
11
12use cyber_std::{
13    query_res::*,
14    types::*,
15    CyberMsg,
16    CyberQuery,
17};
18
19pub const BLOCK_TIME: u64 = 5;
20
21pub struct CyberModule {}
22
23impl CyberModule{}
24impl Module for CyberModule {
25    type ExecT = CyberMsg;
26    type QueryT = CyberQuery;
27    type SudoT = Empty;
28
29    fn execute<ExecC, QueryC>(
30        &self,
31        _api: &dyn Api,
32        _storage: &mut dyn Storage,
33        _router: &dyn CosmosRouter<ExecC=ExecC, QueryC=QueryC>,
34        _block: &BlockInfo,
35        _sender: Addr,
36        _msg: Self::ExecT,
37    ) -> AnyResult<AppResponse>
38    where
39        ExecC: Debug + Clone + PartialEq + JsonSchema + DeserializeOwned + 'static,
40        QueryC: CustomQuery + DeserializeOwned + 'static
41    {
42        bail!("execute not implemented for CyberModule")
43    }
44
45    fn query(
46        &self,
47        _api: &dyn Api,
48        _storage: &dyn Storage,
49        _querier: &dyn Querier,
50        _block: &BlockInfo,
51        _request: Self::QueryT,
52    ) -> AnyResult<Binary> {
53        bail!("query not implemented for CyberModule")
54    }
55
56    fn sudo<ExecC, QueryC>(
57        &self,
58        _api: &dyn Api,
59        _storage: &mut dyn Storage,
60        _router: &dyn CosmosRouter<ExecC=ExecC, QueryC=QueryC>,
61        _block: &BlockInfo,
62        _msg: Self::SudoT,
63    ) -> AnyResult<AppResponse>
64        where
65            ExecC: Debug + Clone + PartialEq + JsonSchema + DeserializeOwned + 'static,
66            QueryC: CustomQuery + DeserializeOwned + 'static
67    {
68        bail!("sudo not implemented for CyberModule")
69    }
70}
71
72pub type CyberAppWrapped =
73    App<BankKeeper, MockApi, MockStorage, CyberModule, WasmKeeper<CyberMsg, CyberQuery>>;
74
75pub struct CyberApp(CyberAppWrapped);
76
77impl Deref for CyberApp {
78    type Target = CyberAppWrapped;
79
80    fn deref(&self) -> &Self::Target {
81        &self.0
82    }
83}
84
85impl DerefMut for CyberApp {
86    fn deref_mut(&mut self) -> &mut Self::Target {
87        &mut self.0
88    }
89}
90
91impl Querier for CyberApp {
92    fn raw_query(&self, bin_request: &[u8]) -> QuerierResult {
93        self.0.raw_query(bin_request)
94    }
95}
96
97impl Default for CyberApp {
98    fn default() -> Self {
99        Self::new()
100    }
101}
102
103impl CyberApp {
104    pub fn new() -> Self {
105        Self(
106            BasicAppBuilder::<CyberMsg, CyberQuery>::new_custom()
107                .with_custom(CyberModule {})
108                .build(|_router, _, _storage| {}),
109        )
110    }
111
112    pub fn block_info(&self) -> BlockInfo {
113        self.0.block_info()
114    }
115
116    pub fn advance_blocks(&mut self, blocks: u64) {
117        self.update_block(|block| {
118            block.time = block.time.plus_seconds(BLOCK_TIME * blocks);
119            block.height += blocks;
120        });
121    }
122
123    pub fn advance_seconds(&mut self, seconds: u64) {
124        self.update_block(|block| {
125            block.time = block.time.plus_seconds(seconds);
126            block.height += max(1, seconds / BLOCK_TIME);
127        });
128    }
129
130    pub fn next_block(&mut self) {
131        self.advance_blocks(1)
132    }
133}