mock_rs/provider/en_us/
payment.rs

1use rand::Rng;
2
3use crate::{
4    helpers::base::{numerify, random_element},
5    provider::payment::PaymentTrait,
6};
7
8pub struct Payment {}
9
10impl Payment {
11    /// Returns a random bank account number
12    pub fn bank_account_number() -> String {
13        // Length between 5 and 17
14        let length: usize = rand::thread_rng().gen_range(5..17);
15        let mask = "#".repeat(length);
16
17        numerify(Some(&mask))
18    }
19
20    /// Returns a random bank routing number
21    pub fn bank_routing_number() -> String {
22        // Length between 9 and 11
23        let district: usize = rand::thread_rng().gen_range(1..12);
24        let vec = &vec![&0, &0, &0, &0, &20, &20, &60];
25        let district_type = random_element(vec);
26        let state: usize = rand::thread_rng().gen_range(1..9);
27        let clearing_center: usize = rand::thread_rng().gen_range(1..9);
28        let institution: usize = rand::thread_rng().gen_range(1000..9999);
29
30        let result = format!(
31            "{:2}{:1}{:1}{:4}",
32            district + district_type,
33            state,
34            clearing_center,
35            institution
36        );
37
38        format!(
39            "{}{}",
40            result,
41            Self::calculate_routing_number_checksum(&result)
42        )
43    }
44
45    fn calculate_routing_number_checksum(routing: &str) -> usize {
46        let routing = routing.chars().collect::<Vec<char>>();
47        let checksum: usize = (7
48            * (routing[0] as usize + routing[3] as usize + routing[6] as usize)
49            + 3 * (routing[1] as usize + routing[4] as usize + routing[7] as usize)
50            + 9 * (routing[2] as usize + routing[5] as usize))
51            % 10;
52
53        checksum
54    }
55}
56impl PaymentTrait<'_> for Payment {}
57
58mod tests {
59
60    #[test]
61    fn test_bank_account_number() {
62        let number = super::Payment::bank_account_number();
63        assert!(number.len() >= 5);
64        assert!(number.len() <= 17);
65    }
66
67    #[test]
68    fn test_calculate_routing_number_checksum() {
69        let routing = "10892900";
70        let checksum = super::Payment::calculate_routing_number_checksum(&routing);
71        assert!(checksum <= 9);
72    }
73
74    #[test]
75    fn test_bank_routing_number() {
76        let number = super::Payment::bank_routing_number();
77        assert!(number.len() >= 9);
78        assert!(number.len() <= 11);
79    }
80}