diff options
| author | Vincent Prouillet | 2017-01-16 20:56:05 +0900 |
|---|---|---|
| committer | Vincent Prouillet | 2017-01-16 20:56:05 +0900 |
| commit | ade9820f497d678296530bbf13bb4de46253d0fe (patch) | |
| tree | ab821e4d55e1fd2af4d0ef22e5c2336ba69343cf /validator_derive/tests | |
| parent | 3302d261744c12001ec2cd980fffd32a829185aa (diff) | |
| download | validator-ade9820f497d678296530bbf13bb4de46253d0fe.tar.bz2 | |
Struct level validation
Diffstat (limited to 'validator_derive/tests')
| -rw-r--r-- | validator_derive/tests/compile-fail/schema/missing_function.rs | 20 | ||||
| -rw-r--r-- | validator_derive/tests/run-pass/custom.rs | 2 | ||||
| -rw-r--r-- | validator_derive/tests/run-pass/email.rs | 2 | ||||
| -rw-r--r-- | validator_derive/tests/run-pass/length.rs | 2 | ||||
| -rw-r--r-- | validator_derive/tests/run-pass/must_match.rs | 2 | ||||
| -rw-r--r-- | validator_derive/tests/run-pass/range.rs | 2 | ||||
| -rw-r--r-- | validator_derive/tests/run-pass/schema.rs | 27 | ||||
| -rw-r--r-- | validator_derive/tests/test_derive.rs | 81 |
8 files changed, 133 insertions, 5 deletions
diff --git a/validator_derive/tests/compile-fail/schema/missing_function.rs b/validator_derive/tests/compile-fail/schema/missing_function.rs new file mode 100644 index 0000000..cacb328 --- /dev/null +++ b/validator_derive/tests/compile-fail/schema/missing_function.rs @@ -0,0 +1,20 @@ +#![feature(proc_macro, attr_literals)] + +#[macro_use] extern crate validator_derive; +extern crate validator; +use validator::Validate; + +#[derive(Validate)] +//~^ ERROR: custom derive attribute panicked +//~^^ HELP: Invalid schema level validation: `function` is required +#[validate(schema())] +struct Test { + s: i32, +} + +fn hey(_: &Test) -> Option<(String, String)> { + None +} + + +fn main() {} diff --git a/validator_derive/tests/run-pass/custom.rs b/validator_derive/tests/run-pass/custom.rs index 205198e..642b2d2 100644 --- a/validator_derive/tests/run-pass/custom.rs +++ b/validator_derive/tests/run-pass/custom.rs @@ -1,4 +1,4 @@ -#![feature(proc_macro, attr_literals)] +#![feature(attr_literals)] #[macro_use] extern crate validator_derive; extern crate validator; diff --git a/validator_derive/tests/run-pass/email.rs b/validator_derive/tests/run-pass/email.rs index edfc357..014c7b8 100644 --- a/validator_derive/tests/run-pass/email.rs +++ b/validator_derive/tests/run-pass/email.rs @@ -1,4 +1,4 @@ -#![feature(proc_macro, attr_literals)] +#![feature(attr_literals)] #[macro_use] extern crate validator_derive; extern crate validator; diff --git a/validator_derive/tests/run-pass/length.rs b/validator_derive/tests/run-pass/length.rs index 01b85ea..1e0d30e 100644 --- a/validator_derive/tests/run-pass/length.rs +++ b/validator_derive/tests/run-pass/length.rs @@ -1,4 +1,4 @@ -#![feature(proc_macro, attr_literals)] +#![feature(attr_literals)] #[macro_use] extern crate validator_derive; extern crate validator; diff --git a/validator_derive/tests/run-pass/must_match.rs b/validator_derive/tests/run-pass/must_match.rs index 0d2d917..c79d20d 100644 --- a/validator_derive/tests/run-pass/must_match.rs +++ b/validator_derive/tests/run-pass/must_match.rs @@ -1,4 +1,4 @@ -#![feature(proc_macro, attr_literals)] +#![feature(attr_literals)] #[macro_use] extern crate validator_derive; extern crate validator; diff --git a/validator_derive/tests/run-pass/range.rs b/validator_derive/tests/run-pass/range.rs index 8f3a047..79e3229 100644 --- a/validator_derive/tests/run-pass/range.rs +++ b/validator_derive/tests/run-pass/range.rs @@ -1,4 +1,4 @@ -#![feature(proc_macro, attr_literals)] +#![feature(attr_literals)] #[macro_use] extern crate validator_derive; extern crate validator; diff --git a/validator_derive/tests/run-pass/schema.rs b/validator_derive/tests/run-pass/schema.rs new file mode 100644 index 0000000..788d1e2 --- /dev/null +++ b/validator_derive/tests/run-pass/schema.rs @@ -0,0 +1,27 @@ +#![feature(attr_literals)] + +#[macro_use] extern crate validator_derive; +extern crate validator; +use validator::Validate; + +#[derive(Validate)] +#[validate(schema(function = "hey"))] +struct Test { + s: String, +} + +fn hey(_: &Test) -> Option<(String, String)> { + None +} + +#[derive(Validate)] +#[validate(schema(function = "hey2", skip_on_field_errors = false))] +struct Test2 { + s: String, +} + +fn hey2(_: &Test2) -> Option<(String, String)> { + None +} + +fn main() {} 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()]); + +} |
