using JdeScoping.DataSync.Etl.Results; using Shouldly; namespace JdeScoping.DataSync.Tests.Etl.Results; public class PipelineResultTests { [Fact] public void Succeeded_Creates_Result_With_Success_True() { // Arrange var steps = new List { new("ExtractStep", "Extract", 100, TimeSpan.FromSeconds(1)), new("TransformStep", "Transform", 100, TimeSpan.FromSeconds(2)), new("LoadStep", "Load", 100, TimeSpan.FromSeconds(3)) }; var elapsed = TimeSpan.FromSeconds(6); // Act var result = PipelineResult.Succeeded(100, elapsed, steps); // Assert result.Success.ShouldBeTrue(); result.TotalRows.ShouldBe(100); result.Elapsed.ShouldBe(elapsed); result.Steps.ShouldBe(steps); result.Error.ShouldBeNull(); } [Fact] public void Succeeded_With_Empty_Steps_Creates_Valid_Result() { // Arrange var steps = Array.Empty(); var elapsed = TimeSpan.Zero; // Act var result = PipelineResult.Succeeded(0, elapsed, steps); // Assert result.Success.ShouldBeTrue(); result.TotalRows.ShouldBe(0); result.Elapsed.ShouldBe(TimeSpan.Zero); result.Steps.ShouldBeEmpty(); result.Error.ShouldBeNull(); } [Fact] public void Failed_Creates_Result_With_Success_False() { // Arrange var steps = new List { new("ExtractStep", "Extract", 50, TimeSpan.FromSeconds(1)) }; var elapsed = TimeSpan.FromSeconds(1); var error = new InvalidOperationException("Pipeline failed during transform"); // Act var result = PipelineResult.Failed(50, elapsed, steps, error); // Assert result.Success.ShouldBeFalse(); result.TotalRows.ShouldBe(50); result.Elapsed.ShouldBe(elapsed); result.Steps.ShouldBe(steps); result.Error.ShouldBe(error); } [Fact] public void Failed_Preserves_Error_Details() { // Arrange var innerException = new TimeoutException("Database timeout"); var error = new InvalidOperationException("Pipeline failed", innerException); var steps = Array.Empty(); // Act var result = PipelineResult.Failed(0, TimeSpan.FromSeconds(30), steps, error); // Assert result.Error.ShouldNotBeNull(); result.Error.Message.ShouldBe("Pipeline failed"); result.Error.InnerException.ShouldBe(innerException); } [Fact] public void StepResult_Stores_All_Properties_Correctly() { // Arrange & Act var stepResult = new StepResult("MyStep", "Transform", 500, TimeSpan.FromMilliseconds(250)); // Assert stepResult.StepName.ShouldBe("MyStep"); stepResult.StepType.ShouldBe("Transform"); stepResult.RowsAffected.ShouldBe(500); stepResult.Elapsed.ShouldBe(TimeSpan.FromMilliseconds(250)); } [Fact] public void DestinationResult_Stores_All_Properties_Correctly() { // Arrange & Act var destResult = new DestinationResult(1000, 10, TimeSpan.FromSeconds(5)); // Assert destResult.RowsProcessed.ShouldBe(1000); destResult.BatchCount.ShouldBe(10); destResult.Elapsed.ShouldBe(TimeSpan.FromSeconds(5)); } [Fact] public void PipelineResult_Records_Are_Equal_When_Properties_Match() { // Arrange var steps = new List { new("Step1", "Extract", 100, TimeSpan.FromSeconds(1)) }; var elapsed = TimeSpan.FromSeconds(1); // Act var result1 = PipelineResult.Succeeded(100, elapsed, steps); var result2 = PipelineResult.Succeeded(100, elapsed, steps); // Assert result1.ShouldBe(result2); } [Fact] public void StepResult_Records_Are_Equal_When_Properties_Match() { // Arrange & Act var step1 = new StepResult("Step", "Load", 100, TimeSpan.FromSeconds(1)); var step2 = new StepResult("Step", "Load", 100, TimeSpan.FromSeconds(1)); // Assert step1.ShouldBe(step2); } [Fact] public void DestinationResult_Records_Are_Equal_When_Properties_Match() { // Arrange & Act var dest1 = new DestinationResult(500, 5, TimeSpan.FromSeconds(2)); var dest2 = new DestinationResult(500, 5, TimeSpan.FromSeconds(2)); // Assert dest1.ShouldBe(dest2); } }