brasilapi_client/definitions/
banks.rs

1use crate::{client::*, constants::banks::*, errors::*, request::*};
2use serde::{Deserialize, Serialize};
3
4#[derive(Serialize, Deserialize, Debug)]
5#[serde(rename_all = "camelCase")]
6/// The Banks data struct
7pub struct BankResponseData {
8    /// The ISPB code
9    pub ispb: String,
10    /// The bank Name
11    pub name: String,
12    /// The bank Code
13    pub code: i16,
14    /// The bank FULL_NAME
15    pub full_name: String,
16}
17
18impl PartialEq for BankResponseData {
19    fn eq(&self, other: &Self) -> bool {
20        self.ispb == other.ispb && self.name == other.name && self.code == other.code && self.full_name == other.full_name
21    }
22}
23
24impl BrasilApiClient {
25    /// Get all banks
26    pub async fn get_banks(&self) -> Result<Vec<BankResponseData>, Error> {
27        Ok(get::<(), Vec<BankResponseData>>(
28            &format!("{}/{}", self.base_url, SVC_URL)
29        ).await?)
30    }
31
32    /**
33    Get Banks by code <br />
34    Example: 33 - Santander
35    */
36    pub async fn get_banks_by_code(&self, code: &i16) -> Result<BankResponseData, Error> {
37        if code < MIN_CODE || code > MAX_CODE {
38            return Err(Error::InvalidInputRangeError
39                {
40                    name: "code".to_string(),
41                    min: 1, 
42                    max: 999
43                })
44        }
45
46        
47        Ok(get::<(), BankResponseData>(
48            &format!("{}/{}/{}", self.base_url, SVC_URL, code)
49        ).await?)
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56    use crate::client::tests::cli;
57    use futures_await_test::async_test;
58
59    #[async_test]
60    async fn test_invalid_min_range() {
61        let code = MIN_CODE - 1;
62        let resp = cli().get_banks_by_code(&code).await;
63        assert!(resp.is_err());
64    }
65
66    #[async_test]
67    async fn test_invalid_max_range() {
68        let code = MAX_CODE + 1;
69        let resp = cli().get_banks_by_code(&code).await;
70        assert!(resp.is_err());
71    }
72
73    #[async_test]
74    async fn test_valid_banco_do_brasil() {
75        let resp = cli().get_banks_by_code(&1).await;
76        assert!(resp.is_ok());
77
78        let expected_text = r#"{"ispb":"00000000","name":"BCO DO BRASIL S.A.","code":1,"fullName":"Banco do Brasil S.A."}"#;
79        let expected_json = serde_json::from_str::<BankResponseData>(expected_text).unwrap();
80
81        let from_svc = resp.unwrap();
82
83        assert_eq!(from_svc, expected_json);
84    }
85
86    #[async_test]
87    async fn test_non_existing() {
88        let resp = cli().get_banks_by_code(&999).await;
89        assert!(resp.is_err());
90    }
91
92}