use std::str::FromStr;
use email_address::EmailAddress;
use regex::Regex;
const MIN_DOMAIN_LENGTH: usize = 4;
#[must_use]
pub fn validate_email_address(email_address_to_be_checked: &str) -> bool {
if !EmailAddress::is_valid(email_address_to_be_checked) {
return false;
}
let email = EmailAddress::from_str(email_address_to_be_checked).expect("Invalid email address");
domain_has_extension(email.domain())
}
fn domain_has_extension(domain: &str) -> bool {
if domain.len() < MIN_DOMAIN_LENGTH {
return false;
}
Regex::new(r".*\..*").expect("Invalid regex").is_match(domain)
}
#[cfg(test)]
mod tests {
mod for_email_validation {
use crate::utils::validation::validate_email_address;
#[test]
fn it_should_accept_valid_email_addresses() {
assert!(validate_email_address("test@torrust.com"));
assert!(validate_email_address("t@torrust.org"));
}
#[test]
fn it_should_not_accept_invalid_email_addresses() {
assert!(!validate_email_address("test"));
assert!(!validate_email_address("test@"));
assert!(!validate_email_address("test@torrust."));
assert!(!validate_email_address("test@."));
assert!(!validate_email_address("test@.com"));
assert!(!validate_email_address("test@torrust"));
}
}
mod for_domain_validation {
use crate::utils::validation::domain_has_extension;
#[test]
fn it_should_accept_valid_domain_with_extension() {
assert!(domain_has_extension("a.io"));
assert!(domain_has_extension("a.com"));
}
#[test]
fn it_should_not_accept_dotless_domains() {
assert!(!domain_has_extension(""));
assert!(!domain_has_extension("."));
assert!(!domain_has_extension("a."));
}
}
}