1mod error;
2mod locales;
3
4pub use error::{
5 issue::ValidationIssue,
6 result::{ValidateResult, ValidationResult},
7 NumberConstraint, ParseError, StringFormat, ValidationError, ValidationOrigin, ValidationType,
8};
9pub use locales::*;
10
11#[cfg(test)]
12mod tests {
13
14 use super::*;
15 use crate::{
16 error::{StringFormat, ValidationOrigin, ValidationType},
17 locales::Locale,
18 };
19
20 fn add(left: u64, right: u64) -> u64 {
21 left + right
22 }
23
24 #[test]
25 fn it_works() {
26 let result = add(2, 2);
27 assert_eq!(result, 4);
28 }
29
30 #[test]
31 fn test_validation_error_creation() {
32 let error = ValidationError::required();
33 assert_eq!(error.to_string(), "Value is required but was not provided");
34
35 let error = ValidationError::invalid_type(ValidationType::String, ValidationType::Number);
36 assert_eq!(
37 error.to_string(),
38 "Invalid input: expected string, received number"
39 );
40 }
41
42 #[test]
43 fn test_validation_result() {
44 let mut result = ValidationResult::new();
45 assert!(result.is_empty());
46
47 result.add_error(ValidationError::required());
48 assert_eq!(result.len(), 1);
49
50 let error_result = ValidationResult::with_error(ValidationError::required());
51 assert_eq!(error_result.len(), 1);
52 }
53
54 #[test]
55 fn test_validation_issue_path() {
56 let issue = ValidationIssue {
57 path: vec!["user".to_string(), "name".to_string()],
58 error: ValidationError::required(),
59 };
60
61 assert_eq!(
62 issue.to_string(),
63 "user.name: Value is required but was not provided"
64 );
65 }
66
67 #[test]
68 fn test_validation_result_display() {
69 let mut result = ValidationResult::new();
70 result.add_error_at_path(
71 vec!["user".to_string(), "email".to_string()],
72 ValidationError::invalid_format(StringFormat::custom("email"), None),
73 );
74 result.add_error_at_path(
75 vec!["user".to_string(), "age".to_string()],
76 ValidationError::too_small(ValidationOrigin::Number, "15", true),
77 );
78
79 let display = result.to_string();
80
81 assert!(display.contains("user.email: Invalid email address"));
82 assert!(display.contains("user.age: Too small: expected number to have >= 15"));
83 }
84
85 #[test]
86 fn test_validation_result_display_ar() {
87 let mut result = ValidationResult::new();
88
89 result.add_error_at_path(
90 vec!["user".to_string(), "email".to_string()],
91 ValidationError::invalid_format(StringFormat::custom("email"), None),
92 );
93 result.add_error_at_path(
94 vec!["user".to_string(), "age".to_string()],
95 ValidationError::too_small(ValidationOrigin::Number, "15", true),
96 );
97
98 let display = result.local(Locale::Ar);
99
100 assert!(display.contains("user.email: بريد إلكتروني غير مقبول"));
101 assert!(display.contains("user.age: أصغر من اللازم: يفترض لـ number أن يكون >= 15"));
102 }
103}