sz-orm-masking 3.5.0

Data masking: Unicode-safe masking for phone/email/IdCard/bankCard/name/address with custom prefix-suffix rules
Documentation
use sz_orm_masking::{DataMasker, MaskingRule};

#[test]
fn test_mask_phone() {
    let result = DataMasker::apply(&MaskingRule::Phone, "13812345678");
    assert!(result.starts_with("138"));
    assert!(result.ends_with("5678"));
    assert!(result.contains('*'));
}

#[test]
fn test_mask_phone_short() {
    let result = DataMasker::apply(&MaskingRule::Phone, "123");
    assert_eq!(result, "***");
}

#[test]
fn test_mask_phone_empty() {
    let result = DataMasker::apply(&MaskingRule::Phone, "");
    assert_eq!(result, "***");
}

#[test]
fn test_mask_email() {
    let result = DataMasker::apply(&MaskingRule::Email, "user@example.com");
    assert!(result.contains('*'));
    assert!(result.contains('@'));
}

#[test]
fn test_mask_email_short() {
    let result = DataMasker::apply(&MaskingRule::Email, "a@b");
    assert!(!result.is_empty());
}

#[test]
fn test_mask_id_card() {
    let result = DataMasker::apply(&MaskingRule::IdCard, "110101199001011234");
    assert!(result.starts_with("1101"));
    assert!(result.ends_with("1234"));
    assert!(result.contains('*'));
}

#[test]
fn test_mask_bank_card() {
    let result = DataMasker::apply(&MaskingRule::BankCard, "6222021234567890123");
    assert!(result.starts_with("6222"));
    assert!(result.ends_with("0123"));
    assert!(result.contains('*'));
}

#[test]
fn test_mask_name() {
    let result = DataMasker::apply(&MaskingRule::Name, "张三丰");
    assert!(result.contains('*'));
}

#[test]
fn test_mask_name_single_char() {
    let result = DataMasker::apply(&MaskingRule::Name, "");
    assert!(!result.is_empty());
}

#[test]
fn test_mask_address() {
    let result = DataMasker::apply(&MaskingRule::Address, "北京市海淀区中关村大街1号");
    assert!(result.contains('*'));
}

#[test]
fn test_mask_ip() {
    let result = DataMasker::apply(&MaskingRule::Ip, "192.168.1.100");
    assert!(result.contains('*'));
}

#[test]
fn test_mask_imei() {
    let result = DataMasker::apply(&MaskingRule::Imei, "123456789012345");
    assert!(result.contains('*'));
}

#[test]
fn test_mask_plate() {
    let result = DataMasker::apply(&MaskingRule::Plate, "京A12345");
    assert!(result.contains('*'));
}

#[test]
fn test_mask_custom() {
    let result = DataMasker::apply(&MaskingRule::Custom("3,2".to_string()), "abcdefghij");
    assert!(result.starts_with("abc"));
    assert!(result.ends_with("ij"));
    assert!(result.contains('*'));
}

#[test]
fn test_mask_custom_short() {
    let result = DataMasker::apply(&MaskingRule::Custom("3,2".to_string()), "abc");
    assert_eq!(result, "***");
}

#[test]
fn test_mask_unicode_safe() {
    let result = DataMasker::apply(&MaskingRule::Phone, "你好世界你好世界");
    assert!(!result.is_empty());
}

#[test]
fn test_mask_rule_serialization() {
    let rule = MaskingRule::Phone;
    let json = serde_json::to_string(&rule).unwrap();
    let deserialized: MaskingRule = serde_json::from_str(&json).unwrap();
    match deserialized {
        MaskingRule::Phone => {}
        _ => panic!("Expected Phone"),
    }
}