data_privacy 0.11.0

Data annotation and redaction system providing a robust way to manipulate sensitive information.
Documentation
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

#![expect(missing_docs, reason = "Test code")]

use data_privacy::simple_redactor::{SimpleRedactor, SimpleRedactorMode};
use data_privacy::{DataClass, Redactor};

const TEST_CLASS_ID: DataClass = DataClass::new("test_taxonomy", "test_class");
const TEST_VALUE: &str = "secret";

fn redact_to_string(redactor: &SimpleRedactor, data_class: &DataClass, value: &str) -> String {
    let mut output = String::new();
    _ = redactor.redact(data_class, value, &mut output);
    output
}

#[test]
fn new_should_create_default_redactor() {
    let redactor = SimpleRedactor::new();
    assert_eq!(*redactor.mode(), SimpleRedactorMode::Replace('*'));
}

#[test]
fn default_should_be_same_as_new() {
    let r1 = SimpleRedactor::new();
    let r2 = SimpleRedactor::default();
    assert_eq!(r1.mode(), r2.mode());
}

#[test]
fn with_mode_should_set_mode() {
    let mode = SimpleRedactorMode::Erase;
    let redactor = SimpleRedactor::with_mode(mode.clone());
    assert_eq!(*redactor.mode(), mode);
}

#[test]
fn redact_should_erase() {
    let redactor = SimpleRedactor::with_mode(SimpleRedactorMode::Erase);
    let result = redact_to_string(&redactor, &TEST_CLASS_ID, TEST_VALUE);
    assert_eq!(result, "");
}

#[test]
fn redact_should_erase_and_tag() {
    let redactor = SimpleRedactor::with_mode(SimpleRedactorMode::EraseAndTag);
    let result = redact_to_string(&redactor, &TEST_CLASS_ID, TEST_VALUE);
    assert_eq!(result, "<test_taxonomy/test_class:>");
}

#[test]
fn redact_should_passthrough() {
    let redactor = SimpleRedactor::with_mode(SimpleRedactorMode::Passthrough);
    let result = redact_to_string(&redactor, &TEST_CLASS_ID, TEST_VALUE);
    assert_eq!(result, TEST_VALUE);
}

#[test]
fn redact_should_passthrough_and_tag() {
    let redactor = SimpleRedactor::with_mode(SimpleRedactorMode::PassthroughAndTag);
    let result = redact_to_string(&redactor, &TEST_CLASS_ID, TEST_VALUE);
    assert_eq!(result, format!("<{TEST_CLASS_ID}:{TEST_VALUE}>"));
}

#[test]
fn redact_should_replace_with_asterisks() {
    let redactor = SimpleRedactor::with_mode(SimpleRedactorMode::Replace('*'));
    let result = redact_to_string(&redactor, &TEST_CLASS_ID, TEST_VALUE);
    assert_eq!(result, "******");
}

#[test]
fn redact_should_replace_with_char() {
    let redactor = SimpleRedactor::with_mode(SimpleRedactorMode::Replace('#'));
    let result = redact_to_string(&redactor, &TEST_CLASS_ID, TEST_VALUE);
    assert_eq!(result, "######");
}

#[test]
fn redact_should_replace_and_tag_with_asterisks() {
    let redactor = SimpleRedactor::with_mode(SimpleRedactorMode::ReplaceAndTag('*'));
    let result = redact_to_string(&redactor, &TEST_CLASS_ID, TEST_VALUE);
    assert_eq!(result, format!("<{TEST_CLASS_ID}:******>"));
}

#[test]
fn redact_should_replace_and_tag_with_char() {
    let redactor = SimpleRedactor::with_mode(SimpleRedactorMode::ReplaceAndTag('#'));
    let result = redact_to_string(&redactor, &TEST_CLASS_ID, TEST_VALUE);
    assert_eq!(result, format!("<{TEST_CLASS_ID}:######>"));
}

#[test]
fn redact_should_insert() {
    let redactor = SimpleRedactor::with_mode(SimpleRedactorMode::Insert("replacement".into()));
    let result = redact_to_string(&redactor, &TEST_CLASS_ID, TEST_VALUE);
    assert_eq!(result, "replacement");
}

#[test]
fn redact_should_insert_and_tag() {
    let redactor = SimpleRedactor::with_mode(SimpleRedactorMode::InsertAndTag("replacement".into()));
    let result = redact_to_string(&redactor, &TEST_CLASS_ID, TEST_VALUE);
    assert_eq!(result, format!("<{TEST_CLASS_ID}:replacement>"));
}