From 2ff1693cd5574c7e859e6e12dc3ee90ca9442039 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 24 Dec 2025 23:47:55 +0000 Subject: [PATCH] Replace flaky Task.Delay with TaskCompletionSource for deterministic test synchronization - Added TaskCompletionSource fields to Spy class for each notification type - Test handlers now signal completion through TaskCompletionSource - Tests await TaskCompletionSource instead of arbitrary delays - Eliminates timing-dependent flakiness in CI systems Co-authored-by: KnibbsyMan <23156317+KnibbsyMan@users.noreply.github.com> --- .../WorkflowDispatchNotifications/Spy.cs | 15 +++++++++++++++ .../WorkflowDispatchNotifications/TestHandler.cs | 4 ++++ .../WorkflowDispatchNotifications/Tests.cs | 10 ++++++---- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/WorkflowDispatchNotifications/Spy.cs b/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/WorkflowDispatchNotifications/Spy.cs index fbe7c2b99..d94592bc0 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/WorkflowDispatchNotifications/Spy.cs +++ b/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/WorkflowDispatchNotifications/Spy.cs @@ -5,6 +5,11 @@ namespace Elsa.Workflows.IntegrationTests.Scenarios.WorkflowDispatchNotification public class Spy { + private readonly TaskCompletionSource _workflowDefinitionDispatchingTcs = new(); + private readonly TaskCompletionSource _workflowDefinitionDispatchedTcs = new(); + private readonly TaskCompletionSource _workflowInstanceDispatchingTcs = new(); + private readonly TaskCompletionSource _workflowInstanceDispatchedTcs = new(); + public bool WorkflowDefinitionDispatchingWasCalled { get; set; } public bool WorkflowDefinitionDispatchedWasCalled { get; set; } public bool WorkflowInstanceDispatchingWasCalled { get; set; } @@ -13,4 +18,14 @@ public class Spy public DispatchWorkflowDefinitionRequest? CapturedDefinitionRequest { get; set; } public DispatchWorkflowInstanceRequest? CapturedInstanceRequest { get; set; } public DispatchWorkflowResponse? CapturedResponse { get; set; } + + public Task WaitForWorkflowDefinitionDispatchingAsync() => _workflowDefinitionDispatchingTcs.Task; + public Task WaitForWorkflowDefinitionDispatchedAsync() => _workflowDefinitionDispatchedTcs.Task; + public Task WaitForWorkflowInstanceDispatchingAsync() => _workflowInstanceDispatchingTcs.Task; + public Task WaitForWorkflowInstanceDispatchedAsync() => _workflowInstanceDispatchedTcs.Task; + + public void SignalWorkflowDefinitionDispatching() => _workflowDefinitionDispatchingTcs.TrySetResult(true); + public void SignalWorkflowDefinitionDispatched() => _workflowDefinitionDispatchedTcs.TrySetResult(true); + public void SignalWorkflowInstanceDispatching() => _workflowInstanceDispatchingTcs.TrySetResult(true); + public void SignalWorkflowInstanceDispatched() => _workflowInstanceDispatchedTcs.TrySetResult(true); } diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/WorkflowDispatchNotifications/TestHandler.cs b/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/WorkflowDispatchNotifications/TestHandler.cs index f2ede80cd..9d90a4227 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/WorkflowDispatchNotifications/TestHandler.cs +++ b/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/WorkflowDispatchNotifications/TestHandler.cs @@ -20,6 +20,7 @@ public class TestHandler : { _spy.WorkflowDefinitionDispatchingWasCalled = true; _spy.CapturedDefinitionRequest = notification.Request; + _spy.SignalWorkflowDefinitionDispatching(); return Task.CompletedTask; } @@ -27,6 +28,7 @@ public class TestHandler : { _spy.WorkflowDefinitionDispatchedWasCalled = true; _spy.CapturedResponse = notification.Response; + _spy.SignalWorkflowDefinitionDispatched(); return Task.CompletedTask; } @@ -34,6 +36,7 @@ public class TestHandler : { _spy.WorkflowInstanceDispatchingWasCalled = true; _spy.CapturedInstanceRequest = notification.Request; + _spy.SignalWorkflowInstanceDispatching(); return Task.CompletedTask; } @@ -41,6 +44,7 @@ public class TestHandler : { _spy.WorkflowInstanceDispatchedWasCalled = true; _spy.CapturedResponse = notification.Response; + _spy.SignalWorkflowInstanceDispatched(); return Task.CompletedTask; } } diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/WorkflowDispatchNotifications/Tests.cs b/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/WorkflowDispatchNotifications/Tests.cs index d05f3b656..f92bd1cbb 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/WorkflowDispatchNotifications/Tests.cs +++ b/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/WorkflowDispatchNotifications/Tests.cs @@ -43,8 +43,9 @@ public class Tests // Act await _workflowDispatcher.DispatchAsync(request, null); - // Allow async notification handlers to complete - await Task.Delay(100); + // Wait for notification handlers to complete + await _spy.WaitForWorkflowDefinitionDispatchingAsync(); + await _spy.WaitForWorkflowDefinitionDispatchedAsync(); // Assert Assert.True(_spy.WorkflowDefinitionDispatchingWasCalled, "WorkflowDefinitionDispatching notification should be called"); @@ -70,8 +71,9 @@ public class Tests // Act await _workflowDispatcher.DispatchAsync(request, null); - // Allow async notification handlers to complete - await Task.Delay(100); + // Wait for notification handlers to complete + await _spy.WaitForWorkflowInstanceDispatchingAsync(); + await _spy.WaitForWorkflowInstanceDispatchedAsync(); // Assert Assert.True(_spy.WorkflowInstanceDispatchingWasCalled, "WorkflowInstanceDispatching notification should be called");