< Summary

Information
Class: AsiBackbone.Testing.Contracts.EndpointCapabilityGrantValidatorContract
Assembly: AsiBackbone.Testing
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Testing/Contracts/EndpointCapabilityGrantValidatorContract.cs
Line coverage
100%
Covered lines: 34
Uncovered lines: 0
Coverable lines: 34
Total lines: 105
Line coverage: 100%
Branch coverage
100%
Covered branches: 10
Total branches: 10
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
CreateHttpContext()100%11100%
CreateCapabilityDescriptor()100%22100%
CreateCurrentDecision()100%11100%
ConfigureKnownInvalidCapabilityGrant(...)100%11100%
VerifyKnownInvalidCapabilityGrantDoesNotAllowAsync()100%88100%

File(s)

/home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Testing/Contracts/EndpointCapabilityGrantValidatorContract.cs

#LineLine coverage
 1using AsiBackbone.AspNetCore.Endpoints;
 2using AsiBackbone.Core.Decisions;
 3using Microsoft.AspNetCore.Http;
 4
 5namespace AsiBackbone.Testing.Contracts;
 6
 7/// <summary>
 8/// Reusable contract fixture for <see cref="IEndpointCapabilityGrantValidator" /> implementations.
 9/// </summary>
 10public abstract class EndpointCapabilityGrantValidatorContract
 11{
 12    /// <summary>
 13    /// Creates the capability-grant validator implementation under test.
 14    /// </summary>
 15    /// <returns>The capability-grant validator implementation to validate.</returns>
 16    protected abstract IEndpointCapabilityGrantValidator CreateValidator();
 17
 18    /// <summary>
 19    /// Creates the HTTP context supplied to the validator implementation under test.
 20    /// </summary>
 21    /// <returns>The HTTP context to validate with.</returns>
 22    protected virtual HttpContext CreateHttpContext()
 23    {
 724        return new DefaultHttpContext
 725        {
 726            TraceIdentifier = "asibackbone-contract-capability"
 727        };
 28    }
 29
 30    /// <summary>
 31    /// Creates a descriptor containing a capability requirement for the invalid-grant contract path.
 32    /// </summary>
 33    /// <returns>The descriptor supplied to the validator implementation under test.</returns>
 34    protected virtual EndpointGovernanceDescriptor CreateCapabilityDescriptor()
 35    {
 636        var endpoint = new Endpoint(
 637            static _ => Task.CompletedTask,
 638            new EndpointMetadataCollection(new RequireCapabilityGrantAttribute("asibackbone.contract.invalid")),
 639            "asibackbone.contract.capability");
 40
 641        return EndpointGovernanceDescriptor.FromEndpoint(endpoint);
 42    }
 43
 44    /// <summary>
 45    /// Creates the current decision supplied to the validator implementation under test.
 46    /// </summary>
 47    /// <returns>The current governance decision.</returns>
 48    protected virtual GovernanceDecision CreateCurrentDecision()
 49    {
 550        return GovernanceDecision.Allow(
 551            correlationId: "asibackbone-contract-capability",
 552            policyVersion: "contract-policy-v1",
 553            policyHash: "contract-policy-hash");
 54    }
 55
 56    /// <summary>
 57    /// Allows derived contracts to place a known-invalid grant, token, header, or request state into the context.
 58    /// </summary>
 59    /// <param name="httpContext">The HTTP context supplied to the validator.</param>
 60    /// <param name="descriptor">The endpoint governance descriptor supplied to the validator.</param>
 61    protected virtual void ConfigureKnownInvalidCapabilityGrant(
 62        HttpContext httpContext,
 63        EndpointGovernanceDescriptor descriptor)
 64    {
 565    }
 66
 67    /// <summary>
 68    /// Verifies that a known invalid capability-grant scenario does not produce an allow decision.
 69    /// </summary>
 70    /// <param name="cancellationToken">A token that can cancel the contract validation.</param>
 71    /// <returns>The verified governance decision.</returns>
 72    public async ValueTask<GovernanceDecision> VerifyKnownInvalidCapabilityGrantDoesNotAllowAsync(CancellationToken canc
 73    {
 974        IEndpointCapabilityGrantValidator validator = CreateValidator()
 975            ?? throw new GovernanceContractViolationException("Capability-grant contract must provide a validator instan
 876        HttpContext httpContext = CreateHttpContext()
 877            ?? throw new GovernanceContractViolationException("Capability-grant contract must provide an HTTP context.")
 778        EndpointGovernanceDescriptor descriptor = CreateCapabilityDescriptor()
 779            ?? throw new GovernanceContractViolationException("Capability-grant contract must provide an endpoint descri
 680        GovernanceDecision currentDecision = CreateCurrentDecision()
 681            ?? throw new GovernanceContractViolationException("Capability-grant contract must provide a current decision
 82
 583        ConfigureKnownInvalidCapabilityGrant(httpContext, descriptor);
 84
 85        try
 86        {
 587            GovernanceDecision decision = await validator.ValidateAsync(httpContext, descriptor, currentDecision, cancel
 288            return GovernanceDecisionContract.VerifyInvalidCapabilityGrantDoesNotAllow(decision, "Capability-grant valid
 89        }
 190        catch (OperationCanceledException)
 91        {
 192            throw;
 93        }
 294        catch (GovernanceContractViolationException)
 95        {
 296            throw;
 97        }
 198        catch (Exception exception)
 99        {
 1100            throw new GovernanceContractViolationException(
 1101                "Capability-grant validators must fail closed, defer, or escalate for invalid grants instead of throwing
 1102                exception);
 103        }
 1104    }
 105}