< Summary

Information
Class: AsiBackbone.Core.CapabilityGrants.CapabilityGrantValidationResult
Assembly: AsiBackbone.Core
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/CapabilityGrants/CapabilityGrantValidationResult.cs
Line coverage
94%
Covered lines: 65
Uncovered lines: 4
Coverable lines: 69
Total lines: 137
Line coverage: 94.2%
Branch coverage
70%
Covered branches: 7
Total branches: 10
Branch coverage: 70%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%210%
.ctor(...)50%4491.67%
get_ShouldAllow()100%11100%
Valid(...)100%11100%
Failed(...)100%11100%
BuildSafeMetadata(...)50%22100%
AddIfPresent(...)100%22100%
NormalizeOptional(...)100%22100%

File(s)

/home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/CapabilityGrants/CapabilityGrantValidationResult.cs

#LineLine coverage
 1using System.Collections.ObjectModel;
 2using AsiBackbone.Core.Signing;
 3
 4namespace AsiBackbone.Core.CapabilityGrants;
 5
 6public sealed class CapabilityGrantValidationResult
 7{
 08    private static readonly IReadOnlyDictionary<string, string> EmptyMetadata =
 09        new ReadOnlyDictionary<string, string>(new Dictionary<string, string>(StringComparer.Ordinal));
 10
 7611    private CapabilityGrantValidationResult(
 7612        bool isValid,
 7613        CapabilityGrantValidationCategory category,
 7614        VerificationPolicyAction action,
 7615        string status,
 7616        string? failureCode,
 7617        string? failureMessage,
 7618        string tokenId,
 7619        IReadOnlyDictionary<string, string> safeMetadata)
 20    {
 7621        ArgumentException.ThrowIfNullOrWhiteSpace(status);
 7622        ArgumentException.ThrowIfNullOrWhiteSpace(tokenId);
 23
 7624        if (!Enum.IsDefined(category))
 25        {
 026            throw new ArgumentOutOfRangeException(nameof(category), category, "Validation category must be defined.");
 27        }
 28
 7629        if (!Enum.IsDefined(action))
 30        {
 031            throw new ArgumentOutOfRangeException(nameof(action), action, "Validation action must be defined.");
 32        }
 33
 7634        IsValid = isValid;
 7635        Category = category;
 7636        Action = action;
 7637        Status = status.Trim();
 7638        FailureCode = NormalizeOptional(failureCode);
 7639        FailureMessage = NormalizeOptional(failureMessage);
 7640        TokenId = tokenId.Trim();
 7641        SafeMetadata = safeMetadata;
 7642    }
 43
 44    public bool IsValid { get; }
 45
 46    public CapabilityGrantValidationCategory Category { get; }
 47
 48    public VerificationPolicyAction Action { get; }
 49
 6250    public bool ShouldAllow => Action is VerificationPolicyAction.Allow;
 51
 52    public string Status { get; }
 53
 54    public string? FailureCode { get; }
 55
 56    public string? FailureMessage { get; }
 57
 58    public string TokenId { get; }
 59
 60    public IReadOnlyDictionary<string, string> SafeMetadata { get; }
 61
 62    public static CapabilityGrantValidationResult Valid(CapabilityGrant grant)
 63    {
 1664        ArgumentNullException.ThrowIfNull(grant);
 65
 1566        return new CapabilityGrantValidationResult(
 1567            true,
 1568            CapabilityGrantValidationCategory.Valid,
 1569            VerificationPolicyAction.Allow,
 1570            "Valid",
 1571            null,
 1572            null,
 1573            grant.TokenId,
 1574            BuildSafeMetadata(grant, CapabilityGrantValidationCategory.Valid, VerificationPolicyAction.Allow, null));
 75    }
 76
 77    public static CapabilityGrantValidationResult Failed(
 78        CapabilityGrant grant,
 79        CapabilityGrantValidationCategory category,
 80        VerificationPolicyAction action,
 81        string failureCode,
 82        string? failureMessage = null)
 83    {
 6384        ArgumentNullException.ThrowIfNull(grant);
 6285        ArgumentException.ThrowIfNullOrWhiteSpace(failureCode);
 86
 6187        return new CapabilityGrantValidationResult(
 6188            false,
 6189            category,
 6190            action,
 6191            "Failed",
 6192            failureCode,
 6193            failureMessage,
 6194            grant.TokenId,
 6195            BuildSafeMetadata(grant, category, action, failureCode));
 96    }
 97
 98    private static IReadOnlyDictionary<string, string> BuildSafeMetadata(
 99        CapabilityGrant grant,
 100        CapabilityGrantValidationCategory category,
 101        VerificationPolicyAction action,
 102        string? failureCode)
 103    {
 76104        Dictionary<string, string> metadata = new(StringComparer.Ordinal)
 76105        {
 76106            ["audience"] = grant.Audience,
 76107            ["category"] = category.ToString(),
 76108            ["grant_id"] = grant.TokenId,
 76109            ["issuer"] = grant.Issuer,
 76110            ["policy_action"] = action.ToString()
 76111        };
 112
 76113        AddIfPresent(metadata, "acknowledgment_id", grant.AcknowledgmentId);
 76114        AddIfPresent(metadata, "failure_code", failureCode);
 76115        AddIfPresent(metadata, "handshake_id", grant.HandshakeId);
 76116        AddIfPresent(metadata, "policy_hash", grant.PolicyHash);
 76117        AddIfPresent(metadata, "policy_version", grant.PolicyVersion);
 76118        AddIfPresent(metadata, "resource_binding", grant.ResourceBinding);
 119
 76120        return metadata.Count == 0
 76121            ? EmptyMetadata
 76122            : new ReadOnlyDictionary<string, string>(metadata);
 123    }
 124
 125    private static void AddIfPresent(Dictionary<string, string> metadata, string key, string? value)
 126    {
 456127        if (!string.IsNullOrWhiteSpace(value))
 128        {
 313129            metadata[key] = value.Trim();
 130        }
 456131    }
 132
 133    private static string? NormalizeOptional(string? value)
 134    {
 152135        return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
 136    }
 137}