#[cfg(test)]
mod error_sanitizer_creation_tests {
use super::super::*;
#[test]
fn test_error_sanitizer_creation() {
let sanitizer = ErrorSanitizer::new();
assert!(!sanitizer.strict_mode());
}
#[test]
fn test_strict_mode_sanitizer() {
let sanitizer = ErrorSanitizer::new().with_strict_mode(true);
assert!(sanitizer.strict_mode());
}
#[test]
fn test_sanitizer_with_custom_rules() {
let mut sanitizer = ErrorSanitizer::new();
sanitizer.add_custom_rule(r"custom-\d+", "***CUSTOM***");
let sanitized = sanitizer.sanitize("Error: custom-12345 failed");
assert!(sanitized.contains("***CUSTOM***"));
}
}
#[cfg(test)]
mod error_sanitization_tests {
use super::super::*;
#[test]
fn test_sanitize_api_key() {
let sanitizer = ErrorSanitizer::new();
let error = "API request failed: api_key=sk-123456789abcdef";
let sanitized = sanitizer.sanitize(error);
assert!(!sanitized.contains("sk-123456789abcdef"));
assert!(sanitized.contains("api_key"));
}
#[test]
fn test_sanitize_password() {
let sanitizer = ErrorSanitizer::new();
let error = "Authentication failed: password=secret123";
let sanitized = sanitizer.sanitize(error);
assert!(!sanitized.contains("secret123"));
assert!(sanitized.contains("password"));
}
#[test]
fn test_sanitize_tokens() {
let sanitizer = ErrorSanitizer::new();
let error = "Token validation error: access_token=eyJhbGciOiJIUzI1NiJ9";
let sanitized = sanitizer.sanitize(error);
assert!(!sanitized.contains("eyJhbGciOiJIUzI1NiJ9"));
assert!(sanitized.contains("access_token"));
}
#[test]
fn test_sanitize_bearer_token() {
let sanitizer = ErrorSanitizer::new();
let error = "Authorization failed: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9";
let sanitized = sanitizer.sanitize(error);
assert!(!sanitized.contains("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"));
assert!(sanitized.contains("Bearer"));
}
#[test]
fn test_sanitize_connection_string() {
let sanitizer = ErrorSanitizer::new();
let error =
"Database connection failed: database_url=postgresql://user:pass@localhost:5432/db";
let sanitized = sanitizer.sanitize(error);
assert!(!sanitized.contains("postgresql://user:pass@localhost:5432/db"));
assert!(sanitized.contains("***CONNECTION_STRING***"));
}
#[test]
fn test_sanitize_mongodb_connection() {
let sanitizer = ErrorSanitizer::new();
let error = "MongoDB connection failed: connection_string=mongodb+srv://admin:password123@cluster.mongodb.net/test?retryWrites=true";
let sanitized = sanitizer.sanitize(error);
assert!(!sanitized.contains("password123"));
assert!(sanitized.contains("***CONNECTION_STRING***"));
}
#[test]
fn test_sanitize_secret_key() {
let sanitizer = ErrorSanitizer::new();
let error = "Encryption error: secret_key=sk_live_abcdefghijklmnop";
let sanitized = sanitizer.sanitize(error);
assert!(!sanitized.contains("sk_live_abcdefghijklmnop"));
assert!(sanitized.contains("secret_key"));
}
#[test]
fn test_sanitize_private_key() {
let sanitizer = ErrorSanitizer::new();
let error = "SSL error: private_key=-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEA0Z3VS5JJcds3xfn/ygWyF8DtQ8j9WdaLrtWVWbmZmRF\n...-----END RSA PRIVATE KEY-----";
let sanitized = sanitizer.sanitize(error);
assert!(!sanitized.contains("BEGIN RSA PRIVATE KEY"));
assert!(sanitized.contains("private_key"));
}
#[test]
fn test_sanitize_basic_auth() {
let sanitizer = ErrorSanitizer::new();
let error = "HTTP error: Basic dXNlcm5hbWU6cGFzc3dvcmQ=";
let sanitized = sanitizer.sanitize(error);
assert!(!sanitized.contains("dXNlcm5hbWU6cGFzc3dvcmQ="));
assert!(sanitized.contains("Basic"));
}
#[test]
fn test_sanitize_email() {
let sanitizer = ErrorSanitizer::new();
let error = "User registration failed for user@example.com";
let sanitized = sanitizer.sanitize(error);
assert!(!sanitized.contains("user@example.com"));
}
#[test]
fn test_sanitize_ip_address() {
let sanitizer = ErrorSanitizer::new();
let error = "Connection from 192.168.1.100 was rejected";
let sanitized = sanitizer.sanitize(error);
assert!(!sanitized.contains("192.168.1.100"));
assert!(sanitized.contains("***IP_ADDRESS***"));
}
}
#[cfg(test)]
mod sensitive_data_filter_tests {
use super::super::*;
#[test]
fn test_sensitive_data_filter_creation() {
let filter = SensitiveDataFilter::new();
assert!(filter.is_empty());
}
#[test]
fn test_add_blocked_pattern() {
let mut filter = SensitiveDataFilter::new();
filter.add_blocked_pattern(r"(?i)password").unwrap();
let result = filter.filter("Enter your password here");
assert!(result.1.is_blocked());
}
#[test]
fn test_add_allowed_pattern() {
let mut filter = SensitiveDataFilter::new();
filter.add_blocked_pattern(r"(?i)password").unwrap();
filter.add_allowed_pattern(r"password_policy").unwrap();
let result = filter.filter("Password must meet password_policy requirements");
assert!(result.1.is_allowed());
}
#[test]
fn test_batch_filtering() {
let mut filter = SensitiveDataFilter::new();
filter.add_blocked_pattern(r"(?i)password").unwrap();
filter.add_blocked_pattern(r"(?i)secret").unwrap();
let messages = vec![
"Normal message",
"Password: secret123",
"API Key: sk-12345",
"Just a test",
];
let results = filter.filter_all(&messages);
assert!(results[0].1.is_allowed());
assert!(results[1].1.is_blocked());
assert!(results[2].1.is_allowed()); assert!(results[3].1.is_allowed());
}
}
#[cfg(test)]
mod security_context_tests {
use super::super::*;
#[test]
fn test_security_context_creation() {
let context = SecurityContext::new();
assert!(!context.has_sensitive_data());
}
#[test]
fn test_add_sensitive_data_to_context() {
let mut context = SecurityContext::new();
context.add_sensitive_field("password");
context.add_sensitive_field("api_key");
assert!(context.has_sensitive_data());
assert!(context.is_sensitive_field("password"));
assert!(context.is_sensitive_field("api_key"));
assert!(!context.is_sensitive_field("name"));
}
#[test]
fn test_check_sensitive_field() {
let mut context = SecurityContext::new();
context.add_sensitive_field("token");
assert!(context.is_sensitive_field("token"));
assert!(context.is_sensitive_field("TOKEN"));
assert!(context.is_sensitive_field("Token"));
assert!(!context.is_sensitive_field("username"));
}
}