diff --git a/src/WorkflowCore/Services/WorkflowExecutor.cs b/src/WorkflowCore/Services/WorkflowExecutor.cs index 145f02d41..5163ac4ba 100755 --- a/src/WorkflowCore/Services/WorkflowExecutor.cs +++ b/src/WorkflowCore/Services/WorkflowExecutor.cs @@ -221,6 +221,7 @@ private async Task DetermineNextExecutionTime(WorkflowInstance workflow, Workflo if (workflow.Status == WorkflowStatus.Complete) { + PublishWorkflowCompleted(workflow); return; } @@ -265,6 +266,11 @@ private async Task DetermineNextExecutionTime(WorkflowInstance workflow, Workflo await middlewareRunner.RunPostMiddleware(workflow, def); } + PublishWorkflowCompleted(workflow); + } + + private void PublishWorkflowCompleted(WorkflowInstance workflow) + { _publisher.PublishNotification(new WorkflowCompleted { EventTimeUtc = _datetimeProvider.UtcNow, diff --git a/test/WorkflowCore.UnitTests/Services/WorkflowExecutorFixture.cs b/test/WorkflowCore.UnitTests/Services/WorkflowExecutorFixture.cs index e548b8e88..9bd305f52 100644 --- a/test/WorkflowCore.UnitTests/Services/WorkflowExecutorFixture.cs +++ b/test/WorkflowCore.UnitTests/Services/WorkflowExecutorFixture.cs @@ -7,6 +7,7 @@ using FluentAssertions; using WorkflowCore.Interface; using WorkflowCore.Models; +using WorkflowCore.Models.LifeCycleEvents; using WorkflowCore.Services; using Xunit; @@ -403,6 +404,39 @@ public void should_process_cancellations() A.CallTo(() => CancellationProcessor.ProcessCancellations(instance, A.Ignored, A.Ignored)).MustHaveHappened(); } + [Fact(DisplayName = "Should send notification when workflow completes")] + public void should_send_notification_when_workflow_completes() + { + //arrange + var param = A.Fake(); + + // build a fake EndStep + WorkflowStep step1 = A.Fake(); + A.CallTo(() => step1.InitForExecution(A.Ignored, A.Ignored, + A.Ignored, A.Ignored)) + .Returns(ExecutionPipelineDirective.EndWorkflow); + + Given1StepWorkflow(step1, "Workflow", 1); + + var instance = new WorkflowInstance + { + WorkflowDefinitionId = "Workflow", + Version = 1, + Status = WorkflowStatus.Runnable, + NextExecution = 0, + Id = "001", + ExecutionPointers = new ExecutionPointerCollection(new List + { + new ExecutionPointer { Id = "1", Active = true, StepId = 0 } + }) + }; + + //act + Subject.Execute(instance); + + //assert + A.CallTo(() => EventHub.PublishNotification(A.Ignored)).MustHaveHappenedOnceExactly(); + } private void Given1StepWorkflow(WorkflowStep step1, string id, int version) {