diff --git a/test/unit/Elsa.Activities.UnitTests/Console/WriteLineTests.cs b/test/unit/Elsa.Activities.UnitTests/Console/WriteLineTests.cs new file mode 100644 index 000000000..401906a19 --- /dev/null +++ b/test/unit/Elsa.Activities.UnitTests/Console/WriteLineTests.cs @@ -0,0 +1,174 @@ +using Elsa.Activities.UnitTests.Helpers; +using Elsa.Expressions.Models; +using Elsa.Workflows; +using Microsoft.Extensions.DependencyInjection; +using NSubstitute; + +namespace Elsa.Activities.UnitTests.Console; + +public class WriteLineTests +{ + [Fact] + public async Task Should_Write_String_Literal_To_Output() + { + // Arrange + const string expectedText = "Hello, World!"; + var mockTextWriter = Substitute.For(); + var mockProvider = Substitute.For(); + mockProvider.GetTextWriter().Returns(mockTextWriter); + + var writeLine = new WriteLine(expectedText); + + // Act + await ActivityTestHelper.ExecuteActivityAsync(writeLine, services => + { + services.AddSingleton(mockProvider); + }); + + // Assert + mockTextWriter.Received(1).WriteLine(expectedText); + } + + [Fact] + public async Task Should_Write_Literal_Expression_To_Output() + { + // Arrange + const string expectedText = "Literal expression"; + var literal = new Literal(expectedText); + var mockTextWriter = Substitute.For(); + var mockProvider = Substitute.For(); + mockProvider.GetTextWriter().Returns(mockTextWriter); + + var writeLine = new WriteLine(literal); + + // Act + await ActivityTestHelper.ExecuteActivityAsync(writeLine, services => + { + services.AddSingleton(mockProvider); + }); + + // Assert + mockTextWriter.Received(1).WriteLine(expectedText); + } + + [Fact] + public async Task Should_Write_Delegate_Function_Result_To_Output() + { + // Arrange + const string expectedText = "Function result"; + Func textFunc = () => expectedText; + var mockTextWriter = Substitute.For(); + var mockProvider = Substitute.For(); + mockProvider.GetTextWriter().Returns(mockTextWriter); + + var writeLine = new WriteLine(textFunc); + + // Act + await ActivityTestHelper.ExecuteActivityAsync(writeLine, services => + { + services.AddSingleton(mockProvider); + }); + + // Assert + mockTextWriter.Received(1).WriteLine(expectedText); + } + + [Fact] + public async Task Should_Write_Expression_Context_Function_Result_To_Output() + { + // Arrange + const string expectedText = "Context function result"; + Func textFunc = _ => expectedText; + var mockTextWriter = Substitute.For(); + var mockProvider = Substitute.For(); + mockProvider.GetTextWriter().Returns(mockTextWriter); + + var writeLine = new WriteLine(textFunc); + + // Act + await ActivityTestHelper.ExecuteActivityAsync(writeLine, services => + { + services.AddSingleton(mockProvider); + }); + + // Assert + mockTextWriter.Received(1).WriteLine(expectedText); + } + + [Fact] + public async Task Should_Write_Input_Value_To_Output() + { + // Arrange + const string expectedText = "Input value"; + var input = new Input(expectedText); + var mockTextWriter = Substitute.For(); + var mockProvider = Substitute.For(); + mockProvider.GetTextWriter().Returns(mockTextWriter); + + var writeLine = new WriteLine(input); + + // Act + await ActivityTestHelper.ExecuteActivityAsync(writeLine, services => + { + services.AddSingleton(mockProvider); + }); + + // Assert + mockTextWriter.Received(1).WriteLine(expectedText); + } + + [Fact] + public async Task Should_Write_Null_Value_To_Output() + { + // Arrange + var mockTextWriter = Substitute.For(); + var mockProvider = Substitute.For(); + mockProvider.GetTextWriter().Returns(mockTextWriter); + + var writeLine = new WriteLine(new Input(default(string)!)); + + // Act + await ActivityTestHelper.ExecuteActivityAsync(writeLine, services => + { + services.AddSingleton(mockProvider); + }); + + // Assert + mockTextWriter.Received(1).WriteLine(Arg.Is(s => s == null)); + } + + [Fact] + public async Task Should_Write_Empty_String_To_Output() + { + // Arrange + const string expectedText = ""; + var mockTextWriter = Substitute.For(); + var mockProvider = Substitute.For(); + mockProvider.GetTextWriter().Returns(mockTextWriter); + + var writeLine = new WriteLine(expectedText); + + // Act + await ActivityTestHelper.ExecuteActivityAsync(writeLine, services => + { + services.AddSingleton(mockProvider); + }); + + // Assert + mockTextWriter.Received(1).WriteLine(expectedText); + } + + [Fact] + public async Task Should_Use_Default_Provider_When_None_Configured() + { + // Arrange + const string expectedText = "Default provider test"; + var writeLine = new WriteLine(expectedText); + + // Act & Assert - Should not throw exception when no provider is configured + var exception = await Record.ExceptionAsync(async () => + await ActivityTestHelper.ExecuteActivityAsync(writeLine)); + + Assert.Null(exception); + } +}