cdumay_core 0.1.7

A Rust Library for standard code
Documentation
#[cfg(test)]
mod tests {
    use std::collections::BTreeMap;
    use serde_value::Value;
    use cdumay_core::{define_errors, define_kinds, Error};

    define_kinds! {
        NotFound = (404, "Resource Not Found"),
        Unauthorized = (401, "Unauthorized Access"),
    }

    define_errors! {
        NotFoundError = NotFound,
        UnauthorizedError = Unauthorized,
        Forbidden = (Unauthorized, 403),
        LoginTimeout = (Unauthorized, 440, "Login Time-out") 
    }

    #[test]
    fn test_not_found_error_defaults() {
        let err = NotFoundError::new();
        assert_eq!(err.code(), 404);
        assert_eq!(err.message(), "Resource Not Found");
        assert_eq!(err.class(), "Client::NotFound::NotFoundError");
    }

    #[test]
    fn test_forbidden_error_override_code() {
        let err = Forbidden::new();
        assert_eq!(err.code(), 403);
        assert_eq!(err.message(), "Unauthorized Access");
        assert_eq!(err.class(), "Client::Unauthorized::Forbidden");
    }

    #[test]
    fn test_forbidden_error_override_message() {
        let err = LoginTimeout::new();
        assert_eq!(err.code(), 440);
        assert_eq!(err.message(), "Login Time-out");
        assert_eq!(err.class(), "Client::Unauthorized::LoginTimeout");
    }

    #[test]
    fn test_with_custom_fields() {
        let mut details = BTreeMap::new();
        details.insert("reason".to_string(), Value::String("token_expired".into()));

        let err = UnauthorizedError::new()
            .with_code(498)
            .with_message("Token expired".to_string())
            .with_details(details.clone());

        assert_eq!(err.code(), 498);
        assert_eq!(err.message(), "Token expired");
        assert_eq!(err.details(), details);
    }

    #[test]
    fn test_conversion_to_core_error() {
        let err = NotFoundError::new().with_message("Page missing".to_string());
        let core: Error = err.into();

        assert_eq!(core.code(), 404);
        assert_eq!(core.message(), "Page missing");
    }

    #[test]
    fn test_generated_error_display() {
        let err = NotFoundError::new();
        let s = format!("{}", err);
        assert!(s.contains("NotFoundError"));
        assert!(s.contains("404"));
        assert!(s.contains("Resource Not Found"));
    }

    #[test]
    fn test_generated_error_with_code_and_details() {
        let mut details = BTreeMap::new();
        details.insert("path".to_string(), Value::String("/missing".into()));
        let err = NotFoundError::new()
            .with_code(404)
            .with_details(details.clone());
        assert_eq!(err.code(), 404);
        assert_eq!(err.details(), details);
    }

    #[test]
    fn test_generated_error_std_error_trait() {
        let err = NotFoundError::new();
        let _: &dyn std::error::Error = &err;
    }
}