use rustapi_macros::Validate;
use rustapi_validate::v2::prelude::*;
#[derive(Validate)]
struct User {
#[validate(length(min = 3, message = "Username too short", groups = ["Create", "Update"]))]
username: String,
#[validate(email(message = "Invalid email"))]
email: String,
#[validate(length(min = 6, groups = ["Create"]))]
password_hash: String, }
#[test]
fn test_default_group_validation() {
let user = User {
username: "ab".to_string(), email: "invalid-email".to_string(), password_hash: "123".to_string(), };
let res = user.validate();
assert!(res.is_err());
let errs = res.unwrap_err();
assert!(
errs.get("email").is_some(),
"Email should fail on Default group"
);
assert!(
errs.get("username").is_none(),
"Username has explicit groups, should not run on Default context"
);
assert!(
errs.get("password_hash").is_none(),
"Password has explicit group Create, should not run on Default"
);
}
#[test]
fn test_create_group_validation() {
let user = User {
username: "ab".to_string(),
email: "invalid-email".to_string(),
password_hash: "123".to_string(),
};
let res = user.validate_with_group(ValidationGroup::Create);
assert!(res.is_err());
let errs = res.unwrap_err();
assert!(
errs.get("username").is_some(),
"Username should fail on Create group"
);
assert!(
errs.get("email").is_some(),
"Email should fail on Create group"
);
assert!(
errs.get("password_hash").is_some(),
"Password should fail on Create group"
);
}
#[test]
fn test_update_group_validation() {
let user = User {
username: "ab".to_string(),
email: "invalid-email".to_string(),
password_hash: "123".to_string(),
};
let res = user.validate_with_group(ValidationGroup::Update);
assert!(res.is_err());
let errs = res.unwrap_err();
assert!(
errs.get("username").is_some(),
"Username should fail on Update group"
);
assert!(
errs.get("email").is_some(),
"Email should fail on Update group"
);
assert!(
errs.get("password_hash").is_none(),
"Password should NOT fail on Update group"
);
}
#[test]
fn test_custom_group_validation() {
let user = User {
username: "ab".to_string(),
email: "invalid-email".to_string(),
password_hash: "123".to_string(),
};
let res = user.validate_with_group(ValidationGroup::Custom("Admin".into()));
assert!(res.is_err());
let errs = res.unwrap_err();
assert!(
errs.get("username").is_none(),
"Username should NOT fail on Custom group"
);
assert!(
errs.get("email").is_some(),
"Email should fail on Custom group"
);
assert!(
errs.get("password_hash").is_none(),
"Password should NOT fail on Custom group"
);
}