< Summary

Information
Class: AsiBackbone.AspNetCore.Handshakes.DefaultAsiBackboneAcknowledgmentChallengeService
Assembly: AsiBackbone.AspNetCore
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.AspNetCore/Handshakes/DefaultAsiBackboneAcknowledgmentChallengeService.cs
Line coverage
100%
Covered lines: 36
Uncovered lines: 0
Coverable lines: 36
Total lines: 90
Line coverage: 100%
Branch coverage
100%
Covered branches: 14
Total branches: 14
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%44100%
CreateChallenge(...)100%22100%
HandleResponse(...)100%88100%

File(s)

/home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.AspNetCore/Handshakes/DefaultAsiBackboneAcknowledgmentChallengeService.cs

#LineLine coverage
 1using AsiBackbone.Core.Actors;
 2using AsiBackbone.Core.Decisions;
 3using AsiBackbone.Core.Handshakes;
 4using Microsoft.Extensions.Options;
 5
 6namespace AsiBackbone.AspNetCore.Handshakes;
 7
 8/// <summary>
 9/// Provides the default ASP.NET Core-friendly acknowledgment challenge service.
 10/// </summary>
 11public sealed class DefaultAsiBackboneAcknowledgmentChallengeService : IAsiBackboneAcknowledgmentChallengeService
 12{
 13    private const string ChallengeMismatchCode = "acknowledgment.challenge.mismatch";
 14    private const string ChallengeCodeMismatchCode = "acknowledgment.challenge.code_mismatch";
 15
 16    private readonly AsiBackboneAcknowledgmentChallengeOptions options;
 17
 18    /// <summary>
 19    /// Initializes a new instance of the <see cref="DefaultAsiBackboneAcknowledgmentChallengeService" /> class.
 20    /// </summary>
 21    /// <param name="options">The acknowledgment challenge options.</param>
 6322    public DefaultAsiBackboneAcknowledgmentChallengeService(IOptions<AsiBackboneAcknowledgmentChallengeOptions> options)
 23    {
 6324        this.options = options?.Value ?? throw new ArgumentNullException(nameof(options));
 6125        this.options.Validate();
 5926    }
 27
 28    /// <inheritdoc />
 29    public AsiBackboneAcknowledgmentChallenge CreateChallenge(
 30        IAsiBackboneActorContext actor,
 31        string operationName,
 32        GovernanceDecision decision,
 33        IReadOnlyDictionary<string, string>? metadata = null)
 34    {
 4635        ArgumentNullException.ThrowIfNull(actor);
 4236        ArgumentNullException.ThrowIfNull(decision);
 37
 4038        if (!decision.RequiresAcknowledgment)
 39        {
 240            throw new InvalidOperationException("Only acknowledgment-required governance decisions can be converted into
 41        }
 42
 3843        var request = LiabilityHandshakeRequest.FromDecision(
 3844            actor,
 3845            operationName,
 3846            decision,
 3847            options.RequiredAcknowledgmentCode,
 3848            options.RequiredAcknowledgmentText,
 3849            options.RiskLevel,
 3850            options.RiskCategory,
 3851            metadata: metadata);
 52
 3853        return AsiBackboneAcknowledgmentChallenge.FromHandshakeRequest(request, options);
 54    }
 55
 56    /// <inheritdoc />
 57    public AsiBackboneAcknowledgmentChallengeResult HandleResponse(
 58        AsiBackboneAcknowledgmentChallenge challenge,
 59        IAsiBackboneActorContext actor,
 60        AsiBackboneAcknowledgmentChallengeRequest response,
 61        DateTimeOffset? occurredUtc = null)
 62    {
 3063        ArgumentNullException.ThrowIfNull(challenge);
 2864        ArgumentNullException.ThrowIfNull(actor);
 2665        ArgumentNullException.ThrowIfNull(response);
 66
 2467        if (!string.Equals(challenge.HandshakeId, response.HandshakeId?.Trim(), StringComparison.Ordinal))
 68        {
 869            return AsiBackboneAcknowledgmentChallengeResult.Failure(
 870                ChallengeMismatchCode,
 871                "The acknowledgment response did not match the active challenge.");
 72        }
 73
 1674        if (!string.Equals(challenge.RequiredAcknowledgmentCode, response.AcknowledgmentCode?.Trim(), StringComparison.O
 75        {
 1076            return AsiBackboneAcknowledgmentChallengeResult.Failure(
 1077                ChallengeCodeMismatchCode,
 1078                "The acknowledgment response did not contain the required acknowledgment code.");
 79        }
 80
 681        var acknowledgment = LiabilityHandshakeAcknowledgment.Create(
 682            challenge.HandshakeRequest,
 683            actor,
 684            response.Acknowledged,
 685            occurredUtc: occurredUtc,
 686            metadata: response.Metadata);
 87
 688        return AsiBackboneAcknowledgmentChallengeResult.Success(acknowledgment);
 89    }
 90}