diff --git a/src/modules/Elsa.Workflows.Core/Activities/Switch.cs b/src/modules/Elsa.Workflows.Core/Activities/Switch.cs index 1b94436d69..8d706ee237 100644 --- a/src/modules/Elsa.Workflows.Core/Activities/Switch.cs +++ b/src/modules/Elsa.Workflows.Core/Activities/Switch.cs @@ -112,7 +112,7 @@ private async Task> FindMatchingCasesAsync(ExpressionExe /// private async ValueTask OnChildActivityCompletedAsync(ActivityCompletedContext context) { - var scheduledActivityIds = context.TargetContext.GetProperty>("ScheduledActivityIds"); + var scheduledActivityIds = context.TargetContext.GetProperty>("ScheduledActivityIds"); if (scheduledActivityIds != null && scheduledActivityIds.Remove(context.ChildContext.Activity.Id) @@ -183,4 +183,4 @@ public SwitchCase(string label, Func condition, IActivity activity) : this /// The activity to schedule when the condition evaluates to true. /// public IActivity? Activity { get; set; } -} \ No newline at end of file +} diff --git a/test/unit/Elsa.Activities.UnitTests/Branching/SwitchTests.cs b/test/unit/Elsa.Activities.UnitTests/Branching/SwitchTests.cs index c0758bbe4a..ad5614548d 100644 --- a/test/unit/Elsa.Activities.UnitTests/Branching/SwitchTests.cs +++ b/test/unit/Elsa.Activities.UnitTests/Branching/SwitchTests.cs @@ -1,6 +1,7 @@ using Elsa.Expressions.Models; using Elsa.Testing.Shared; using Elsa.Workflows; +using Microsoft.Extensions.DependencyInjection; using NSubstitute; namespace Elsa.Activities.UnitTests.Branching; @@ -104,6 +105,32 @@ public async Task Should_Use_MatchFirst_As_Default_Mode() Assert.Equal(firstTrueActivity, scheduledActivities.First().Activity); } + [Fact] + public async Task Should_Complete_When_Scheduled_Activity_Ids_Are_Restored_As_List() + { + // Arrange + var childActivity = new WriteLine("Child") { Id = "child" }; + var switchActivity = new Switch + { + Cases = new List + { + new("True", Expression.LiteralExpression(true), childActivity) + } + }; + var fixture = new ActivityTestFixture(switchActivity) + .ConfigureServices(services => services.AddSingleton()); + var targetContext = await fixture.ExecuteAsync(); + var callbackEntry = targetContext.WorkflowExecutionContext.CompletionCallbacks.Single(); + var childContext = await targetContext.WorkflowExecutionContext.CreateActivityExecutionContextAsync(childActivity); + targetContext.SetProperty("ScheduledActivityIds", new List { childActivity.Id }); + + // Act + await callbackEntry.CompletionCallback!(new ActivityCompletedContext(targetContext, childContext)); + + // Assert + Assert.Equal(ActivityStatus.Completed, targetContext.Status); + } + [Theory] [InlineData(SwitchMode.MatchFirst)] [InlineData(SwitchMode.MatchAny)]