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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use crate::{Rc, client::*, constants::banks::*, errors::*, request::*};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
/// The Banks data struct
pub struct BankResponseData {
    /// The ISPB code
    pub ispb: String,
    /// The bank Name
    pub name: String,
    /// The bank Code
    pub code: i16,
    /// The bank FULL_NAME
    pub full_name: String,
}

impl PartialEq for BankResponseData {
    fn eq(&self, other: &Self) -> bool {
        self.ispb == other.ispb && self.name == other.name && self.code == other.code && self.full_name == other.full_name
    }
}

impl BrasilApiClient {
    /// Get all banks
    pub async fn get_banks(&self) -> Result<Vec<BankResponseData>, Error> {
        Ok(get::<(), Vec<BankResponseData>>(
            &format!("{}/{}", self.base_url, SVC_URL)
        ).await?)
    }

    /**
    Get Banks by code <br />
    Example: 33 - Santander
    */
    pub async fn get_banks_by_code(&self, code: &i16) -> Result<BankResponseData, Error> {
        if code < MIN_CODE || code > MAX_CODE {
            return Err(Error::InvalidInputRangeError
                {
                    name: "code".to_string(),
                    min: 1, 
                    max: 999
                })?
        }

        
        Ok(get::<(), BankResponseData>(
            &format!("{}/{}/{}", self.base_url, SVC_URL, code)
        ).await?)
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::client::tests::cli;
    use futures_await_test::async_test;

    #[async_test]
    async fn test_invalid_min_range() {
        let code = MIN_CODE - 1;
        let resp = cli().get_banks_by_code(&code).await;
        assert!(resp.is_err());
    }

    #[async_test]
    async fn test_invalid_max_range() {
        let code = MAX_CODE + 1;
        let resp = cli().get_banks_by_code(&code).await;
        assert!(resp.is_err());
    }

    #[async_test]
    async fn test_valid_banco_do_brasil() {
        let resp = cli().get_banks_by_code(&1).await;
        assert!(resp.is_ok());

        let expected_text = r#"{"ispb":"00000000","name":"BCO DO BRASIL S.A.","code":1,"fullName":"Banco do Brasil S.A."}"#;
        let expected_json = serde_json::from_str::<BankResponseData>(expected_text).unwrap();

        let from_svc = resp.unwrap();

        assert_eq!(from_svc, expected_json);
    }

    #[async_test]
    async fn test_non_existing() {
        let resp = cli().get_banks_by_code(&999).await;
        assert!(resp.is_err());
    }

}