< Summary

Information
Class: AsiBackbone.Testing.Contracts.AsiBackboneEndpointCapabilityGrantValidatorContract
Assembly: AsiBackbone.Testing
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Testing/Contracts/AsiBackboneEndpointCapabilityGrantValidatorContract.cs
Line coverage
97%
Covered lines: 33
Uncovered lines: 1
Coverable lines: 34
Total lines: 105
Line coverage: 97%
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%2280%
CreateCurrentDecision()100%11100%
ConfigureKnownInvalidCapabilityGrant(...)100%11100%
VerifyKnownInvalidCapabilityGrantDoesNotAllowAsync()100%88100%

File(s)

/home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Testing/Contracts/AsiBackboneEndpointCapabilityGrantValidatorContract.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="IAsiBackboneEndpointCapabilityGrantValidator" /> implementations.
 9/// </summary>
 10public abstract class AsiBackboneEndpointCapabilityGrantValidatorContract
 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 IAsiBackboneEndpointCapabilityGrantValidator 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    {
 1424        return new DefaultHttpContext
 1425        {
 1426            TraceIdentifier = "asibackbone-contract-capability"
 1427        };
 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 AsiBackboneEndpointGovernanceDescriptor CreateCapabilityDescriptor()
 35    {
 1236        var endpoint = new Endpoint(
 037            static _ => Task.CompletedTask,
 1238            new EndpointMetadataCollection(new RequireCapabilityGrantAttribute("asibackbone.contract.invalid")),
 1239            "asibackbone.contract.capability");
 40
 1241        return AsiBackboneEndpointGovernanceDescriptor.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    {
 1050        return GovernanceDecision.Allow(
 1051            correlationId: "asibackbone-contract-capability",
 1052            policyVersion: "contract-policy-v1",
 1053            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        AsiBackboneEndpointGovernanceDescriptor descriptor)
 64    {
 1065    }
 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    {
 1874        IAsiBackboneEndpointCapabilityGrantValidator validator = CreateValidator()
 1875            ?? throw new AsiBackboneContractViolationException("Capability-grant contract must provide a validator insta
 1676        HttpContext httpContext = CreateHttpContext()
 1677            ?? throw new AsiBackboneContractViolationException("Capability-grant contract must provide an HTTP context."
 1478        AsiBackboneEndpointGovernanceDescriptor descriptor = CreateCapabilityDescriptor()
 1479            ?? throw new AsiBackboneContractViolationException("Capability-grant contract must provide an endpoint descr
 1280        GovernanceDecision currentDecision = CreateCurrentDecision()
 1281            ?? throw new AsiBackboneContractViolationException("Capability-grant contract must provide a current decisio
 82
 1083        ConfigureKnownInvalidCapabilityGrant(httpContext, descriptor);
 84
 85        try
 86        {
 1087            GovernanceDecision decision = await validator.ValidateAsync(httpContext, descriptor, currentDecision, cancel
 488            return AsiBackboneDecisionContract.VerifyInvalidCapabilityGrantDoesNotAllow(decision, "Capability-grant vali
 89        }
 290        catch (OperationCanceledException)
 91        {
 292            throw;
 93        }
 494        catch (AsiBackboneContractViolationException)
 95        {
 496            throw;
 97        }
 298        catch (Exception exception)
 99        {
 2100            throw new AsiBackboneContractViolationException(
 2101                "Capability-grant validators must fail closed, defer, or escalate for invalid grants instead of throwing
 2102                exception);
 103        }
 2104    }
 105}