use rustapi_macros::Validate;
use rustapi_validate::v2::{Validate, ValidationContextBuilder, ValidationErrors};
#[derive(Validate)]
struct I18nTest {
#[validate(email)]
email: String,
#[validate(length(min = 5))]
username: String,
}
fn assert_localized(errors: &ValidationErrors, field: &str, locale: Option<&str>, expected: &str) {
let errs = errors.get(field).unwrap();
let err = &errs[0];
let msg = err.interpolate_with_locale(locale);
assert_eq!(msg, expected, "Failed for locale {:?}", locale);
}
#[test]
fn test_default_locale_english() {
rust_i18n::set_locale("en");
let valid = I18nTest {
email: "invalid".to_string(),
username: "tiny".to_string(),
};
let result = valid.validate();
assert!(result.is_err());
let errors = result.unwrap_err();
assert_localized(&errors, "email", None, "Invalid email format");
assert_localized(
&errors,
"username",
None,
"Length must be at least 5 characters",
);
}
#[test]
fn test_explicit_locale_turkish() {
let valid = I18nTest {
email: "invalid".to_string(),
username: "tiny".to_string(),
};
let result = valid.validate();
let errors = result.unwrap_err();
assert_localized(&errors, "email", Some("tr"), "Geçersiz e-posta formatı");
assert_localized(
&errors,
"username",
Some("tr"),
"Uzunluk en az 5 karakter olmalıdır",
);
}
#[test]
fn test_context_locale() {
let ctx = ValidationContextBuilder::new().locale("tr").build();
let locale = ctx.locale();
let valid = I18nTest {
email: "invalid".to_string(),
username: "tiny".to_string(),
};
let result = valid.validate();
let errors = result.unwrap_err();
let api_error = errors.to_api_error_with_locale(locale);
let email_err = api_error
.error
.fields
.iter()
.find(|f| f.field == "email")
.unwrap();
assert_eq!(email_err.message, "Geçersiz e-posta formatı");
}
#[test]
fn test_fallback_to_english() {
let valid = I18nTest {
email: "invalid".to_string(),
username: "tiny".to_string(),
};
let result = valid.validate();
let errors = result.unwrap_err();
rust_i18n::set_locale("en");
let errs = errors.get("email").unwrap();
let msg = errs[0].interpolate_with_locale(Some("fr"));
assert_eq!(msg, "Invalid email format");
}