aboutsummaryrefslogtreecommitdiffstats
path: root/validator_derive/tests
diff options
context:
space:
mode:
Diffstat (limited to 'validator_derive/tests')
-rw-r--r--validator_derive/tests/compile-fail/schema/missing_function.rs20
-rw-r--r--validator_derive/tests/run-pass/custom.rs2
-rw-r--r--validator_derive/tests/run-pass/email.rs2
-rw-r--r--validator_derive/tests/run-pass/length.rs2
-rw-r--r--validator_derive/tests/run-pass/must_match.rs2
-rw-r--r--validator_derive/tests/run-pass/range.rs2
-rw-r--r--validator_derive/tests/run-pass/schema.rs27
-rw-r--r--validator_derive/tests/test_derive.rs81
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()]);
+
+}