< Summary - AsyncResponse (Release / net8.0+net10.0 / unit+integration)

Information
Class: AsyncResponse.Transports.RabbitMQ.RabbitMqReplyTargetProvider
Assembly: AsyncResponse.Transports.RabbitMQ
File(s): /home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.RabbitMQ/RabbitMqReplyTargetProvider.cs
Line coverage
100%
Covered lines: 44
Uncovered lines: 0
Coverable lines: 44
Total lines: 68
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%11100%
GetReplyTarget(...)100%66100%
ResolveTarget(...)100%88100%

File(s)

/home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.RabbitMQ/RabbitMqReplyTargetProvider.cs

#LineLine coverage
 1using Microsoft.Extensions.Options;
 2
 3namespace AsyncResponse.Transports.RabbitMQ;
 4
 35internal sealed class RabbitMqReplyTargetProvider(
 36    IOptions<RabbitMqAsyncResponseOptions> _options) : IAsyncResponseReplyTargetProvider
 7{
 8    /// <summary>Gets the configured reply target.</summary>
 9    public AsyncResponseReplyTarget GetReplyTarget(string? name = null)
 10    {
 311        var options = _options.Value;
 312        var targetName = string.IsNullOrWhiteSpace(name)
 313            ? options.DefaultReplyTargetName
 314            : name;
 15
 316        var target = ResolveTarget(options, targetName);
 317        var exchange = RabbitMqOptionsValidator.Required(
 318            target.Exchange,
 319            $"{nameof(RabbitMqReplyTargetOptions)}.{nameof(RabbitMqReplyTargetOptions.Exchange)}");
 320        var routingKey = RabbitMqOptionsValidator.Required(
 321            target.RoutingKey,
 322            $"{nameof(RabbitMqReplyTargetOptions)}.{nameof(RabbitMqReplyTargetOptions.RoutingKey)}");
 323        var queue = target.Queue ?? options.ResponseQueue;
 24
 325        var properties = new Dictionary<string, string>(target.Properties, StringComparer.Ordinal)
 326        {
 327            ["exchange"] = exchange,
 328            ["routingKey"] = routingKey
 329        };
 30
 331        if (!string.IsNullOrWhiteSpace(queue))
 332            properties["queue"] = queue;
 33
 334        return new AsyncResponseReplyTarget
 335        {
 336            Name = targetName,
 337            Transport = RabbitMqAsyncResponseOptions.TransportName,
 338            Address = $"{exchange}:{routingKey}",
 339            Properties = properties
 340        };
 41    }
 42
 43    private static RabbitMqReplyTargetOptions ResolveTarget(
 44        RabbitMqAsyncResponseOptions options,
 45        string targetName)
 46    {
 347        if (options.ReplyTargets.TryGetValue(targetName, out var configured))
 348            return configured;
 49
 350        if (StringComparer.Ordinal.Equals(targetName, options.DefaultReplyTargetName)
 351            && !string.IsNullOrWhiteSpace(options.ResponseExchange)
 352            && !string.IsNullOrWhiteSpace(options.ResponseRoutingKey))
 53        {
 354            return new RabbitMqReplyTargetOptions
 355            {
 356                Exchange = options.ResponseExchange,
 357                RoutingKey = options.ResponseRoutingKey,
 358                Queue = options.ResponseQueue
 359            };
 60        }
 61
 262        throw new InvalidOperationException(
 263            $"RabbitMQ async-response reply target '{targetName}' is not configured. " +
 264            $"Configure {nameof(RabbitMqAsyncResponseOptions.ResponseExchange)} and " +
 265            $"{nameof(RabbitMqAsyncResponseOptions.ResponseRoutingKey)} for the default target " +
 266            $"or add a named target with {nameof(RabbitMqAsyncResponseOptions.AddReplyTarget)}.");
 67    }
 68}