using System.Threading; using System.Threading.Tasks; using AutoFixture; using Elsa.Expressions; using Elsa.Extensions; using Elsa.Models; using Elsa.Persistence; using Elsa.Results; using Elsa.Services; using Elsa.Services.Models; using Elsa.Testing.Shared.Autofixture; using MediatR; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging.Abstractions; using Moq; using NodaTime; using NodaTime.Testing; using Xunit; namespace Elsa.Core.UnitTests { public class WorkflowHostTests { private readonly WorkflowHost workflowHost; public WorkflowHostTests() { var fixture = new Fixture().Customize(new NodaTimeCustomization()); var workflowActivatorMock = new Mock(); var idGeneratorMock = new Mock(); var workflowRegistryMock = new Mock(); var workflowInstanceStoreMock = new Mock(); var workflowExpressionEvaluatorMock = new Mock(); var mediatorMock = new Mock(); var now = fixture.Create(); var fakeClock = new FakeClock(now); var logger = new NullLogger(); var serviceProvider = new ServiceCollection().BuildServiceProvider(); workflowHost = new WorkflowHost( workflowRegistryMock.Object, workflowInstanceStoreMock.Object, workflowActivatorMock.Object, workflowExpressionEvaluatorMock.Object, idGeneratorMock.Object, mediatorMock.Object, serviceProvider, logger); } [Fact(DisplayName = "Can run simple workflow to completed state.")] public async Task RunAsync01() { var activity = CreateActivity(); var workflow = CreateWorkflow(activity); var executionContext = await workflowHost.RunWorkflowAsync(workflow); Assert.Equal(WorkflowStatus.Completed, executionContext.CreateWorkflowInstance().Status); } [Fact(DisplayName = "Invokes returned activity execution result.")] public async Task RunAsync02() { var activityExecutionResultMock = new Mock(); var activity = CreateActivity(true, activityExecutionResultMock.Object); var workflow = CreateWorkflow(activity); var executionContext = await workflowHost.RunWorkflowAsync(workflow); activityExecutionResultMock .Verify(x => x.ExecuteAsync(It.IsAny(), It.IsAny()), Times.Once); } private IActivity CreateActivity(bool canExecute = true, IActivityExecutionResult? activityExecutionResult = null) { var activityMock = new Mock(); activityMock .Setup(x => x.CanExecuteAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(canExecute); if (activityExecutionResult != null) activityMock .Setup(x => x.ExecuteAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(activityExecutionResult); return activityMock.Object; } private Workflow CreateWorkflow(IActivity activity) { var workflow = new Workflow(); workflow.Activities.Add(activity); return workflow; } } }