< Summary

Information
Class: Elsa.Platform.Integration.Steps.ImportWorkflowDefinitionStep
Assembly: Elsa.Platform.Integration
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Platform.Integration/Steps/ImportWorkflowDefinitionStep.cs
Line coverage
54%
Covered lines: 26
Uncovered lines: 22
Coverable lines: 48
Total lines: 97
Line coverage: 54.1%
Branch coverage
43%
Covered branches: 7
Total branches: 16
Branch coverage: 43.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_WorkflowDefinition()100%11100%
get_Path()100%11100%
get_Publish()100%11100%
ValidateAsync(...)50%34826.31%
ExecuteAsync()50%2278.57%
ResolveWorkflowJson()33.33%13642.85%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Platform.Integration/Steps/ImportWorkflowDefinitionStep.cs

#LineLine coverage
 1using System.Text.Json;
 2using Elsa.Platform.Integration.Models;
 3using Elsa.Platform.Integration.Services;
 4using Elsa.Workflows;
 5using Elsa.Workflows.Management;
 6using Elsa.Workflows.Management.Models;
 7using Loom;
 8
 9namespace Elsa.Platform.Integration.Steps;
 10
 11[Step("elsa.import-workflow-definition")]
 212public sealed class ImportWorkflowDefinitionStep(
 213    IWorkflowDefinitionImporter importer,
 214    IApiSerializer apiSerializer,
 215    PlatformRecipeArtifact artifact) : IStep, IValidatingStep
 16{
 517    public JsonElement WorkflowDefinition { get; init; }
 18
 219    public string? Path { get; init; }
 20
 321    public bool Publish { get; init; } = true;
 22
 23    public ValueTask<IReadOnlyList<RecipeDiagnostic>> ValidateAsync(
 24        StepValidationContext context,
 25        CancellationToken cancellationToken = default)
 26    {
 127        var hasInlineWorkflow = WorkflowDefinition.ValueKind == JsonValueKind.Object;
 128        var hasPath = !string.IsNullOrWhiteSpace(Path);
 129        if (!hasInlineWorkflow && !hasPath)
 30        {
 031            return ValueTask.FromResult<IReadOnlyList<RecipeDiagnostic>>(
 032            [
 033                context.Error(
 034                    "ELSA_PLATFORM_WORKFLOW_DEFINITION_MISSING",
 035                    "A workflow definition or artifact-relative path is required.",
 036                    context.Target("input.workflowDefinition"))
 037            ]);
 38        }
 39
 140        if (hasPath && !artifact.TryGetText(Path!, out _))
 41        {
 042            return ValueTask.FromResult<IReadOnlyList<RecipeDiagnostic>>(
 043            [
 044                context.Error(
 045                    "ELSA_PLATFORM_WORKFLOW_DEFINITION_FILE_MISSING",
 046                    $"Workflow definition file '{Path}' was not found in the recipe artifact.",
 047                    context.Target("input.path"))
 048            ]);
 49        }
 50
 151        return ValueTask.FromResult<IReadOnlyList<RecipeDiagnostic>>([]);
 52    }
 53
 54    public async ValueTask ExecuteAsync(StepContext context, CancellationToken cancellationToken = default)
 55    {
 156        var workflowJson = ResolveWorkflowJson();
 57        WorkflowDefinitionModel model;
 58        try
 59        {
 160            model = apiSerializer.Deserialize<WorkflowDefinitionModel>(workflowJson);
 161        }
 062        catch (Exception ex) when (ex is JsonException or NotSupportedException or InvalidOperationException)
 63        {
 064            throw new InvalidOperationException("Workflow definition payload is invalid.", ex);
 65        }
 66
 167        var importResult = await importer.ImportAsync(new SaveWorkflowDefinitionRequest
 168        {
 169            Model = model,
 170            Publish = Publish
 171        }, cancellationToken);
 72
 173        if (!importResult.Succeeded)
 74        {
 075            var errors = string.Join("; ", importResult.ValidationErrors.Select(x => x.Message));
 076            throw new InvalidOperationException($"Workflow definition validation failed: {errors}");
 77        }
 78
 179        context.Log($"Workflow definition '{model.DefinitionId}' was imported.");
 180    }
 81
 82    private string ResolveWorkflowJson()
 83    {
 184        if (!string.IsNullOrWhiteSpace(Path))
 85        {
 086            if (artifact.TryGetText(Path, out var content))
 087                return content;
 88
 089            throw new InvalidOperationException($"Workflow definition file '{Path}' was not found in the recipe artifact
 90        }
 91
 192        if (WorkflowDefinition.ValueKind == JsonValueKind.Object)
 193            return WorkflowDefinition.GetRawText();
 94
 095        throw new InvalidOperationException("A workflow definition or artifact-relative path is required.");
 96    }
 97}