< Summary

Information
Class: AsiBackbone.Core.CapabilityTokens.CapabilityGrantValidationResult
Assembly: AsiBackbone.Core
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/CapabilityTokens/CapabilityGrantValidationResult.cs
Line coverage
94%
Covered lines: 73
Uncovered lines: 4
Coverable lines: 77
Total lines: 137
Line coverage: 94.8%
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.66%
get_IsValid()100%11100%
get_Category()100%11100%
get_Action()100%11100%
get_ShouldAllow()100%11100%
get_Status()100%11100%
get_FailureCode()100%11100%
get_FailureMessage()100%11100%
get_TokenId()100%11100%
get_SafeMetadata()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/CapabilityTokens/CapabilityGrantValidationResult.cs

#LineLine coverage
 1using System.Collections.ObjectModel;
 2using AsiBackbone.Core.Signing;
 3
 4namespace AsiBackbone.Core.CapabilityTokens;
 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
 3611    private CapabilityGrantValidationResult(
 3612        bool isValid,
 3613        CapabilityTokenValidationCategory category,
 3614        VerificationPolicyAction action,
 3615        string status,
 3616        string? failureCode,
 3617        string? failureMessage,
 3618        string tokenId,
 3619        IReadOnlyDictionary<string, string> safeMetadata)
 20    {
 3621        ArgumentException.ThrowIfNullOrWhiteSpace(status);
 3622        ArgumentException.ThrowIfNullOrWhiteSpace(tokenId);
 23
 3624        if (!Enum.IsDefined(category))
 25        {
 026            throw new ArgumentOutOfRangeException(nameof(category), category, "Validation category must be defined.");
 27        }
 28
 3629        if (!Enum.IsDefined(action))
 30        {
 031            throw new ArgumentOutOfRangeException(nameof(action), action, "Validation action must be defined.");
 32        }
 33
 3634        IsValid = isValid;
 3635        Category = category;
 3636        Action = action;
 3637        Status = status.Trim();
 3638        FailureCode = NormalizeOptional(failureCode);
 3639        FailureMessage = NormalizeOptional(failureMessage);
 3640        TokenId = tokenId.Trim();
 3641        SafeMetadata = safeMetadata;
 3642    }
 43
 3544    public bool IsValid { get; }
 45
 3446    public CapabilityTokenValidationCategory Category { get; }
 47
 6548    public VerificationPolicyAction Action { get; }
 49
 3150    public bool ShouldAllow => Action is VerificationPolicyAction.Allow;
 51
 252    public string Status { get; }
 53
 2954    public string? FailureCode { get; }
 55
 456    public string? FailureMessage { get; }
 57
 158    public string TokenId { get; }
 59
 1160    public IReadOnlyDictionary<string, string> SafeMetadata { get; }
 61
 62    public static CapabilityGrantValidationResult Valid(CapabilityTokenGrant grant)
 63    {
 564        ArgumentNullException.ThrowIfNull(grant);
 65
 466        return new CapabilityGrantValidationResult(
 467            true,
 468            CapabilityTokenValidationCategory.Valid,
 469            VerificationPolicyAction.Allow,
 470            "Valid",
 471            null,
 472            null,
 473            grant.TokenId,
 474            BuildSafeMetadata(grant, CapabilityTokenValidationCategory.Valid, VerificationPolicyAction.Allow, null));
 75    }
 76
 77    public static CapabilityGrantValidationResult Failed(
 78        CapabilityTokenGrant grant,
 79        CapabilityTokenValidationCategory category,
 80        VerificationPolicyAction action,
 81        string failureCode,
 82        string? failureMessage = null)
 83    {
 3484        ArgumentNullException.ThrowIfNull(grant);
 3385        ArgumentException.ThrowIfNullOrWhiteSpace(failureCode);
 86
 3287        return new CapabilityGrantValidationResult(
 3288            false,
 3289            category,
 3290            action,
 3291            "Failed",
 3292            failureCode,
 3293            failureMessage,
 3294            grant.TokenId,
 3295            BuildSafeMetadata(grant, category, action, failureCode));
 96    }
 97
 98    private static IReadOnlyDictionary<string, string> BuildSafeMetadata(
 99        CapabilityTokenGrant grant,
 100        CapabilityTokenValidationCategory category,
 101        VerificationPolicyAction action,
 102        string? failureCode)
 103    {
 36104        Dictionary<string, string> metadata = new(StringComparer.Ordinal)
 36105        {
 36106            ["audience"] = grant.Audience,
 36107            ["category"] = category.ToString(),
 36108            ["grant_id"] = grant.TokenId,
 36109            ["issuer"] = grant.Issuer,
 36110            ["policy_action"] = action.ToString()
 36111        };
 112
 36113        AddIfPresent(metadata, "acknowledgment_id", grant.AcknowledgmentId);
 36114        AddIfPresent(metadata, "failure_code", failureCode);
 36115        AddIfPresent(metadata, "handshake_id", grant.HandshakeId);
 36116        AddIfPresent(metadata, "policy_hash", grant.PolicyHash);
 36117        AddIfPresent(metadata, "policy_version", grant.PolicyVersion);
 36118        AddIfPresent(metadata, "resource_binding", grant.ResourceBinding);
 119
 36120        return metadata.Count == 0
 36121            ? EmptyMetadata
 36122            : new ReadOnlyDictionary<string, string>(metadata);
 123    }
 124
 125    private static void AddIfPresent(Dictionary<string, string> metadata, string key, string? value)
 126    {
 216127        if (!string.IsNullOrWhiteSpace(value))
 128        {
 206129            metadata[key] = value.Trim();
 130        }
 216131    }
 132
 133    private static string? NormalizeOptional(string? value)
 134    {
 72135        return string.IsNullOrWhiteSpace(value) ? null : value.Trim();
 136    }
 137}