< 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>
 5022    public DefaultAsiBackboneAcknowledgmentChallengeService(IOptions<AsiBackboneAcknowledgmentChallengeOptions> options)
 23    {
 5024        this.options = options?.Value ?? throw new ArgumentNullException(nameof(options));
 4925        this.options.Validate();
 4826    }
 27
 28    /// <inheritdoc />
 29    public AsiBackboneAcknowledgmentChallenge CreateChallenge(
 30        IAsiBackboneActorContext actor,
 31        string operationName,
 32        GovernanceDecision decision,
 33        IReadOnlyDictionary<string, string>? metadata = null)
 34    {
 2435        ArgumentNullException.ThrowIfNull(actor);
 2236        ArgumentNullException.ThrowIfNull(decision);
 37
 2138        if (!decision.RequiresAcknowledgment)
 39        {
 140            throw new InvalidOperationException("Only acknowledgment-required governance decisions can be converted into
 41        }
 42
 2043        var request = LiabilityHandshakeRequest.FromDecision(
 2044            actor,
 2045            operationName,
 2046            decision,
 2047            options.RequiredAcknowledgmentCode,
 2048            options.RequiredAcknowledgmentText,
 2049            options.RiskLevel,
 2050            options.RiskCategory,
 2051            metadata: metadata);
 52
 2053        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    {
 1563        ArgumentNullException.ThrowIfNull(challenge);
 1464        ArgumentNullException.ThrowIfNull(actor);
 1365        ArgumentNullException.ThrowIfNull(response);
 66
 1267        if (!string.Equals(challenge.HandshakeId, response.HandshakeId?.Trim(), StringComparison.Ordinal))
 68        {
 469            return AsiBackboneAcknowledgmentChallengeResult.Failure(
 470                ChallengeMismatchCode,
 471                "The acknowledgment response did not match the active challenge.");
 72        }
 73
 874        if (!string.Equals(challenge.RequiredAcknowledgmentCode, response.AcknowledgmentCode?.Trim(), StringComparison.O
 75        {
 576            return AsiBackboneAcknowledgmentChallengeResult.Failure(
 577                ChallengeCodeMismatchCode,
 578                "The acknowledgment response did not contain the required acknowledgment code.");
 79        }
 80
 381        var acknowledgment = LiabilityHandshakeAcknowledgment.Create(
 382            challenge.HandshakeRequest,
 383            actor,
 384            response.Acknowledged,
 385            occurredUtc: occurredUtc,
 386            metadata: response.Metadata);
 87
 388        return AsiBackboneAcknowledgmentChallengeResult.Success(acknowledgment);
 89    }
 90}