Skip to content

Commit 995affe

Browse files
Simon-Lauxuser
authored and
user
committed
add tests for own email parsing
1 parent 0d08ce9 commit 995affe

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed

src/parser/email.rs

+141
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
///! Parsing / Validation of email addresses
2+
///
3+
/// It should follow [RFC 5322](https://datatracker.ietf.org/doc/html/rfc5322#section-1)
4+
/// and [RFC 6532](https://datatracker.ietf.org/doc/html/rfc6532)
5+
6+
#[cfg(test)]
7+
mod test_email_validation {
8+
9+
// Credits of original test data: https://github.com/Sayan751/email-address-parser
10+
// License of original test data: MIT
11+
// original sources: https://github.com/Sayan751/email-address-parser/blob/df6de2b99db5dc31b5eab4258f64ea4809e932cc/rust-lib/.test_data/
12+
const invalid_domains: Vec<&'static str> = vec![
13+
r#""#,
14+
r#"example.com>"#,
15+
r#"test..com"#,
16+
r#".test.com"#,
17+
r#"test.com."#,
18+
r#"google.."#,
19+
r#".com"#,
20+
r#"google-.com"#,
21+
r#"-google-.com"#,
22+
];
23+
const invalid_local_parts: Vec<&'static str> = vec![
24+
r#""#,
25+
r#"a\\ud83c"#,
26+
r#"\"test"#,
27+
r#"test."#,
28+
r#"te..st"#,
29+
r#"<test"#,
30+
r#"test>"#,
31+
r#".test"#,
32+
r#"\"test\\ t\"est\""#,
33+
r#"\"test t\"est\""#,
34+
r#"te\";\"st"#,
35+
r#"te;st"#,
36+
];
37+
const valid_domains: Vec<&'static str> = vec![
38+
r#"google.com"#,
39+
r#"m.maselkowski.pl"#,
40+
r#"xn--masekowski-d0b.pl"#,
41+
r#"[127.0.0.0]"#,
42+
r#"[192.168.0.1]"#,
43+
r#"[1.2.3.4]"#,
44+
r#"[0.0.0.1]"#,
45+
r#"[255.255.255.254]"#,
46+
r#"masełkowski.pl.com"#,
47+
r#"中国互联网络信息中心.中国"#,
48+
r#"中国互联网络信息中心.xn--masekowski-d0b"#,
49+
r#"bücher.com"#,
50+
r#"nächste.de"#,
51+
r#"löwen.de"#,
52+
r#"افغانستا.com"#,
53+
r#"বাংলাদেশ.com"#,
54+
r#"беларусь.com"#,
55+
r#"belgië.com"#,
56+
r#"českárepublika.com"#,
57+
r#"مصر.com"#,
58+
r#"ελλάδα.com"#,
59+
r#"ísland.com"#,
60+
r#"भारत.com"#,
61+
r#"איקו״ם.ישראל.com"#,
62+
r#"қазақстан.com"#,
63+
r#"한국.com"#,
64+
r#"кыргызстан.com"#,
65+
r#"ລາວ.com"#,
66+
r#"македонија.com"#,
67+
r#"монголулс.com"#,
68+
r#"россия.иком.com"#,
69+
r#"இலங்கை.com"#,
70+
r#"españa.com"#,
71+
r#"ไทย.com"#,
72+
r#"việtnam.com"#,
73+
r#"📻.fm"#,
74+
r#"🎁.de"#,
75+
r#"âêîôû.Çéàèù.ëïü"#,
76+
];
77+
const valid_local_parts: Vec<&'static str> = vec![
78+
r#"test"#,
79+
r#"a"#,
80+
r#"!#$%&'*+-/=?^_`{|}~"#,
81+
r#"\"test test\""#,
82+
r#"\"test\\ test\""#,
83+
r#"te.st"#,
84+
r#"\"te\\,st\""#,
85+
r#"\"te\\;st\""#,
86+
];
87+
88+
#[test]
89+
fn domain_part_invalid() {
90+
// parse invalid domains parts
91+
}
92+
93+
#[test]
94+
fn domain_part_valid() {
95+
// parse valid domains parts
96+
}
97+
98+
#[test]
99+
fn local_part_invalid() {
100+
// parse invalid local parts
101+
}
102+
103+
#[test]
104+
fn local_part_valid() {
105+
// parse valid local parts
106+
}
107+
108+
#[test]
109+
fn local_part_valid() {
110+
// parse valid local parts
111+
}
112+
113+
fn combinde_email_parts(local_parts: Vec<&string>, domain_parts: Vec<&string>) -> Vec<String> {
114+
let mut emails: Vec<String> = Vec::new();
115+
for domain_part in domain_parts {
116+
for local_part in local_parts {
117+
emails.push(format!("{}@{}", local_part, domain_part));
118+
}
119+
}
120+
emails
121+
}
122+
123+
#[test]
124+
fn parse_valid_emails() {
125+
let emails = combinde_email_parts(valid_local_parts, valid_domains);
126+
127+
for email in emails {
128+
assert_eq(true /* todo parse email */, true)
129+
}
130+
}
131+
132+
fn parse_invalid_emails() {
133+
let emails = combinde_email_parts(invalid_local_parts, invalid_domains)
134+
.extend(combinde_email_parts(valid_local_parts, invalid_domains))
135+
.extend(combinde_email_parts(invalid_local_parts, valid_domains));
136+
137+
for email in emails {
138+
assert_eq(false /* todo parse email */, false)
139+
}
140+
}
141+
}

0 commit comments

Comments
 (0)