< Summary

Information
Class: AsiBackbone.Testing.Contracts.AsiBackboneDecisionPolicyContract<T>
Assembly: AsiBackbone.Testing
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Testing/Contracts/AsiBackboneDecisionPolicyContract.cs
Line coverage
100%
Covered lines: 26
Uncovered lines: 0
Coverable lines: 26
Total lines: 87
Line coverage: 100%
Branch coverage
100%
Covered branches: 8
Total branches: 8
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
CreateComposedDecision(...)100%11100%
CreateConstraintResults()100%11100%
VerifyDecisionPolicyReturnsSafeDecisionAsync()100%88100%

File(s)

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

#LineLine coverage
 1using AsiBackbone.Core.Constraints;
 2using AsiBackbone.Core.Decisions;
 3using AsiBackbone.Core.Evaluation;
 4
 5namespace AsiBackbone.Testing.Contracts;
 6
 7/// <summary>
 8/// Reusable contract fixture for <see cref="IAsiBackboneDecisionPolicy{TContext}" /> implementations.
 9/// </summary>
 10/// <typeparam name="TContext">The framework-neutral evaluation context type.</typeparam>
 11public abstract class AsiBackboneDecisionPolicyContract<TContext>
 12    where TContext : IAsiBackboneConstraintEvaluationContext
 13{
 14    /// <summary>
 15    /// Creates the decision-policy implementation under test.
 16    /// </summary>
 17    /// <returns>The decision-policy implementation to validate.</returns>
 18    protected abstract IAsiBackboneDecisionPolicy<TContext> CreateDecisionPolicy();
 19
 20    /// <summary>
 21    /// Creates the context supplied to the decision-policy implementation under test.
 22    /// </summary>
 23    /// <returns>The evaluation context to validate with.</returns>
 24    protected abstract TContext CreateEvaluationContext();
 25
 26    /// <summary>
 27    /// Creates the composed decision supplied to the decision-policy implementation under test.
 28    /// </summary>
 29    /// <param name="context">The evaluation context created for the contract run.</param>
 30    /// <returns>The composed decision supplied to the decision policy.</returns>
 31    protected virtual GovernanceDecision CreateComposedDecision(TContext context)
 32    {
 1233        ArgumentNullException.ThrowIfNull(context);
 34
 1235        return GovernanceDecision.Allow(
 1236            context.CorrelationId,
 1237            traceId: null,
 1238            context.PolicyVersion,
 1239            context.PolicyHash);
 40    }
 41
 42    /// <summary>
 43    /// Creates the constraint-result collection supplied to the decision-policy implementation under test.
 44    /// </summary>
 45    /// <returns>The constraint-result collection supplied to the decision policy.</returns>
 46    protected virtual IReadOnlyList<ConstraintEvaluationResult> CreateConstraintResults()
 47    {
 1048        return Array.Empty<ConstraintEvaluationResult>();
 49    }
 50
 51    /// <summary>
 52    /// Verifies that the decision policy returns a safe, non-null decision and preserves supplied decision telemetry.
 53    /// </summary>
 54    /// <param name="cancellationToken">A token that can cancel the contract validation.</param>
 55    /// <returns>The verified governance decision.</returns>
 56    public async ValueTask<GovernanceDecision> VerifyDecisionPolicyReturnsSafeDecisionAsync(CancellationToken cancellati
 57    {
 1858        IAsiBackboneDecisionPolicy<TContext> decisionPolicy = CreateDecisionPolicy()
 1859            ?? throw new AsiBackboneContractViolationException("Decision-policy contract must provide a decision policy 
 1660        TContext context = CreateEvaluationContext()
 1661            ?? throw new AsiBackboneContractViolationException("Decision-policy contract must provide an evaluation cont
 1462        GovernanceDecision composedDecision = CreateComposedDecision(context)
 1463            ?? throw new AsiBackboneContractViolationException("Decision-policy contract must provide a composed decisio
 1264        IReadOnlyList<ConstraintEvaluationResult> constraintResults = CreateConstraintResults()
 1265            ?? throw new AsiBackboneContractViolationException("Decision-policy contract must provide a constraint-resul
 66
 67        try
 68        {
 1069            GovernanceDecision decision = await decisionPolicy.ApplyAsync(context, composedDecision, constraintResults, 
 270            return AsiBackboneDecisionContract.VerifyTelemetryFromContext(decision, context, "Decision-policy decision")
 71        }
 272        catch (OperationCanceledException)
 73        {
 274            throw;
 75        }
 276        catch (AsiBackboneContractViolationException)
 77        {
 278            throw;
 79        }
 480        catch (Exception exception)
 81        {
 482            throw new AsiBackboneContractViolationException(
 483                "Decision-policy implementations must return safe decisions instead of bypassing the policy pipeline by 
 484                exception);
 85        }
 286    }
 87}