< Summary

Information
Class: Elsa.Connections.Models.CredentialMaterial
Assembly: Elsa.Connections
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Connections/Models/CredentialMaterial.cs
Line coverage
80%
Covered lines: 4
Uncovered lines: 1
Coverable lines: 5
Total lines: 94
Line coverage: 80%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
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_AccessToken()100%11100%
get_RefreshToken()100%11100%
get_AccessTokenExpiresAt()100%11100%
ToString()100%210%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Connections/Models/CredentialMaterial.cs

#LineLine coverage
 1using System.Text.Json;
 2using System.Text.Json.Serialization;
 3
 4namespace Elsa.Connections.Models;
 5
 6public enum ConnectionCredentialKind
 7{
 8    OAuth = 0,
 9    ApiKey = 1
 10}
 11
 12/// <summary>Token material is serialized into the encrypted Secrets value and must remain short-lived in memory.</summa
 5913public sealed class CredentialMaterial(string accessToken, string refreshToken, DateTimeOffset accessTokenExpiresAt)
 14{
 15    [JsonIgnore]
 16416    public string AccessToken { get; } = accessToken;
 17
 18    [JsonIgnore]
 17719    public string RefreshToken { get; } = refreshToken;
 20
 21    [JsonIgnore]
 20022    public DateTimeOffset AccessTokenExpiresAt { get; } = accessTokenExpiresAt;
 23
 024    public override string ToString() => "CredentialMaterial { Redacted = true }";
 25}
 26
 27/// <summary>Credential handed to an authorized consumer. Refresh material remains inside lifecycle management.</summary
 28[JsonConverter(typeof(ConnectionAccessCredentialJsonConverter))]
 29public sealed class ConnectionAccessCredential
 30{
 31    private readonly DateTimeOffset? _expiresAt;
 32
 33    [JsonIgnore]
 34    public string AccessToken { get; }
 35
 36    [JsonIgnore]
 37    public string? ApiKey { get; }
 38
 39    public ConnectionCredentialKind Kind { get; }
 40
 41    /// <summary>Gets the OAuth expiry. API-key credentials are explicitly non-expiring and have no expiry value.</summa
 42    public DateTimeOffset ExpiresAt => _expiresAt ?? throw new InvalidOperationException("API-key credentials do not hav
 43
 44    public ConnectionAccessCredential(string accessToken, DateTimeOffset expiresAt)
 45        : this(ConnectionCredentialKind.OAuth, accessToken, expiresAt)
 46    {
 47    }
 48
 49    public ConnectionAccessCredential(ConnectionCredentialKind kind, string value, DateTimeOffset? expiresAt)
 50    {
 51        if (string.IsNullOrWhiteSpace(value))
 52        {
 53            throw new ArgumentException("Credential value is required.", nameof(value));
 54        }
 55
 56        if (kind == ConnectionCredentialKind.OAuth && !expiresAt.HasValue)
 57        {
 58            throw new ArgumentException("OAuth credentials require an expiry.", nameof(expiresAt));
 59        }
 60
 61        if (kind == ConnectionCredentialKind.ApiKey && expiresAt.HasValue)
 62        {
 63            throw new ArgumentException("API-key credentials do not have an expiry.", nameof(expiresAt));
 64        }
 65
 66        Kind = kind;
 67        AccessToken = value;
 68        ApiKey = kind == ConnectionCredentialKind.ApiKey ? value : null;
 69        _expiresAt = expiresAt;
 70    }
 71
 72    public override string ToString() => "ConnectionAccessCredential { Redacted = true }";
 73}
 74
 75internal sealed class ConnectionAccessCredentialJsonConverter : JsonConverter<ConnectionAccessCredential>
 76{
 77    public override ConnectionAccessCredential Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions
 78        throw new JsonException("Connection access credentials are write-only.");
 79
 80    public override void Write(Utf8JsonWriter writer, ConnectionAccessCredential value, JsonSerializerOptions options)
 81    {
 82        writer.WriteStartObject();
 83        writer.WriteNumber(GetName(nameof(ConnectionAccessCredential.Kind)), (int)value.Kind);
 84
 85        if (value.Kind == ConnectionCredentialKind.OAuth)
 86        {
 87            writer.WriteString(GetName(nameof(ConnectionAccessCredential.ExpiresAt)), value.ExpiresAt);
 88        }
 89
 90        writer.WriteEndObject();
 91
 92        string GetName(string name) => options.PropertyNamingPolicy?.ConvertName(name) ?? name;
 93    }
 94}