diff --git a/src/SlimMessageBus.Host.RabbitMQ/Config/RabbitMqMessageBusSettingsExtensions.cs b/src/SlimMessageBus.Host.RabbitMQ/Config/RabbitMqMessageBusSettingsExtensions.cs index 60953550..018d306a 100644 --- a/src/SlimMessageBus.Host.RabbitMQ/Config/RabbitMqMessageBusSettingsExtensions.cs +++ b/src/SlimMessageBus.Host.RabbitMQ/Config/RabbitMqMessageBusSettingsExtensions.cs @@ -9,7 +9,8 @@ public static class RabbitMqMessageBusSettingsExtensions /// Action to be executed, the first param is the RabbitMQ from the underlying client, and second parameter represents the SMB exchange, queue and binding setup public static RabbitMqMessageBusSettings UseTopologyInitializer(this RabbitMqMessageBusSettings settings, RabbitMqTopologyInitializer action) { - if (action == null) throw new ArgumentNullException(nameof(action)); + if (settings is null) throw new ArgumentNullException(nameof(settings)); + if (action is null) throw new ArgumentNullException(nameof(action)); settings.Properties[RabbitMqProperties.TopologyInitializer] = action; return settings; @@ -74,6 +75,8 @@ public static RabbitMqMessageBusSettings UseDeadLetterExchangeDefaults(this Rabb /// public static RabbitMqMessageBusSettings UseQueueDefaults(this RabbitMqMessageBusSettings settings, bool? durable = null, bool? autoDelete = null) { + if (settings is null) throw new ArgumentNullException(nameof(settings)); + if (durable != null) { settings.Properties[RabbitMqProperties.QueueDurable] = durable.Value; @@ -93,7 +96,8 @@ public static RabbitMqMessageBusSettings UseQueueDefaults(this RabbitMqMessageBu /// public static RabbitMqMessageBusSettings UseMessagePropertiesModifier(this RabbitMqMessageBusSettings settings, RabbitMqMessagePropertiesModifier messagePropertiesModifier) { - if (messagePropertiesModifier == null) throw new ArgumentNullException(nameof(messagePropertiesModifier)); + if (settings is null) throw new ArgumentNullException(nameof(settings)); + if (messagePropertiesModifier is null) throw new ArgumentNullException(nameof(messagePropertiesModifier)); settings.Properties[RabbitMqProperties.MessagePropertiesModifier] = messagePropertiesModifier; return settings; @@ -107,7 +111,8 @@ public static RabbitMqMessageBusSettings UseMessagePropertiesModifier(this Rabbi /// public static RabbitMqMessageBusSettings UseRoutingKeyProvider(this RabbitMqMessageBusSettings settings, RabbitMqMessageRoutingKeyProvider routingKeyProvider) { - if (routingKeyProvider == null) throw new ArgumentNullException(nameof(routingKeyProvider)); + if (settings is null) throw new ArgumentNullException(nameof(settings)); + if (routingKeyProvider is null) throw new ArgumentNullException(nameof(routingKeyProvider)); settings.Properties[RabbitMqProperties.MessageRoutingKeyProvider] = routingKeyProvider; return settings; @@ -119,8 +124,10 @@ public static RabbitMqMessageBusSettings UseRoutingKeyProvider(this RabbitMqMess /// /// /// - public static RabbitMqMessageBusSettings UseAcknowledgementMode(this RabbitMqMessageBusSettings settings, RabbitMqMessageAcknowledgementMode mode) + public static RabbitMqMessageBusSettings AcknowledgementMode(this RabbitMqMessageBusSettings settings, RabbitMqMessageAcknowledgementMode mode) { + if (settings is null) throw new ArgumentNullException(nameof(settings)); + settings.Properties[RabbitMqProperties.MessageAcknowledgementMode] = mode; return settings; } diff --git a/src/Tests/Host.Test.Properties.xml b/src/Tests/Host.Test.Properties.xml index 489ba68e..a2879751 100644 --- a/src/Tests/Host.Test.Properties.xml +++ b/src/Tests/Host.Test.Properties.xml @@ -12,6 +12,7 @@ + \ No newline at end of file diff --git a/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/Config/RabbitMqConsumerBuilderExtensionsTests.cs b/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/Config/RabbitMqConsumerBuilderExtensionsTests.cs new file mode 100644 index 00000000..bd85450d --- /dev/null +++ b/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/Config/RabbitMqConsumerBuilderExtensionsTests.cs @@ -0,0 +1,27 @@ +namespace SlimMessageBus.Host.RabbitMQ.Test.Config; + +public class RabbitMqConsumerBuilderExtensionsTests +{ + private readonly MessageBusSettings _settings = new(); + private readonly ConsumerBuilder _consumerBuilder; + private readonly Fixture _fixture = new(); + + public RabbitMqConsumerBuilderExtensionsTests() + { + _consumerBuilder = new ConsumerBuilder(_settings); + } + + [Fact] + internal void When_UseAcknowledgementMode_Then_ValueStoredProperly() + { + // arrange + var mode = _fixture.Create(); + + // act + _consumerBuilder.AcknowledgementMode(mode); + + // assert + var modeReturned = _consumerBuilder.Settings.GetOrDefault(RabbitMqProperties.MessageAcknowledgementMode); + modeReturned.Should().Be(mode); + } +} \ No newline at end of file diff --git a/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/Config/RabbitMqMessageBusSettingsExtensionsTests.cs b/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/Config/RabbitMqMessageBusSettingsExtensionsTests.cs new file mode 100644 index 00000000..b7fec46d --- /dev/null +++ b/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/Config/RabbitMqMessageBusSettingsExtensionsTests.cs @@ -0,0 +1,35 @@ +namespace SlimMessageBus.Host.RabbitMQ.Test.Config; + +public class RabbitMqMessageBusSettingsExtensionsTests +{ + private readonly RabbitMqMessageBusSettings _settings = new(); + private readonly Fixture _fixture = new(); + + [Fact] + internal void When_UseAcknowledgementMode_Then_ValueStoredProperly() + { + // arrange + var mode = _fixture.Create(); + + // act + _settings.AcknowledgementMode(mode); + + // assert + var modeReturned = _settings.GetOrDefault(RabbitMqProperties.MessageAcknowledgementMode); + modeReturned.Should().Be(mode); + } + + [Fact] + internal void When_UseRoutingKeyProvider_Then_ValueStoredProperly() + { + // arrange + var routingKeyProviderMock = new Mock>(); + + // act + _settings.UseRoutingKeyProvider(routingKeyProviderMock.Object); + + // assert + var routingKeyProviderReturned = _settings.GetOrDefault>(RabbitMqProperties.MessageRoutingKeyProvider); + routingKeyProviderReturned.Should().BeSameAs(routingKeyProviderMock.Object); + } +} diff --git a/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/IntegrationTests/RabbitMqMessageBusIt.cs b/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/IntegrationTests/RabbitMqMessageBusIt.cs index efd01ba6..6cda47bb 100644 --- a/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/IntegrationTests/RabbitMqMessageBusIt.cs +++ b/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/IntegrationTests/RabbitMqMessageBusIt.cs @@ -70,8 +70,11 @@ protected override void SetupServices(ServiceCollection services, IConfiguration public IMessageBus MessageBus => ServiceProvider.GetRequiredService(); - [Fact] - public async Task PubSubOnFanoutExchange() + [Theory] + [InlineData(RabbitMqMessageAcknowledgementMode.AutoConfirmAfterMessageProcessingWhenNoManualConfirmMade)] + [InlineData(RabbitMqMessageAcknowledgementMode.AckAutomaticByRabbit)] + [InlineData(RabbitMqMessageAcknowledgementMode.AckMessageBeforeProcessing)] + public async Task PubSubOnFanoutExchange(RabbitMqMessageAcknowledgementMode acknowledgementMode) { var subscribers = 2; var topic = "test-ping"; @@ -99,6 +102,7 @@ public async Task PubSubOnFanoutExchange() .Queue($"subscriber-{i}", autoDelete: false) .ExchangeBinding(topic) .DeadLetterExchange("subscriber-dlq") + .AcknowledgementMode(acknowledgementMode) .WithConsumer() .WithConsumer()); })); @@ -173,8 +177,11 @@ private async Task BasicPubSub(int expectedMessageCopies, Action addit additionalAssertion?.Invoke(new TestData { ProducedMessages = producedMessages, ConsumedMessages = consumedMessages.Snapshot() }); } - [Fact] - public async Task BasicReqRespOnTopic() + [Theory] + [InlineData(RabbitMqMessageAcknowledgementMode.AutoConfirmAfterMessageProcessingWhenNoManualConfirmMade)] + [InlineData(RabbitMqMessageAcknowledgementMode.AckAutomaticByRabbit)] + [InlineData(RabbitMqMessageAcknowledgementMode.AckMessageBeforeProcessing)] + public async Task BasicReqRespOnTopic(RabbitMqMessageAcknowledgementMode acknowledgementMode) { var topic = "test-echo"; @@ -199,6 +206,7 @@ public async Task BasicReqRespOnTopic() .ExchangeBinding("test-echo") // If the request handling fails, the failed messages will be routed to the DLQ exchange .DeadLetterExchange("echo-request-handler-dlq") + .AcknowledgementMode(acknowledgementMode) .WithHandler()) .ExpectRequestResponses(x => { diff --git a/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/Usings.cs b/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/Usings.cs index f48c42fc..398d3543 100644 --- a/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/Usings.cs +++ b/src/Tests/SlimMessageBus.Host.RabbitMQ.Test/Usings.cs @@ -1,3 +1,5 @@ +global using AutoFixture; + global using FluentAssertions; global using Microsoft.Extensions.Configuration;