diff options
Diffstat (limited to 'validator_derive/tests/test_derive.rs')
| -rw-r--r-- | validator_derive/tests/test_derive.rs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/validator_derive/tests/test_derive.rs b/validator_derive/tests/test_derive.rs index 9a11b79..6832762 100644 --- a/validator_derive/tests/test_derive.rs +++ b/validator_derive/tests/test_derive.rs @@ -9,6 +9,7 @@ use validator::Validate; #[derive(Debug, Validate, Deserialize)] +#[validate(schema(function = "validate_signup", skip_on_field_errors = false))] struct SignupData { #[validate(email)] mail: String, @@ -37,6 +38,44 @@ fn validate_unique_username(username: &str) -> Option<String> { None } +fn validate_signup(data: &SignupData) -> Option<(String, String)> { + if data.mail.ends_with("gmail.com") && data.age == 18 { + return Some(("all".to_string(), "stupid_rule".to_string())); + } + + None +} + +#[derive(Debug, Validate, Deserialize)] +#[validate(schema(function = "validate_signup2", skip_on_field_errors = false))] +struct SignupData2 { + #[validate(email)] + mail: String, + #[validate(range(min = 18, max = 20))] + age: u32, +} + +#[derive(Debug, Validate, Deserialize)] +#[validate(schema(function = "validate_signup3"))] +struct SignupData3 { + #[validate(email)] + mail: String, + #[validate(range(min = 18, max = 20))] + age: u32, +} + +fn validate_signup2(data: &SignupData2) -> Option<(String, String)> { + if data.mail.starts_with("bob") && data.age == 18 { + return Some(("mail".to_string(), "stupid_rule".to_string())); + } + + None +} + +fn validate_signup3(_: &SignupData3) -> Option<(String, String)> { + Some(("mail".to_string(), "stupid_rule".to_string())) +} + #[test] fn test_can_validate_ok() { let signup = SignupData { @@ -161,3 +200,45 @@ fn test_must_match_can_fail() { }; assert!(data.validate().is_err()) } + +#[test] +fn test_can_fail_struct_validation_new_key() { + let signup = SignupData { + mail: "bob@gmail.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("all")); + assert_eq!(errs["all"], vec!["stupid_rule".to_string()]); +} + +#[test] +fn test_can_fail_struct_validation_existing_key() { + let signup = SignupData2 { + mail: "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(), "stupid_rule".to_string()]); +} + +#[test] +fn test_skip_struct_validation_by_default_if_errors() { + let signup = SignupData3 { + mail: "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()]); + +} |
