zod_rs_util/
lib.rs

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}