Skip to main content

imei_info/
lib.rs

1mod api;
2mod error;
3mod wrapper;
4
5pub use error::*;
6pub use wrapper::*;
7
8#[cfg(test)]
9mod tests {
10    use std::str::FromStr;
11
12    use crate::*;
13
14    const SAMPLE_IMEIS_IPHONE_X: [&str; 10] = [
15        "356741089728686",
16        "356741088901532",
17        "356741086755328",
18        "356741084004687",
19        "356741081753138",
20        "356741082891218",
21        "356741080856916",
22        "356741082001776",
23        "356741089053275",
24        "356741089625577",
25    ];
26
27    const SAMPLE_IMEIS_IPHONE_11: [&str; 10] = [
28        "356656424381449",
29        "356656422684059",
30        "356656420949041",
31        "356656420595471",
32        "356656426436027",
33        "356656426168323",
34        "356656425227245",
35        "356656427178131",
36        "356656420946799",
37        "356656426277561",
38    ];
39
40    const SAMPLE_IMEIS_IPHONE_12: [&str; 10] = [
41        "356741089728686",
42        "356741088901532",
43        "356741086755328",
44        "356741084004687",
45        "356741081753138",
46        "356741082891218",
47        "356741080856916",
48        "356741082001776",
49        "356741089053275",
50        "356741089625577",
51    ];
52
53    const SAMPLE_IMEIS_IPHONE_13: [&str; 10] = [
54        "353031119769899",
55        "353031114733023",
56        "353031119889093",
57        "353031119201240",
58        "353031117066769",
59        "353031114152638",
60        "353031119177119",
61        "353031112524432",
62        "353031112510548",
63        "353031117786374",
64    ];
65
66    const SAMPLE_IMEIS_IPHONE_14: [&str; 10] = [
67        "356663518856450",
68        "356663512611182",
69        "356663512926382",
70        "356663514502413",
71        "356663514265169",
72        "356663516845729",
73        "356663519115005",
74        "356663512314985",
75        "356663514250344",
76        "356663511213253",
77    ];
78
79    const SAMPLE_IMEIS_IPHONE_15: [&str; 10] = [
80        "357292743045215",
81        "357292742100441",
82        "357292742720628",
83        "357292745630642",
84        "357292748317395",
85        "357292743231849",
86        "357292749889186",
87        "357292746950403",
88        "357292744783558",
89        "357292746107053",
90    ];
91
92    const SAMPLE_IMEIS_SAMSUNG_S10: [&str; 10] = [
93        "351725105350612",
94        "351725107128370",
95        "351725102267413",
96        "351725101223904",
97        "351725108018653",
98        "351725102151096",
99        "351725101792791",
100        "351725106100842",
101        "351725101698170",
102        "351725100178711",
103    ];
104
105    const SAMPLE_IMEIS_SAMSUNG_S20: [&str; 10] = [
106        "355623112952700",
107        "355623114222326",
108        "355623115133407",
109        "355623112353826",
110        "355623114613797",
111        "355623116570979",
112        "355623114819972",
113        "355623113858104",
114        "355623111265039",
115        "355623114676307",
116    ];
117
118    const SAMPLE_IMEIS_SAMSUNG_S21: [&str; 10] = [
119        "359043379809723",
120        "359043370680651",
121        "359043375805360",
122        "359043373735551",
123        "359043370097328",
124        "359043377664872",
125        "359043371381523",
126        "359043371473957",
127        "359043375057335",
128        "359043372667672",
129    ];
130
131    const SAMPLE_IMEIS_SAMSUNG_S22: [&str; 10] = [
132        "351561161836263",
133        "351561165123825",
134        "351561168188320",
135        "351561168458202",
136        "351561169492820",
137        "351561166778957",
138        "351561162831321",
139        "351561167705132",
140        "351561166478160",
141        "351561163409762",
142    ];
143
144    #[tokio::test]
145    #[ignore]
146    async fn get_iphone_info() {
147        dotenvy::dotenv().unwrap();
148        let api_key = std::env::var("API_KEY").unwrap();
149
150        assert_eq!(
151            get_imei_info(&api_key, SAMPLE_IMEIS_IPHONE_X[0]).await,
152            Ok(PhoneInfo {
153                imei: SAMPLE_IMEIS_IPHONE_X[0].try_into().unwrap(),
154                manufacturer: "APPLE".to_owned(),
155                model: "iPhone X".to_owned(),
156            })
157        );
158    }
159
160    #[tokio::test]
161    #[ignore]
162    async fn valid_tac_check() {
163        dotenvy::dotenv().unwrap();
164        let api_key = std::env::var("API_KEY").unwrap();
165        let tac = &SAMPLE_IMEIS_SAMSUNG_S10[0][0..8];
166
167        assert_eq!(
168            get_tac_info(&api_key, tac).await,
169            Ok(PhoneInfo {
170                imei: Tac::from_str(tac).unwrap().into(),
171                manufacturer: "SAMSUNG".to_owned(),
172                model: "Galaxy S10 Exynos".to_owned(),
173            })
174        );
175    }
176
177    #[test]
178    fn try_good_imei_from_string() {
179        macro_rules! try_imeis {
180            ( $prefix:expr; $( $postfix:expr ),* ) => {
181                $(
182                    paste::paste! {
183                        for sample_imei in [<SAMPLE_IMEIS_ $prefix _ $postfix>] {
184                            println!("{}", sample_imei);
185                            let imei = Imei::from_str(sample_imei);
186                            println!("{:#?}", &imei);
187                            assert!(imei.is_ok());
188                        }
189                    }
190                )*
191            };
192        }
193
194        try_imeis!(IPHONE; X, 11, 12, 13, 14, 15);
195        try_imeis!(SAMSUNG; S10, S20, S21, S22);
196    }
197
198    #[test]
199    fn try_good_imei_from_int() {
200        macro_rules! try_good_imei {
201            ( $value:literal; $( $numeric_type:ty ),*; $separated:expr ) => {
202                $(
203                    assert_eq!(Imei::try_from($value as $numeric_type), Ok(Imei { digits: $separated }),);
204                )*
205            };
206        }
207
208        try_good_imei!(1234567897; i32, u32; [0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 7]);
209        try_good_imei!(
210            123456789012347; i64, u64, i128, u128, isize, usize;
211            [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 7]
212        );
213    }
214
215    #[test]
216    fn try_good_tac_from_int() {
217        macro_rules! try_good_tac {
218            ( $value:literal; $( $numeric_type:ty ),*; $separated:expr ) => {
219                $(
220                    assert_eq!(Tac::try_from($value as $numeric_type), Ok(Tac { digits: $separated }),);
221                )*
222            };
223        }
224
225        try_good_tac!(12345678; i32, u32, i64, u64, i128, u128, isize, usize; [1, 2, 3, 4, 5, 6, 7, 8]);
226    }
227
228    #[test]
229    fn try_bad_imei_from_int() {
230        macro_rules! try_bad_imei {
231            ( $value:literal; $( $numeric_type:ty ),* ) => {
232                $(
233                    assert_eq!(Imei::try_from($value as $numeric_type), Err(ImeiWrapperError::ValueOutOfRange),);
234                )*
235            };
236        }
237
238        try_bad_imei!(-1; i32, i64, i128, isize);
239        try_bad_imei!(1234567890123456; i64, u64, i128, u128, isize, usize);
240    }
241
242    #[test]
243    fn try_bad_tac_from_int() {
244        macro_rules! try_bad_tac {
245            ( $value:literal; $( $numeric_type:ty ),* ) => {
246                $(
247                    assert_eq!(Tac::try_from($value as $numeric_type), Err(ImeiWrapperError::ValueOutOfRange),);
248                )*
249            };
250        }
251
252        try_bad_tac!(-1; i32, i64, i128, isize);
253        try_bad_tac!(123456789; i32, u32, i64, u64, i128, u128, isize, usize);
254    }
255}