< Summary

Information
Class: Elsa.Connections.Models.ConnectionAccessCredentialJsonConverter
Assembly: Elsa.Connections
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Connections/Models/CredentialMaterial.cs
Line coverage
87%
Covered lines: 7
Uncovered lines: 1
Coverable lines: 8
Total lines: 94
Line coverage: 87.5%
Branch coverage
83%
Covered branches: 5
Total branches: 6
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Read(...)100%210%
Write(...)100%22100%
GetName()75%44100%

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
 13public sealed class CredentialMaterial(string accessToken, string refreshToken, DateTimeOffset accessTokenExpiresAt)
 14{
 15    [JsonIgnore]
 16    public string AccessToken { get; } = accessToken;
 17
 18    [JsonIgnore]
 19    public string RefreshToken { get; } = refreshToken;
 20
 21    [JsonIgnore]
 22    public DateTimeOffset AccessTokenExpiresAt { get; } = accessTokenExpiresAt;
 23
 24    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
 078        throw new JsonException("Connection access credentials are write-only.");
 79
 80    public override void Write(Utf8JsonWriter writer, ConnectionAccessCredential value, JsonSerializerOptions options)
 81    {
 1082        writer.WriteStartObject();
 1083        writer.WriteNumber(GetName(nameof(ConnectionAccessCredential.Kind)), (int)value.Kind);
 84
 1085        if (value.Kind == ConnectionCredentialKind.OAuth)
 86        {
 887            writer.WriteString(GetName(nameof(ConnectionAccessCredential.ExpiresAt)), value.ExpiresAt);
 88        }
 89
 1090        writer.WriteEndObject();
 91
 1892        string GetName(string name) => options.PropertyNamingPolicy?.ConvertName(name) ?? name;
 1093    }
 94}