< Summary

Information
Class: Elsa.Workflows.Api.Endpoints.Tests.Activities.Endpoint
Assembly: Elsa.Workflows.Api
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Api/Endpoints/Tests/Activities/Endpoint.cs
Line coverage
23%
Covered lines: 7
Uncovered lines: 23
Coverable lines: 30
Total lines: 84
Line coverage: 23.3%
Branch coverage
0%
Covered branches: 0
Total branches: 6
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Configure()100%11100%
HandleAsync()0%4260%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Api/Endpoints/Tests/Activities/Endpoint.cs

#LineLine coverage
 1using Elsa.Authorization;
 2using Elsa.Abstractions;
 3using Elsa.Workflows.Management;
 4using Elsa.Workflows.Models;
 5using Elsa.Workflows.Runtime;
 6using Elsa.Workflows.State;
 7
 8namespace Elsa.Workflows.Api.Endpoints.Tests.Activities;
 9
 10/// <summary>
 11/// Represents an endpoint for testing activities in workflows. This endpoint is responsible for handling requests
 12/// that test the execution of a specific activity in a workflow and returning the results.
 13/// </summary>
 14/// <remarks>
 15/// This endpoint is used to perform operations such as:
 16/// - Finding a workflow graph based on a provided workflow definition handle.
 17/// - Locating and executing a specific activity within the workflow graph.
 18/// - Capturing the execution results and returning them as a response.
 19/// </remarks>
 320internal class Endpoint(
 321    IWorkflowDefinitionService workflowDefinitionService,
 322    IActivityTestRunner activityTestRunner,
 323    IActivityExecutionMapper activityExecutionMapper)
 24    : ElsaEndpoint<Request>
 25{
 26    /// <inheritdoc />
 27    public override void Configure()
 28    {
 329        Post("/tests/activities");
 330        RequirePermission(Elsa.Workflows.Api.Permissions.WorkflowPermissions.Tests, CoreVerbs.Execute);
 331    }
 32
 33    /// <inheritdoc />
 34    public override async Task HandleAsync(Request request, CancellationToken cancellationToken)
 35    {
 036        var workflowGraph = await workflowDefinitionService.FindWorkflowGraphAsync(request.WorkflowDefinitionHandle, can
 37
 038        if (workflowGraph == null)
 39        {
 040            AddError("Workflow definition not found.");
 041            await Send.ErrorsAsync(cancellation: cancellationToken);
 042            return;
 43        }
 44
 045        var activity = workflowGraph.FindActivity(request.ActivityHandle);
 46
 047        if (activity == null)
 48        {
 049            AddError("Activity not found.");
 050            await Send.ErrorsAsync(cancellation: cancellationToken);
 051            return;
 52        }
 53
 054        var activityExecutionContext = await activityTestRunner.RunAsync(workflowGraph, activity, cancellationToken);
 055        var record = await activityExecutionMapper.MapAsync(activityExecutionContext);
 056        var activityState = record.ActivityState ?? new Dictionary<string, object?>();
 57
 058        var response = new Response
 059        {
 060            ActivityState = activityState,
 061            Outputs = record.Outputs,
 062            Payload = record.Payload,
 063            Exception = record.Exception,
 064            Status = record.Status
 065        };
 66
 067        await Send.OkAsync(response, cancellationToken);
 068    }
 69}
 70
 71public class Request
 72{
 73    public WorkflowDefinitionHandle WorkflowDefinitionHandle { get; set; } = null!;
 74    public ActivityHandle ActivityHandle { get; set; } = null!;
 75}
 76
 77public class Response
 78{
 79    public IDictionary<string, object?> ActivityState { get; set; } = null!;
 80    public IDictionary<string, object?>? Outputs { get; set; }
 81    public IDictionary<string, object>? Payload { get; set; }
 82    public ExceptionState? Exception { get; set; }
 83    public ActivityStatus Status { get; set; }
 84}