diff options
Diffstat (limited to 'validator_derive/tests/test_derive.rs')
| -rw-r--r-- | validator_derive/tests/test_derive.rs | 136 | 
1 files changed, 136 insertions, 0 deletions
| diff --git a/validator_derive/tests/test_derive.rs b/validator_derive/tests/test_derive.rs new file mode 100644 index 0000000..1e310b1 --- /dev/null +++ b/validator_derive/tests/test_derive.rs @@ -0,0 +1,136 @@ +#![feature(proc_macro, attr_literals)] + +#[macro_use] extern crate validator_derive; +extern crate validator; +#[macro_use] extern crate serde_derive; +extern crate serde_json; + +use validator::Validate; + + +#[derive(Debug, Validate, Deserialize)] +struct SignupData { +    #[validate(email)] +    mail: String, +    #[validate(url)] +    site: String, +    #[validate(length(min = 1), custom = "validate_unique_username")] +    #[serde(rename = "firstName")] +    first_name: String, +    #[validate(range(min = 18, max = 20))] +    age: u32, +} + +fn validate_unique_username(username: &str) -> Option<String> { +    if username == "xXxShad0wxXx" { +        return Some("terrible_username".to_string()); +    } + +    None +} + +#[test] +fn test_can_validate_ok() { +    let signup = SignupData { +        mail: "bob@bob.com".to_string(), +        site: "http://hello.com".to_string(), +        first_name: "Bob".to_string(), +        age: 18, +    }; + +    assert!(signup.validate().is_ok()); +} + +#[test] +fn test_bad_email_fails_validation() { +    let signup = SignupData { +        mail: "bob".to_string(), +        site: "http://hello.com".to_string(), +        first_name: "Bob".to_string(), +        age: 18, +    }; +    let res = signup.validate(); +    assert!(res.is_err()); +    let errs = res.unwrap_err(); +    assert!(errs.contains_key("mail")); +    assert_eq!(errs["mail"], vec!["email".to_string()]); +} + +#[test] +fn test_bad_url_fails_validation() { +    let signup = SignupData { +        mail: "bob@bob.com".to_string(), +        site: "//hello.com".to_string(), +        first_name: "Bob".to_string(), +        age: 18, +    }; +    let res = signup.validate(); +    assert!(res.is_err()); +    let errs = res.unwrap_err(); +    assert!(errs.contains_key("site")); +    assert_eq!(errs["site"], vec!["url".to_string()]); +} + +#[test] +fn test_bad_length_fails_validation_and_points_to_original_name() { +    let signup = SignupData { +        mail: "bob@bob.com".to_string(), +        site: "http://hello.com".to_string(), +        first_name: "".to_string(), +        age: 18, +    }; +    let res = signup.validate(); +    assert!(res.is_err()); +    let errs = res.unwrap_err(); +    println!("{:?}", errs); +    assert!(errs.contains_key("firstName")); +    assert_eq!(errs["firstName"], vec!["length".to_string()]); +} + + +#[test] +fn test_bad_range_fails_validation() { +    let signup = SignupData { +        mail: "bob@bob.com".to_string(), +        site: "https://hello.com".to_string(), +        first_name: "Bob".to_string(), +        age: 1, +    }; +    let res = signup.validate(); +    assert!(res.is_err()); +    let errs = res.unwrap_err(); +    assert!(errs.contains_key("age")); +    assert_eq!(errs["age"], vec!["range".to_string()]); +} + +#[test] +fn test_can_have_multiple_errors() { +    let signup = SignupData { +        mail: "bob@bob.com".to_string(), +        site: "https://hello.com".to_string(), +        first_name: "".to_string(), +        age: 1, +    }; +    let res = signup.validate(); +    assert!(res.is_err()); +    let errs = res.unwrap_err(); +    assert!(errs.contains_key("age")); +    assert!(errs.contains_key("firstName")); +    assert_eq!(errs["age"], vec!["range".to_string()]); +    assert_eq!(errs["firstName"], vec!["length".to_string()]); +} + +#[test] +fn test_custom_validation_error() { +    let signup = SignupData { +        mail: "bob@bob.com".to_string(), +        site: "https://hello.com".to_string(), +        first_name: "xXxShad0wxXx".to_string(), +        age: 18, +    }; +    let res = signup.validate(); +    assert!(res.is_err()); +    let errs = res.unwrap_err(); +    assert!(errs.contains_key("firstName")); +    assert_eq!(errs["firstName"], vec!["terrible_username".to_string()]); +} | 
