use dbnexus::{MaskType, SensitiveError, SensitiveMasker};
#[test]
fn test_mask_email() {
let result = SensitiveMasker::mask("alice@example.com", MaskType::Email);
assert!(result.is_ok(), "mask email should succeed: {:?}", result.err());
let masked = result.unwrap();
assert!(masked.contains("@"), "masked email should retain @");
assert!(masked.contains("example.com"), "domain should be retained");
assert!(masked.contains("*"), "masked part should contain asterisks");
}
#[test]
fn test_mask_email_short() {
let result = SensitiveMasker::mask("a@b.co", MaskType::Email);
match result {
Ok(masked) => assert!(masked.contains("@"), "short email should retain @"),
Err(SensitiveError::InvalidInput(_)) => { }
Err(e) => panic!("unexpected error for short email: {:?}", e),
}
}
#[test]
fn test_mask_phone() {
let result = SensitiveMasker::mask("13812345678", MaskType::Phone);
assert!(result.is_ok(), "mask phone should succeed: {:?}", result.err());
let masked = result.unwrap();
assert!(masked.starts_with("138"), "should retain first 3 digits");
assert!(masked.ends_with("5678"), "should retain last 4 digits");
assert!(masked.contains("*"), "should contain asterisks");
}
#[test]
fn test_mask_phone_invalid() {
let result = SensitiveMasker::mask("123", MaskType::Phone);
assert!(result.is_err(), "invalid phone should return error, got: {:?}", result);
match result {
Err(SensitiveError::InvalidInput(_)) => { }
Err(e) => panic!("expected InvalidInput, got {:?}", e),
Ok(v) => panic!("expected error, got {}", v),
}
}
#[test]
fn test_mask_id_card() {
let result = SensitiveMasker::mask("110101199001011234", MaskType::IdCard);
assert!(result.is_ok(), "mask id card should succeed: {:?}", result.err());
let masked = result.unwrap();
assert!(masked.starts_with("1101"), "should retain first 4 chars");
assert!(masked.ends_with("1234"), "should retain last 4 chars");
assert!(masked.contains("*"), "should contain asterisks");
}
#[test]
fn test_mask_credit_card() {
let result = SensitiveMasker::mask("6222021234567890", MaskType::BankCard);
assert!(result.is_ok(), "mask bank card should succeed: {:?}", result.err());
let masked = result.unwrap();
assert!(masked.starts_with("6222"), "should retain first 4 digits");
assert!(masked.ends_with("7890"), "should retain last 4 digits");
assert!(masked.contains("*"), "should contain asterisks");
}
#[test]
fn test_mask_email_unicode_local_part() {
let result = SensitiveMasker::mask("测试@example.com", MaskType::Email);
assert!(result.is_ok(), "unicode email should succeed: {:?}", result.err());
let masked = result.unwrap();
assert!(masked.ends_with("@example.com"), "domain should be retained");
assert!(masked.contains('*'), "should contain asterisks");
let result = SensitiveMasker::mask("测@test.com", MaskType::Email);
assert!(
result.is_ok(),
"single unicode char email should succeed: {:?}",
result.err()
);
let result = SensitiveMasker::mask("😀@emoji.com", MaskType::Email);
assert!(result.is_ok(), "emoji email should succeed: {:?}", result.err());
}
#[test]
fn test_mask_custom() {
let result = SensitiveMasker::mask(
"sensitive_data_here",
MaskType::Custom {
keep_prefix: 4,
keep_suffix: 4,
},
);
assert!(result.is_ok(), "mask custom should succeed: {:?}", result.err());
let masked = result.unwrap();
assert!(masked.starts_with("sens"), "should retain first 4 chars");
assert!(masked.ends_with("here"), "should retain last 4 chars");
assert!(masked.contains("*"), "should contain asterisks");
}