File: RedactionFakesAcceptanceTests.cs
Web Access
Project: src\test\Libraries\Microsoft.Extensions.Compliance.Testing.Tests\Microsoft.Extensions.Compliance.Testing.Tests.csproj (Microsoft.Extensions.Compliance.Testing.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using Microsoft.Extensions.Compliance.Classification;
using Microsoft.Extensions.Compliance.Redaction;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
 
namespace Microsoft.Extensions.Compliance.Testing.Test;
 
public class RedactionFakesAcceptanceTests
{
    [Fact]
    public void Can_Register_And_Use_Fake_Redactor_With_Default_Options_With_DataClassification()
    {
        var dc = new DataClassification("Foo", "0x1");
 
        var data = "Lalaalal";
        using var services = new ServiceCollection()
            .AddLogging()
            .AddRedaction(x => x.SetFakeRedactor(dc))
            .BuildServiceProvider();
 
        var provider = services.GetRequiredService<IRedactorProvider>();
 
        var r = provider.GetRedactor(dc);
        var redacted = r.Redact(data);
 
        Assert.IsAssignableFrom<FakeRedactor>(r);
        Assert.Contains(data, redacted);
    }
 
    [Fact]
    public void Can_Register_And_Use_Fake_Redactor_With_Default_Options()
    {
        var dc = new DataClassification("TAX", "1");
        var data = "Lalaalal";
        using var services = new ServiceCollection()
            .AddLogging()
            .AddRedaction(x => x.SetFakeRedactor(dc))
            .BuildServiceProvider();
 
        var provider = services.GetRequiredService<IRedactorProvider>();
 
        var r = provider.GetRedactor(dc);
        var redacted = r.Redact(data);
 
        Assert.IsAssignableFrom<FakeRedactor>(r);
        Assert.Contains(data, redacted);
    }
 
    [Fact]
    public void Can_Register_And_Use_Fake_Redactor_With_Configuration_Section_Options_With_Data_Classification()
    {
        var dc = new DataClassification("Foo", "0x1");
 
        var data = "Lalaalal";
        using var services = new ServiceCollection()
            .AddLogging()
            .AddRedaction(x => x.SetFakeRedactor(Setup.GetFakesConfiguration(), dc))
            .BuildServiceProvider();
 
        var provider = services.GetRequiredService<IRedactorProvider>();
 
        var r = provider.GetRedactor(dc);
        var redacted = r.Redact(data);
 
        Assert.IsAssignableFrom<FakeRedactor>(r);
        Assert.Contains(data, redacted);
    }
 
    [Fact]
    public void Can_Register_And_Use_Fake_Redactor_With_Configuration_Section_Options()
    {
        var dc = new DataClassification("TAX", "1");
        var data = "Lalaalal";
        using var services = new ServiceCollection()
            .AddLogging()
            .AddRedaction(x => x.SetFakeRedactor(Setup.GetFakesConfiguration(), dc))
            .BuildServiceProvider();
 
        var provider = services.GetRequiredService<IRedactorProvider>();
 
        var r = provider.GetRedactor(dc);
        var redacted = r.Redact(data);
 
        Assert.IsAssignableFrom<FakeRedactor>(r);
        Assert.Contains(data, redacted);
    }
 
    [Fact]
    public void Can_Register_And_Use_Fake_Redactor_With_Action_Options_With_DataClassification()
    {
        var dc = new DataClassification("Foo", "0x1");
 
        var data = "Lalaalal";
        using var services = new ServiceCollection()
            .AddLogging()
            .AddRedaction(x => x.SetFakeRedactor(x => { x.RedactionFormat = "xxx{0}xxx"; }, dc))
            .BuildServiceProvider();
 
        var provider = services.GetRequiredService<IRedactorProvider>();
 
        var r = provider.GetRedactor(dc);
        var redacted = r.Redact(data);
 
        Assert.IsAssignableFrom<FakeRedactor>(r);
        Assert.Contains(data, redacted);
    }
 
    [Fact]
    public void AddRedactionAndSetFakeRedactor_Pick_Up_Options_Correctly()
    {
        var dc = new DataClassification("TAX", "1");
        var data = "Lalaalal";
        using var services = new ServiceCollection()
            .AddLogging()
            .AddFakeRedaction()
            .AddRedaction(builder => builder.SetFakeRedactor(options => { options.RedactionFormat = "xxx{0}xxx"; }, dc))
            .BuildServiceProvider();
 
        var provider = services.GetRequiredService<IRedactorProvider>();
 
        var r = provider.GetRedactor(dc);
        var redacted = r.Redact(data);
 
        Assert.IsAssignableFrom<FakeRedactor>(r);
        Assert.Equal($"xxx{data}xxx", redacted);
    }
 
    [Fact]
    public void AddRedactionWithActionAndSetFakeRedactor_Pick_Up_Options_Correctly()
    {
        var dc = new DataClassification("TAX", "1");
        var data = "Lalaalal";
        using var services = new ServiceCollection()
            .AddLogging()
            .AddFakeRedaction(_ => { })
            .AddRedaction(builder => builder.SetFakeRedactor(options => { options.RedactionFormat = "xxx{0}xxx"; }, dc))
            .BuildServiceProvider();
 
        var provider = services.GetRequiredService<IRedactorProvider>();
 
        var r = provider.GetRedactor(dc);
        var redacted = r.Redact(data);
 
        Assert.IsAssignableFrom<FakeRedactor>(r);
        Assert.Equal($"xxx{data}xxx", redacted);
    }
 
    [Fact]
    public void SetFakeRedactorAndAddRedaction_Pick_Up_Options_Correctly()
    {
        var dc = new DataClassification("TAX", "1");
        var data = "Lalaalal";
        using var services = new ServiceCollection()
            .AddLogging()
            .AddRedaction(builder => builder.SetFakeRedactor(options => { options.RedactionFormat = "xxx{0}xxx"; }, dc))
            .AddFakeRedaction()
            .BuildServiceProvider();
 
        var provider = services.GetRequiredService<IRedactorProvider>();
 
        var r = provider.GetRedactor(dc);
        var redacted = r.Redact(data);
 
        Assert.IsAssignableFrom<FakeRedactor>(r);
        Assert.Equal($"xxx{data}xxx", redacted);
    }
 
    [Fact]
    public void SetFakeRedactorAndAddRedactionWithAction_Pick_Up_Options_Correctly()
    {
        var dc = new DataClassification("TAX", "1");
        var data = "Lalaalal";
        using var services = new ServiceCollection()
            .AddLogging()
            .AddRedaction(builder => builder.SetFakeRedactor(options => { options.RedactionFormat = "xxx{0}xxx"; }, dc))
            .AddFakeRedaction(_ => { })
            .BuildServiceProvider();
 
        var provider = services.GetRequiredService<IRedactorProvider>();
 
        var r = provider.GetRedactor(dc);
        var redacted = r.Redact(data);
 
        Assert.IsAssignableFrom<FakeRedactor>(r);
        Assert.Equal($"xxx{data}xxx", redacted);
    }
 
    [Fact]
    public void RedactionFakesEventCollector_Can_Be_Obtained_From_DI_And_Show_Redaction_History()
    {
        var data = "Lalaalal";
        var data2 = "Lalaalal222222222";
        var redactionFormat = "xxx";
 
        using var services = new ServiceCollection()
            .AddLogging()
            .AddFakeRedaction(x => x.RedactionFormat = redactionFormat)
            .BuildServiceProvider();
 
        var provider = services.GetRequiredService<IRedactorProvider>();
        var collector = services.GetFakeRedactionCollector();
 
        var dc = new DataClassification("TAX", "1");
        var r = provider.GetRedactor(dc);
        var redacted = r.Redact(data);
        var redacted2 = r.Redact(data2);
 
        Assert.Equal(2, collector.AllRedactedData.Count);
        Assert.Equal(data2, collector.LastRedactedData.Original);
        Assert.Equal(redacted2, collector.LastRedactedData.Redacted);
        Assert.Equal(2, collector.LastRedactedData.SequenceNumber);
 
        Assert.Equal(1, collector.AllRedactedData[0].SequenceNumber);
        Assert.Equal(data, collector.AllRedactedData[0].Original);
        Assert.Equal(redacted, collector.AllRedactedData[0].Redacted);
 
        Assert.Equal(1, collector.LastRedactorRequested.SequenceNumber);
        Assert.Equal(dc, collector.LastRedactorRequested.DataClassifications);
        Assert.Single(collector.AllRedactorRequests);
    }
 
    [Fact]
    public void Fake_Redaction_Extensions_Does_Not_Allow_Null_Arguments()
    {
        var dc = new DataClassification("TAX", "1");
 
        Assert.Throws<ArgumentNullException>(() => ((IRedactionBuilder)null!).SetFakeRedactor(dc));
        Assert.Throws<ArgumentNullException>(() => ((IRedactionBuilder)null!).SetFakeRedactor(Setup.GetFakesConfiguration(), dc));
        Assert.Throws<ArgumentNullException>(() => ((IRedactionBuilder)null!).SetFakeRedactor(x => x.RedactionFormat = "2", dc));
        Assert.Throws<ArgumentNullException>(() => new ServiceCollection().AddRedaction(x => x.SetFakeRedactor((Action<FakeRedactorOptions>)null!, dc)));
 
        Assert.Throws<ArgumentNullException>(() => ((IServiceCollection)null!).AddRedaction(x => x.SetFakeRedactor((Action<FakeRedactorOptions>)null!, dc)));
        Assert.Throws<ArgumentNullException>(() => ((IServiceCollection)null!).AddFakeRedaction());
        Assert.Throws<ArgumentNullException>(() => ((IServiceCollection)null!).AddFakeRedaction(_ => { }));
        Assert.Throws<ArgumentNullException>(() => new ServiceCollection().AddFakeRedaction(null!));
    }
 
    [Fact]
    public void Fake_Redaction_Works_Fine_Without_Any_Config()
    {
        using var sp = new ServiceCollection().AddFakeRedaction().BuildServiceProvider();
 
        var rp = sp.GetRequiredService<IRedactorProvider>();
        var dc = new DataClassification("TAX", "1");
        var r = rp.GetRedactor(dc);
        var collector = sp.GetFakeRedactionCollector();
 
        var redacted = r.Redact("dddd");
 
        Assert.Equal(dc, collector.LastRedactorRequested.DataClassifications);
        Assert.Equal(redacted, collector.LastRedactedData.Redacted);
    }
}