1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
pub use crate::{APP_ORDER, IBC_APP_VERSION};
use cosmwasm_std::IbcOrder;
use thiserror::Error;

#[derive(Error, Debug, Eq, PartialEq)]
pub enum SimpleIcaError {
    #[error("Only supports unordered channels")]
    InvalidChannelOrder,

    #[error("Counterparty version must be '{0}'")]
    InvalidChannelVersion(&'static str),
}

pub fn check_order(order: &IbcOrder) -> Result<(), SimpleIcaError> {
    if order != &APP_ORDER {
        Err(SimpleIcaError::InvalidChannelOrder)
    } else {
        Ok(())
    }
}

pub fn check_version(version: &str) -> Result<(), SimpleIcaError> {
    if version != IBC_APP_VERSION {
        Err(SimpleIcaError::InvalidChannelVersion(IBC_APP_VERSION))
    } else {
        Ok(())
    }
}

#[cfg(test)]
mod test {
    use super::*;
    use speculoos::prelude::*;

    #[test]
    fn check_order_should_reject_ordered() {
        let actual = check_order(&IbcOrder::Ordered);
        assert_that(&actual).is_err();
    }

    #[test]
    fn check_order_should_accept_unordered() {
        let actual = check_order(&APP_ORDER);
        assert_that(&actual).is_ok();
    }

    #[test]
    fn check_version_should_reject_bad_version() {
        let actual = check_version("bad-version");
        assert_that(&actual).is_err();
    }

    #[test]
    fn check_version_should_accept_good_version() {
        let actual = check_version(IBC_APP_VERSION);
        assert_that(&actual).is_ok();
    }
}