using Elsa.Testing.Shared; using Elsa.Workflows; using Elsa.Workflows.Exceptions; namespace Elsa.Activities.UnitTests.Primitives; /// /// Unit tests for the activity. /// public class FaultTests { [Fact(DisplayName = "Fault throws FaultException with all properties set")] public async Task Should_Throw_FaultException_With_All_Properties() { // Arrange var fault = new Fault { Code = new("ERR_001"), Category = new("HTTP"), FaultType = new("Business"), Message = new("Invalid request") }; // Act & Assert var exception = await ExecuteAndAssertFaultAsync(fault); Assert.Equal("ERR_001", exception.Code); Assert.Equal("HTTP", exception.Category); Assert.Equal("Business", exception.Type); Assert.Equal("Invalid request", exception.Message); } [Fact(DisplayName = "Fault uses default values when inputs are null")] public async Task Should_Use_Default_Values_When_Inputs_Are_Null() { // Arrange var fault = new Fault { Code = new((string)null!), Category = new((string)null!), FaultType = new((string)null!), Message = new((string?)null) }; // Act & Assert var exception = await ExecuteAndAssertFaultAsync(fault); Assert.Equal("0", exception.Code); Assert.Equal("General", exception.Category); Assert.Equal("System", exception.Type); Assert.NotNull(exception.Message); } [Fact(DisplayName = "Fault throws FaultException with null message")] public async Task Should_Throw_FaultException_With_Null_Message() { // Arrange var fault = new Fault { Code = new("ERR_002"), Category = new("Database"), FaultType = new("Integration"), Message = new((string?)null) }; // Act & Assert var exception = await ExecuteAndAssertFaultAsync(fault); Assert.Equal("ERR_002", exception.Code); Assert.Equal("Database", exception.Category); Assert.Equal("Integration", exception.Type); Assert.NotNull(exception.Message); } [Theory(DisplayName = "Fault throws FaultException with various code values")] [InlineData("404", "404")] [InlineData("VALIDATION_ERROR", "VALIDATION_ERROR")] [InlineData("", "")] public async Task Should_Throw_FaultException_With_Various_Codes(string code, string expectedCode) { // Arrange var fault = new Fault { Code = new(code), Category = new("Test"), FaultType = new("Test") }; // Act & Assert var exception = await ExecuteAndAssertFaultAsync(fault); Assert.Equal(expectedCode, exception.Code); } [Fact(DisplayName = "Fault.Create factory method creates correctly configured instance")] public async Task Create_Factory_Method_Creates_Correctly_Configured_Instance() { // Arrange var fault = Fault.Create("CREATE_001", "Factory", "Test", "Created via factory"); // Act & Assert var exception = await ExecuteAndAssertFaultAsync(fault); Assert.Equal("CREATE_001", exception.Code); Assert.Equal("Factory", exception.Category); Assert.Equal("Test", exception.Type); Assert.Equal("Created via factory", exception.Message); } [Fact(DisplayName = "Fault.Create factory method with null message")] public async Task Create_Factory_Method_With_Null_Message() { // Arrange var fault = Fault.Create("CODE", "Category", "Type"); // Act & Assert var exception = await ExecuteAndAssertFaultAsync(fault); Assert.Equal("CODE", exception.Code); Assert.Equal("Category", exception.Category); Assert.Equal("Type", exception.Type); Assert.NotNull(exception.Message); } private static async Task ExecuteAndAssertFaultAsync(IActivity activity) { return await Assert.ThrowsAsync(() => ExecuteAsync(activity)); } private static async Task ExecuteAsync(IActivity activity) { return await new ActivityTestFixture(activity).ExecuteAsync(); } }