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

Information
Class: AsyncResponse.Transports.MongoDB.MongoDbReplyTargetProvider
Assembly: AsyncResponse.Transports.MongoDB
File(s): /_/src/Transports/AsyncResponse.Transports.MongoDB/MongoDbReplyTargetProvider.cs
Line coverage
100%
Covered lines: 40
Uncovered lines: 0
Coverable lines: 40
Total lines: 70
Line coverage: 100%
Branch coverage
100%
Covered branches: 12
Total branches: 12
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%88100%
ResolveTarget(...)100%44100%

File(s)

/_/src/Transports/AsyncResponse.Transports.MongoDB/MongoDbReplyTargetProvider.cs

#LineLine coverage
 1using Microsoft.Extensions.Options;
 2
 3namespace AsyncResponse.Transports.MongoDB;
 4
 2055internal sealed class MongoDbReplyTargetProvider(
 2056    IOptions<MongoDbAsyncResponseTransportOptions> _options) : IAsyncResponseReplyTargetProvider
 7{
 8    /// <inheritdoc />
 9    public AsyncResponseReplyTarget GetReplyTarget(string? name = null)
 10    {
 1011        var options = _options.Value;
 1012        MongoDbTransportOptionsValidator.ValidateCommon(options);
 1013        var targetName = string.IsNullOrWhiteSpace(name)
 1014            ? options.DefaultReplyTargetName
 1015            : name;
 16
 1017        var target = ResolveTarget(options, targetName);
 818        var responseQueue = MongoDbTransportOptionsValidator.Required(
 819            target.ResponseQueue,
 820            $"{nameof(MongoDbReplyTargetOptions)}.{nameof(MongoDbReplyTargetOptions.ResponseQueue)}");
 21
 22        // ValidateCommon enforces three-way distinctness for the transport-wide queues because all
 23        // logical queues share one collection; a NAMED target reaches that same collection by
 24        // another route and must honor the same rule — a target aimed at the worker (or
 25        // dead-letter) queue lands responses as documents the worker subscriber claims, NAKs to
 26        // the cap, and dead-letters, while the waiter times out. Matching the transport-wide
 27        // ResponseQueue is fine: that is literally the default target's destination.
 828        if (StringComparer.Ordinal.Equals(responseQueue, options.WorkerQueue)
 829            || StringComparer.Ordinal.Equals(responseQueue, options.DeadLetterQueue))
 30        {
 431            throw new InvalidOperationException(
 432                $"MongoDB async-response reply target '{targetName}' uses queue '{responseQueue}', which collides with "
 433                $"{nameof(MongoDbAsyncResponseTransportOptions.WorkerQueue)} or {nameof(MongoDbAsyncResponseTransportOpt
 434                "all queues share one collection, so the target's responses would be consumed as worker jobs (or buried 
 35        }
 36
 437        var properties = new Dictionary<string, string>(target.Properties, StringComparer.Ordinal)
 438        {
 439            ["collection"] = options.MessageCollection,
 440            ["queue"] = responseQueue,
 441            ["correlationIdHeader"] = options.CorrelationIdHeader
 442        };
 443        if (!string.IsNullOrWhiteSpace(options.DatabaseName))
 244            properties["database"] = options.DatabaseName!;
 45
 446        return new AsyncResponseReplyTarget
 447        {
 448            Name = targetName,
 449            Transport = MongoDbAsyncResponseTransportOptions.TransportName,
 450            Address = responseQueue,
 451            Properties = properties
 452        };
 53    }
 54
 55    private static MongoDbReplyTargetOptions ResolveTarget(
 56        MongoDbAsyncResponseTransportOptions options,
 57        string targetName)
 58    {
 1059        if (options.ReplyTargets.TryGetValue(targetName, out var configured))
 660            return configured;
 61
 462        if (StringComparer.Ordinal.Equals(targetName, options.DefaultReplyTargetName))
 263            return new MongoDbReplyTargetOptions { ResponseQueue = options.ResponseQueue };
 64
 265        throw new InvalidOperationException(
 266            $"MongoDB async-response reply target '{targetName}' is not configured. " +
 267            $"Configure {nameof(MongoDbAsyncResponseTransportOptions.ResponseQueue)} for the default target " +
 268            $"or add a named target with {nameof(MongoDbAsyncResponseTransportOptions.AddReplyTarget)}.");
 69    }
 70}