< Summary

Information
Class: Elsa.Secrets.Repositories.InMemorySecretRepository
Assembly: Elsa.Secrets
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Secrets/Repositories/InMemorySecretRepository.cs
Line coverage
97%
Covered lines: 42
Uncovered lines: 1
Coverable lines: 43
Total lines: 85
Line coverage: 97.6%
Branch coverage
90%
Covered branches: 9
Total branches: 10
Branch coverage: 90%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
GetAsync(...)100%22100%
ListAsync(...)100%11100%
AddAsync(...)50%2266.66%
TryAddOrReplaceDeletedAsync(...)100%66100%
SaveAsync(...)100%11100%
Clone(...)100%11100%
Clone(...)100%11100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Secrets/Repositories/InMemorySecretRepository.cs

#LineLine coverage
 1using System.Collections.Concurrent;
 2
 3namespace Elsa.Secrets.Repositories;
 4
 5public class InMemorySecretRepository : ISecretRepository
 6{
 327    private readonly ConcurrentDictionary<string, Secret> _secrets = new(StringComparer.OrdinalIgnoreCase);
 8
 9    public Task<Secret?> GetAsync(string normalizedName, CancellationToken cancellationToken = default)
 10    {
 2611        _secrets.TryGetValue(normalizedName, out var secret);
 2612        return Task.FromResult(secret == null ? null : Clone(secret));
 13    }
 14
 15    public Task<IReadOnlyCollection<Secret>> ListAsync(CancellationToken cancellationToken = default)
 16    {
 317        return Task.FromResult<IReadOnlyCollection<Secret>>(_secrets.Values.Select(Clone).ToList());
 18    }
 19
 20    public Task AddAsync(Secret secret, CancellationToken cancellationToken = default)
 21    {
 122        if (!_secrets.TryAdd(secret.Name, Clone(secret)))
 023            throw new InvalidOperationException($"A secret named '{secret.Name}' already exists.");
 24
 125        return Task.CompletedTask;
 26    }
 27
 28    public Task<bool> TryAddOrReplaceDeletedAsync(Secret secret, CancellationToken cancellationToken = default)
 29    {
 2830        var secretClone = Clone(secret);
 31
 32        while (true)
 33        {
 2834            if (!_secrets.TryGetValue(secret.Name, out var existingSecret))
 2435                return Task.FromResult(_secrets.TryAdd(secret.Name, secretClone));
 36
 437            if (existingSecret.Status != SecretStatus.Deleted)
 238                return Task.FromResult(false);
 39
 240            if (_secrets.TryUpdate(secret.Name, secretClone, existingSecret))
 241                return Task.FromResult(true);
 42        }
 43    }
 44
 45    public Task SaveAsync(Secret secret, CancellationToken cancellationToken = default)
 46    {
 1047        _secrets[secret.Name] = Clone(secret);
 1048        return Task.CompletedTask;
 49    }
 50
 51    private static Secret Clone(Secret secret)
 52    {
 7453        return new Secret
 7454        {
 7455            Id = secret.Id,
 7456            Name = secret.Name,
 7457            DisplayName = secret.DisplayName,
 7458            Description = secret.Description,
 7459            TypeName = secret.TypeName,
 7460            StoreName = secret.StoreName,
 7461            Scope = secret.Scope,
 7462            Tags = secret.Tags.ToHashSet(StringComparer.OrdinalIgnoreCase),
 7463            Status = secret.Status,
 7464            CreatedAt = secret.CreatedAt,
 7465            UpdatedAt = secret.UpdatedAt,
 7466            Versions = secret.Versions.Select(Clone).ToList()
 7467        };
 68    }
 69
 70    private static SecretVersion Clone(SecretVersion version)
 71    {
 7972        return new SecretVersion
 7973        {
 7974            Version = version.Version,
 7975            Status = version.Status,
 7976            CreatedAt = version.CreatedAt,
 7977            ExpiresAt = version.ExpiresAt,
 7978            Payload = new SecretPayload
 7979            {
 7980                Value = version.Payload.Value,
 7981                Metadata = new Dictionary<string, string>(version.Payload.Metadata, StringComparer.OrdinalIgnoreCase)
 7982            }
 7983        };
 84    }
 85}