mock_rs/provider/en_us/
payment.rs1use rand::Rng;
2
3use crate::{
4 helpers::base::{numerify, random_element},
5 provider::payment::PaymentTrait,
6};
7
8pub struct Payment {}
9
10impl Payment {
11 pub fn bank_account_number() -> String {
13 let length: usize = rand::thread_rng().gen_range(5..17);
15 let mask = "#".repeat(length);
16
17 numerify(Some(&mask))
18 }
19
20 pub fn bank_routing_number() -> String {
22 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}