From 06c0b15c811e4f58972865343bc451ea0ec6b5a7 Mon Sep 17 00:00:00 2001 From: Ricky Kaare Engelharth Date: Sat, 16 Nov 2024 22:27:49 +0100 Subject: [PATCH] Add tests for EventHubPublisher --- .../Internal/EventHubPublisherTests.cs | 174 ++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 test/Cabazure.Messaging.EventHub.Tests/Internal/EventHubPublisherTests.cs diff --git a/test/Cabazure.Messaging.EventHub.Tests/Internal/EventHubPublisherTests.cs b/test/Cabazure.Messaging.EventHub.Tests/Internal/EventHubPublisherTests.cs new file mode 100644 index 0000000..41a06af --- /dev/null +++ b/test/Cabazure.Messaging.EventHub.Tests/Internal/EventHubPublisherTests.cs @@ -0,0 +1,174 @@ +using System.Text.Json; +using Azure.Messaging.EventHubs; +using Azure.Messaging.EventHubs.Producer; +using Cabazure.Messaging.EventHub.Internal; + +namespace Cabazure.Messaging.EventHub.Tests.Internal; + +public class EventHubPublisherTests +{ + public record TMessage(string Data); + + [Theory, AutoNSubstituteData] + public async Task PublishAsync_Calls_SendAsync_On_Client( + [Frozen, NoAutoProperties] JsonSerializerOptions serializerOptions, + [Frozen, Substitute] EventHubProducerClient client, + [Frozen, Substitute] Func partitionKeySelector, + EventHubPublisher sut, + TMessage message, + CancellationToken cancellationToken) + { + partitionKeySelector.Invoke(default).ReturnsNullForAnyArgs(); + await sut.PublishAsync( + message, + cancellationToken); + + _ = client + .Received(1) + .SendAsync( + Arg.Any>(), + cancellationToken); + } + + [Theory, AutoNSubstituteData] + public async Task PublishAsync_Calls_SendAsync_With_Options( + [Frozen, NoAutoProperties] JsonSerializerOptions serializerOptions, + [Frozen, Substitute] EventHubProducerClient client, + EventHubPublisher sut, + TMessage message, + CancellationToken cancellationToken) + { + await sut.PublishAsync( + message, + cancellationToken); + + _ = client + .Received(1) + .SendAsync( + Arg.Any>(), + Arg.Any(), + cancellationToken); + } + + [Theory, AutoNSubstituteData] + public async Task PublishAsync_Sends_Serialized_Message( + [Frozen, NoAutoProperties] JsonSerializerOptions serializerOptions, + [Frozen, Substitute] EventHubProducerClient client, + EventHubPublisher sut, + TMessage message, + CancellationToken cancellationToken) + { + await sut.PublishAsync( + message, + cancellationToken); + + var eventData = client + .ReceivedCallWithArgument>() + .Single(); + eventData.EventBody + .ToObjectFromJson( + serializerOptions) + .Should() + .BeEquivalentTo(message); + } + + [Theory, AutoNSubstituteData] + public async Task PublishAsync_Sends_Properties_From_Factory( + [Frozen, NoAutoProperties] JsonSerializerOptions serializerOptions, + [Frozen, Substitute] EventHubProducerClient client, + [Frozen, Substitute] Func> propertiesFactory, + Dictionary properties, + EventHubPublisher sut, + TMessage message, + CancellationToken cancellationToken) + { + propertiesFactory.Invoke(message).Returns(properties); + await sut.PublishAsync( + message, + cancellationToken); + + var eventData = client + .ReceivedCallWithArgument>() + .Single(); + eventData.Properties + .Should() + .BeEquivalentTo(properties); + } + + [Theory, AutoNSubstituteData] + public async Task PublishAsync_Sends_Metadate_From_PublishingOptions( + [Frozen, NoAutoProperties] JsonSerializerOptions serializerOptions, + [Frozen, Substitute] EventHubProducerClient client, + EventHubPublisher sut, + TMessage message, + PublishingOptions options, + CancellationToken cancellationToken) + { + await sut.PublishAsync( + message, + options, + cancellationToken); + + var eventData = client + .ReceivedCallWithArgument>() + .Single(); + eventData.ContentType + .Should() + .BeEquivalentTo(options.ContentType); + eventData.CorrelationId + .Should() + .BeEquivalentTo(options.CorrelationId); + eventData.MessageId + .Should() + .BeEquivalentTo(options.MessageId); + eventData.Properties + .Should() + .BeEquivalentTo(options.Properties); + } + + [Theory, AutoNSubstituteData] + public async Task PublishAsync_Sends_PartitionKey_From_Factory( + [Frozen, NoAutoProperties] JsonSerializerOptions serializerOptions, + [Frozen, Substitute] EventHubProducerClient client, + [Frozen, Substitute] Func partitionKeySelector, + string partitionKey, + EventHubPublisher sut, + TMessage message, + CancellationToken cancellationToken) + { + partitionKeySelector.Invoke(message).Returns(partitionKey); + await sut.PublishAsync( + message, + cancellationToken); + + var sendOptions = client + .ReceivedCallWithArgument(); + sendOptions.PartitionKey + .Should() + .BeEquivalentTo(partitionKey); + } + + [Theory, AutoNSubstituteData] + public async Task PublishAsync_Sends_PartitionKey_From_PublishingOptions( + [Frozen, NoAutoProperties] JsonSerializerOptions serializerOptions, + [Frozen, Substitute] EventHubProducerClient client, + EventHubPublisher sut, + TMessage message, + EventHubPublishingOptions options, + CancellationToken cancellationToken) + { + await sut.PublishAsync( + message, + options, + cancellationToken); + + var sendOptions = client + .ReceivedCallWithArgument(); + sendOptions.PartitionKey + .Should() + .BeEquivalentTo(options.PartitionKey); + sendOptions.PartitionId + .Should() + .BeEquivalentTo(options.PartitionId); + } +}