|
| 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