< Summary

Information
Class: Elsa.Workflows.Models.ActivityOutputRegister
Assembly: Elsa.Workflows.Core
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Models/ActivityOutputRegister.cs
Line coverage
93%
Covered lines: 29
Uncovered lines: 2
Coverable lines: 31
Total lines: 101
Line coverage: 93.5%
Branch coverage
75%
Covered branches: 18
Total branches: 24
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
Record(...)100%210%
Record(...)75%1212100%
FindMany(...)50%22100%
FindOutputByActivityId(...)50%44100%
FindOutputByActivityInstanceId(...)100%22100%
CreateActivityIdLookupKey(...)100%22100%
CreateActivityInstanceIdLookupKey(...)50%22100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Models/ActivityOutputRegister.cs

#LineLine coverage
 1namespace Elsa.Workflows.Models;
 2
 3/// <summary>
 4/// Stores activity output.
 5/// </summary>
 6public class ActivityOutputRegister
 7{
 6218    private readonly Dictionary<string, List<ActivityOutputRecord>> _recordsByActivityIdAndOutputName = new();
 6219    private readonly Dictionary<string, ActivityOutputRecord> _recordsByActivityInstanceIdAndOutputName = new();
 10
 11    /// <summary>
 12    /// The default output name.
 13    /// </summary>
 14    public const string DefaultOutputName = "Result";
 15
 16    /// <summary>
 17    /// Records an activity's output.
 18    /// </summary>
 19    /// <param name="activityExecutionContext">The activity execution context.</param>
 20    /// <param name="outputValue">The output value.</param>
 21    public void Record(ActivityExecutionContext activityExecutionContext, object? outputValue)
 22    {
 023        Record(activityExecutionContext, null, outputValue);
 024    }
 25
 26    /// <summary>
 27    /// Records an activity's output.
 28    /// </summary>
 29    /// <param name="activityExecutionContext">The activity execution context.</param>
 30    /// <param name="outputName">The name of the output. Defaults to "Result"</param>
 31    /// <param name="outputValue">The output value.</param>
 32    public void Record(ActivityExecutionContext activityExecutionContext, string? outputName, object? outputValue)
 33    {
 173034        var activityId = activityExecutionContext.Activity.Id;
 173035        var activityInstanceId = activityExecutionContext.Id;
 173036        var containerId = activityExecutionContext.ParentActivityExecutionContext?.Id ?? activityExecutionContext.Workfl
 37
 173038        outputName ??= DefaultOutputName;
 39
 40        // Inspect the output descriptor to see if the specified output name matches any PropertyInfo's name.
 41        // If so, use that descriptor's name instead.
 882242        var outputDescriptor = activityExecutionContext.ActivityDescriptor.Outputs.FirstOrDefault(x => x.PropertyInfo?.N
 43
 173044        if (outputDescriptor != null)
 171945            outputName = outputDescriptor.Name;
 46
 173047        var record = new ActivityOutputRecord(containerId, activityId, activityInstanceId, outputName, outputValue);
 48
 173049        _recordsByActivityInstanceIdAndOutputName[CreateActivityInstanceIdLookupKey(activityInstanceId, outputName)] = r
 50
 173051        var scopedRecordsKey = CreateActivityIdLookupKey(activityId, outputName);
 52
 173053        if (!_recordsByActivityIdAndOutputName.TryGetValue(scopedRecordsKey, out var scopedRecords))
 54        {
 169555            scopedRecords = new();
 169556            _recordsByActivityIdAndOutputName[scopedRecordsKey] = scopedRecords;
 57        }
 58
 173059        scopedRecords.Add(record);
 173060    }
 61
 62    /// <summary>
 63    ///  Finds all output records for the specified activity ID and output name.
 64    /// </summary>
 65    public IEnumerable<ActivityOutputRecord> FindMany(string activityId, string? outputName = null)
 66    {
 167        var key = CreateActivityIdLookupKey(activityId, outputName);
 168        return _recordsByActivityIdAndOutputName.TryGetValue(key, out var records) ? records : Enumerable.Empty<Activity
 69    }
 70
 71    /// <summary>
 72    /// Gets the output value for the specified activity ID.
 73    /// </summary>
 74    /// <param name="activityId">The activity ID.</param>
 75    /// <param name="outputName">Name of the output.</param>
 76    /// <returns>The output value.</returns>
 77    public object? FindOutputByActivityId(string activityId, string? outputName = null)
 78    {
 1479        var key = CreateActivityIdLookupKey(activityId, outputName);
 1480        return !_recordsByActivityIdAndOutputName.TryGetValue(key, out var records)
 1481            ? null
 1482            : records.LastOrDefault()?.Value; // Always return the last value.
 83    }
 84
 85    /// <summary>
 86    /// Gets the output value for the specified activity instance ID.
 87    /// </summary>
 88    /// <param name="activityInstanceId">The activity instance ID.</param>
 89    /// <param name="outputName"></param>
 90    /// <returns>The output value.</returns>
 91    public object? FindOutputByActivityInstanceId(string activityInstanceId, string? outputName = null)
 92    {
 219193        var key = CreateActivityInstanceIdLookupKey(activityInstanceId, outputName);
 219194        return !_recordsByActivityInstanceIdAndOutputName.TryGetValue(key, out var record)
 219195            ? null
 219196            : record.Value;
 97    }
 98
 174599    private string CreateActivityIdLookupKey(string activityId, string? outputName) => $"{activityId}:{outputName ?? Def
 3921100    private string CreateActivityInstanceIdLookupKey(string activityInstanceId, string? outputName) => $"{activityInstan
 101}