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

Information
Class: AsyncResponse.Transports.Kafka.KafkaReplyTargetProvider
Assembly: AsyncResponse.Transports.Kafka
File(s): /home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.Kafka/KafkaReplyTargetProvider.cs
Line coverage
100%
Covered lines: 40
Uncovered lines: 0
Coverable lines: 40
Total lines: 65
Line coverage: 100%
Branch coverage
100%
Covered branches: 10
Total branches: 10
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%44100%

File(s)

/home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.Kafka/KafkaReplyTargetProvider.cs

#LineLine coverage
 1using Microsoft.Extensions.Options;
 2
 3namespace AsyncResponse.Transports.Kafka;
 4
 35internal sealed class KafkaReplyTargetProvider(
 36    IOptions<KafkaAsyncResponseTransportOptions> _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        KafkaTransportOptionsValidator.ValidateCommon(options);
 313        var schema = new KafkaTransportTopicSchema(options);
 314        var targetName = string.IsNullOrWhiteSpace(name)
 315            ? options.DefaultReplyTargetName
 316            : name;
 17
 318        var target = ResolveTarget(options, schema, targetName);
 319        var responseTopic = KafkaTransportOptionsValidator.Required(
 320            target.ResponseTopic,
 321            $"{nameof(KafkaReplyTargetOptions)}.{nameof(KafkaReplyTargetOptions.ResponseTopic)}");
 322        var consumerGroup = target.ConsumerGroup ?? options.ResponseConsumerGroup;
 23
 324        var properties = new Dictionary<string, string>(target.Properties, StringComparer.Ordinal)
 325        {
 326            ["topic"] = responseTopic,
 327            ["consumerGroup"] = consumerGroup,
 328            ["correlationIdHeader"] = options.CorrelationIdHeader
 329        };
 30
 331        if (!string.IsNullOrWhiteSpace(options.BootstrapServers))
 332            properties["bootstrapServers"] = options.BootstrapServers!;
 33
 334        return new AsyncResponseReplyTarget
 335        {
 336            Name = targetName,
 337            Transport = KafkaAsyncResponseTransportOptions.TransportName,
 338            Address = responseTopic,
 339            Properties = properties
 340        };
 41    }
 42
 43    private static KafkaReplyTargetOptions ResolveTarget(
 44        KafkaAsyncResponseTransportOptions options,
 45        KafkaTransportTopicSchema schema,
 46        string targetName)
 47    {
 348        if (options.ReplyTargets.TryGetValue(targetName, out var configured))
 349            return configured;
 50
 351        if (StringComparer.Ordinal.Equals(targetName, options.DefaultReplyTargetName))
 52        {
 353            return new KafkaReplyTargetOptions
 354            {
 355                ResponseTopic = schema.ResponseTopic,
 356                ConsumerGroup = options.ResponseConsumerGroup
 357            };
 58        }
 59
 260        throw new InvalidOperationException(
 261            $"Kafka async-response reply target '{targetName}' is not configured. " +
 262            $"Configure {nameof(KafkaAsyncResponseTransportOptions.ResponseTopic)} for the default target " +
 263            $"or add a named target with {nameof(KafkaAsyncResponseTransportOptions.AddReplyTarget)}.");
 64    }
 65}