use serde_json::json;
use serde_valid::Validate;
#[test]
fn enum_named_enum_validation_is_ok() {
fn ok_enum(_value: &TestEnum) -> Result<(), serde_valid::validation::Error> {
Ok(())
}
#[derive(Validate)]
#[validate(custom = ok_enum)]
enum TestEnum {
Named {
#[validate]
a: TestStruct,
#[validate]
b: TestStruct,
},
}
#[derive(Validate)]
struct TestStruct {
#[validate(minimum = 0)]
#[validate(maximum = 10)]
val: i32,
}
let s = TestEnum::Named {
a: TestStruct { val: 5 },
b: TestStruct { val: 5 },
};
assert!(s.validate().is_ok());
}
#[test]
fn enum_unnamed_variant_validation_is_ok() {
#[derive(Validate)]
enum TestEnum {
UnNamed(
#[validate(minimum = 0)]
#[validate(maximum = 10)]
i32,
#[validate] TestStruct,
),
}
#[derive(Validate)]
struct TestStruct {
#[validate(minimum = 0)]
#[validate(maximum = 10)]
val: i32,
}
let s = TestEnum::UnNamed(5, TestStruct { val: 5 });
assert!(s.validate().is_ok());
}
#[test]
fn enum_newtype_variant_validation_is_ok() {
#[derive(Validate)]
enum TestEnum {
NewType(
#[validate(minimum = 0)]
#[validate(maximum = 10)]
i32,
),
}
let s = TestEnum::NewType(15);
assert!(s.validate().is_err());
}
#[test]
fn enum_named_enum_validation_is_err() {
fn err_rule(_data: &TestEnum) -> Result<(), serde_valid::validation::Error> {
Err(serde_valid::validation::Error::Custom(
"Rule error.".to_owned(),
))
}
#[derive(Validate)]
#[validate(custom = err_rule)]
enum TestEnum {
Named {
#[validate]
a: TestStruct,
#[validate]
b: TestStruct,
},
}
#[derive(Validate)]
struct TestStruct {
#[validate(minimum = 0)]
#[validate(maximum = 10)]
val: i32,
}
let s = TestEnum::Named {
a: TestStruct { val: 12 },
b: TestStruct { val: 12 },
};
assert_eq!(
s.validate().unwrap_err().to_string(),
json!({
"errors": ["Rule error."],
"properties": {
"a": {
"errors": [],
"properties": {
"val": {
"errors": ["The number must be `<= 10`."]
}
}
},
"b": {
"errors": [],
"properties": {
"val": {
"errors": ["The number must be `<= 10`."]
}
}
}
}
})
.to_string()
);
}
#[test]
fn enum_unnamed_enum_validation_is_err() {
fn err_rule(_: &TestEnum) -> Result<(), serde_valid::validation::Error> {
Err(serde_valid::validation::Error::Custom(
"Rule error.".to_owned(),
))
}
#[derive(Validate)]
#[validate(custom = err_rule)]
enum TestEnum {
Named(#[validate] TestStruct, #[validate] TestStruct),
}
#[derive(Validate)]
struct TestStruct {
#[validate(minimum = 0)]
#[validate(maximum = 10)]
val: i32,
}
let s = TestEnum::Named(TestStruct { val: 12 }, TestStruct { val: 12 });
assert_eq!(
s.validate().unwrap_err().to_string(),
json!({
"errors": ["Rule error."],
"items": {
"0": {
"errors": [],
"properties": {
"val": {
"errors": ["The number must be `<= 10`."]
}
}
},
"1": {
"errors": [],
"properties": {
"val": {
"errors": ["The number must be `<= 10`."]
}
}
}
}
})
.to_string()
);
}
#[test]
fn enum_newtype_variant_validation_is_err() {
fn err_rule(_: &TestEnum) -> Result<(), serde_valid::validation::Error> {
Err(serde_valid::validation::Error::Custom(
"Rule error.".to_owned(),
))
}
#[derive(Validate)]
#[validate(custom = err_rule)]
enum TestEnum {
NewType(#[validate(minimum = 5)] u32),
}
let s = TestEnum::NewType(4);
assert_eq!(
s.validate().unwrap_err().to_string(),
json!({
"errors": ["Rule error.", "The number must be `>= 5`."]
})
.to_string()
);
}