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

Information
Class: AsyncResponse.Transports.Redis.RedisReplyTargetProvider
Assembly: AsyncResponse.Transports.Redis
File(s): /home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.Redis/RedisReplyTargetProvider.cs
Line coverage
100%
Covered lines: 39
Uncovered lines: 0
Coverable lines: 39
Total lines: 63
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
.ctor(...)100%11100%
GetReplyTarget(...)100%44100%
ResolveTarget(...)100%44100%

File(s)

/home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.Redis/RedisReplyTargetProvider.cs

#LineLine coverage
 1using Microsoft.Extensions.Options;
 2
 3namespace AsyncResponse.Transports.Redis;
 4
 35internal sealed class RedisReplyTargetProvider(
 36    IOptions<RedisAsyncResponseTransportOptions> _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        RedisTransportOptionsValidator.ValidateCommon(options);
 313        var schema = new RedisTransportKeySchema(options);
 314        var targetName = string.IsNullOrWhiteSpace(name)
 315            ? options.DefaultReplyTargetName
 316            : name;
 17
 318        var target = ResolveTarget(options, schema, targetName);
 319        var responseStream = RedisTransportOptionsValidator.Required(
 320            target.ResponseStream,
 321            $"{nameof(RedisReplyTargetOptions)}.{nameof(RedisReplyTargetOptions.ResponseStream)}");
 322        var consumerGroup = target.ConsumerGroup ?? options.ResponseConsumerGroup;
 23
 324        var properties = new Dictionary<string, string>(target.Properties, StringComparer.Ordinal)
 325        {
 326            ["stream"] = responseStream,
 327            ["consumerGroup"] = consumerGroup,
 328            ["payloadField"] = options.PayloadField,
 329            ["correlationIdField"] = options.CorrelationIdField
 330        };
 31
 332        return new AsyncResponseReplyTarget
 333        {
 334            Name = targetName,
 335            Transport = RedisAsyncResponseTransportOptions.TransportName,
 336            Address = responseStream,
 337            Properties = properties
 338        };
 39    }
 40
 41    private static RedisReplyTargetOptions ResolveTarget(
 42        RedisAsyncResponseTransportOptions options,
 43        RedisTransportKeySchema schema,
 44        string targetName)
 45    {
 346        if (options.ReplyTargets.TryGetValue(targetName, out var configured))
 347            return configured;
 48
 349        if (StringComparer.Ordinal.Equals(targetName, options.DefaultReplyTargetName))
 50        {
 351            return new RedisReplyTargetOptions
 352            {
 353                ResponseStream = schema.ResponseStream.ToString(),
 354                ConsumerGroup = options.ResponseConsumerGroup
 355            };
 56        }
 57
 258        throw new InvalidOperationException(
 259            $"Redis async-response reply target '{targetName}' is not configured. " +
 260            $"Configure {nameof(RedisAsyncResponseTransportOptions.ResponseStream)} for the default target " +
 261            $"or add a named target with {nameof(RedisAsyncResponseTransportOptions.AddReplyTarget)}.");
 62    }
 63}