< Summary

Information
Class: Elsa.AI.Host.Tools.Runtime.RuntimeToolBase
Assembly: Elsa.AI.Host
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Host/Tools/Runtime/RuntimeToolBase.cs
Line coverage
54%
Covered lines: 26
Uncovered lines: 22
Coverable lines: 48
Total lines: 83
Line coverage: 54.1%
Branch coverage
46%
Covered branches: 13
Total branches: 28
Branch coverage: 46.4%
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_Formatter()100%11100%
get_WorkflowInstanceStore()100%11100%
InstanceStoreUnavailable()100%210%
IsTenantAllowed(...)100%11100%
CreateInstanceFilter(...)64.28%321454.54%
FindAuthorizedInstanceAsync()0%4260%
GetDateTimeOffset(...)50%66100%
NormalizeTenant(...)50%22100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Host/Tools/Runtime/RuntimeToolBase.cs

#LineLine coverage
 1using Elsa.AI.Abstractions.Models;
 2using Elsa.AI.Host.Services;
 3using Elsa.AI.Host.Tools;
 4using Elsa.Common.Models;
 5using Elsa.Workflows;
 6using Elsa.Workflows.Management.Enums;
 7using Elsa.Workflows.Management;
 8using Elsa.Workflows.Management.Entities;
 9using Elsa.Workflows.Management.Filters;
 10using Elsa.Workflows.Management.Models;
 11
 12namespace Elsa.AI.Host.Tools.Runtime;
 13
 27014public abstract class RuntimeToolBase(IServiceProvider serviceProvider, AIGroundingResultFormatter formatter) : Groundin
 15{
 27116    protected AIGroundingResultFormatter Formatter { get; } = formatter;
 117    protected IWorkflowInstanceStore? WorkflowInstanceStore => serviceProvider.GetService(typeof(IWorkflowInstanceStore)
 18
 19    protected AIToolResult InstanceStoreUnavailable() =>
 020        Formatter.Unavailable("Workflow instance store");
 21
 22    protected static bool IsTenantAllowed(WorkflowInstance instance, string? tenantId) =>
 123        string.Equals(NormalizeTenant(instance.TenantId), NormalizeTenant(tenantId), StringComparison.Ordinal);
 24
 25    protected static WorkflowInstanceFilter CreateInstanceFilter(JsonObject arguments)
 26    {
 127        var filter = new WorkflowInstanceFilter
 128        {
 129            Id = GetString(arguments, "instanceId") ?? GetString(arguments, "id"),
 130            DefinitionId = GetString(arguments, "definitionId"),
 131            DefinitionVersionId = GetString(arguments, "definitionVersionId"),
 132            CorrelationId = GetString(arguments, "correlationId"),
 133            SearchTerm = GetString(arguments, "query") ?? GetString(arguments, "searchTerm"),
 134            HasIncidents = GetBool(arguments, "hasIncidents")
 135        };
 36
 137        if (Enum.TryParse<WorkflowStatus>(GetString(arguments, "status"), true, out var status))
 038            filter.WorkflowStatus = status;
 39
 140        if (Enum.TryParse<WorkflowSubStatus>(GetString(arguments, "subStatus"), true, out var subStatus))
 041            filter.WorkflowSubStatus = subStatus;
 42
 143        var from = GetDateTimeOffset(arguments, "from");
 144        var to = GetDateTimeOffset(arguments, "to");
 145        var timestampFilters = new List<TimestampFilter>();
 146        if (from != null)
 047            timestampFilters.Add(new TimestampFilter
 048            {
 049                Column = nameof(WorkflowInstance.UpdatedAt),
 050                Operator = TimestampFilterOperator.GreaterThanOrEqual,
 051                Timestamp = from.Value
 052            });
 153        if (to != null)
 054            timestampFilters.Add(new TimestampFilter
 055            {
 056                Column = nameof(WorkflowInstance.UpdatedAt),
 057                Operator = TimestampFilterOperator.LessThanOrEqual,
 058                Timestamp = to.Value
 059            });
 160        if (timestampFilters.Count > 0)
 061            filter.TimestampFilters = timestampFilters;
 62
 163        return filter;
 64    }
 65
 66    protected async ValueTask<WorkflowInstance?> FindAuthorizedInstanceAsync(JsonObject arguments, string? tenantId, Can
 67    {
 068        var store = WorkflowInstanceStore;
 069        if (store == null)
 070            return null;
 71
 072        var instance = await store.FindAsync(CreateInstanceFilter(arguments), cancellationToken);
 073        return instance != null && IsTenantAllowed(instance, tenantId) ? instance : null;
 074    }
 75
 76    private static DateTimeOffset? GetDateTimeOffset(JsonObject arguments, string name) =>
 277        arguments.TryGetPropertyValue(name, out var node) && node is JsonValue value && value.TryGetValue<DateTimeOffset
 278            ? result
 279            : null;
 80
 81    private static string NormalizeTenant(string? tenantId) =>
 282        string.IsNullOrWhiteSpace(tenantId) ? "" : tenantId;
 83}