< 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
87%
Covered lines: 27
Uncovered lines: 4
Coverable lines: 31
Total lines: 101
Line coverage: 87%
Branch coverage
70%
Covered branches: 17
Total branches: 24
Branch coverage: 70.8%
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(...)0%620%
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{
 5908    private readonly Dictionary<string, List<ActivityOutputRecord>> _recordsByActivityIdAndOutputName = new();
 5909    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    {
 171934        var activityId = activityExecutionContext.Activity.Id;
 171935        var activityInstanceId = activityExecutionContext.Id;
 171936        var containerId = activityExecutionContext.ParentActivityExecutionContext?.Id ?? activityExecutionContext.Workfl
 37
 171938        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.
 886842        var outputDescriptor = activityExecutionContext.ActivityDescriptor.Outputs.FirstOrDefault(x => x.PropertyInfo?.N
 43
 171944        if (outputDescriptor != null)
 171245            outputName = outputDescriptor.Name;
 46
 171947        var record = new ActivityOutputRecord(containerId, activityId, activityInstanceId, outputName, outputValue);
 48
 171949        _recordsByActivityInstanceIdAndOutputName[CreateActivityInstanceIdLookupKey(activityInstanceId, outputName)] = r
 50
 171951        var scopedRecordsKey = CreateActivityIdLookupKey(activityId, outputName);
 52
 171953        if (!_recordsByActivityIdAndOutputName.TryGetValue(scopedRecordsKey, out var scopedRecords))
 54        {
 169155            scopedRecords = new();
 169156            _recordsByActivityIdAndOutputName[scopedRecordsKey] = scopedRecords;
 57        }
 58
 171959        scopedRecords.Add(record);
 171960    }
 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    {
 067        var key = CreateActivityIdLookupKey(activityId, outputName);
 068        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    {
 1179        var key = CreateActivityIdLookupKey(activityId, outputName);
 1180        return !_recordsByActivityIdAndOutputName.TryGetValue(key, out var records)
 1181            ? null
 1182            : 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    {
 214493        var key = CreateActivityInstanceIdLookupKey(activityInstanceId, outputName);
 214494        return !_recordsByActivityInstanceIdAndOutputName.TryGetValue(key, out var record)
 214495            ? null
 214496            : record.Value;
 97    }
 98
 173099    private string CreateActivityIdLookupKey(string activityId, string? outputName) => $"{activityId}:{outputName ?? Def
 3863100    private string CreateActivityInstanceIdLookupKey(string activityInstanceId, string? outputName) => $"{activityInstan
 101}