qubit-redact 0.9.0

Rule-driven redaction for fields, diagnostics, HTTP data, and Rust domain objects
Documentation
// =============================================================================
//    Copyright (c) 2025 - 2026 Haixing Hu.
//
//    SPDX-License-Identifier: Apache-2.0
//
//    Licensed under the Apache License, Version 2.0.
// =============================================================================
//! Integration coverage for policy-backed transaction-session composition.

use std::ffi::OsStr;

use qubit_redact::RedactionPolicy;
use qubit_redact::Redactor;
use qubit_redact::formats::argv::ArgvItem;

#[test]
fn test_text_composer_composes_policy_classified_fields_and_formats() {
    let policy = RedactionPolicy::builder()
        .fields(|fields| {
            let _ = fields.secret_sensitive("password");
        })
        .expect("field policy draft should build")
        .build()
        .expect("policy should build");
    let redactor = Redactor::new(policy);
    let first = redactor
        .text_composer()
        .literal("request password=")
        .field("password", "super-secret")
        .literal(" argv=")
        .argv(|argv| {
            argv.items([ArgvItem::plain(OsStr::new("client"))]);
        })
        .finish();

    assert_eq!(first.text().as_str(), "request password=<redacted> argv=[\"client\"]");
    assert!(!first.text().as_str().contains("super-secret"));

    let second = redactor.text_composer().field("password", "second-secret").finish();
    assert_eq!(second.text().as_str(), "<redacted>");
    assert!(!second.text().as_str().contains("second-secret"));
}