Skip to content
This repository was archived by the owner on Apr 29, 2022. It is now read-only.

Commit 73ca240

Browse files
author
Anton Vorontsov
committed
Covered both batch message handlers with unit tests.
1 parent 814e9af commit 73ca240

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
using Microsoft.Extensions.Logging;
6+
using Moq;
7+
using RabbitMQ.Client.Core.DependencyInjection.BatchMessageHandlers;
8+
using RabbitMQ.Client.Core.DependencyInjection.Configuration;
9+
using RabbitMQ.Client.Core.DependencyInjection.Models;
10+
using RabbitMQ.Client.Core.DependencyInjection.Services;
11+
using RabbitMQ.Client.Core.DependencyInjection.Tests.UnitTests.Stubs;
12+
using RabbitMQ.Client.Events;
13+
using Xunit;
14+
15+
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.UnitTests
16+
{
17+
public class BatchMessageHandlerTests
18+
{
19+
[Theory]
20+
[InlineData(1, 10)]
21+
[InlineData(5, 47)]
22+
[InlineData(10, 185)]
23+
[InlineData(16, 200)]
24+
[InlineData(20, 310)]
25+
[InlineData(25, 400)]
26+
public async Task ShouldProperlyHandlerMessagesByBatches(ushort prefetchCount, int numberOfMessages)
27+
{
28+
const string queueName = "queue.name";
29+
30+
var channelMock = new Mock<IModel>();
31+
var connectionMock = new Mock<IConnection>();
32+
connectionMock.Setup(x => x.CreateModel())
33+
.Returns(channelMock.Object);
34+
35+
var connectionFactoryMock = new Mock<IRabbitMqConnectionFactory>();
36+
connectionFactoryMock.Setup(x => x.CreateRabbitMqConnection(It.IsAny<RabbitMqClientOptions>()))
37+
.Returns(connectionMock.Object);
38+
39+
var consumer = new AsyncEventingBasicConsumer(channelMock.Object);
40+
connectionFactoryMock.Setup(x => x.CreateConsumer(It.IsAny<IModel>()))
41+
.Returns(consumer);
42+
43+
var callerMock = new Mock<IStubCaller>();
44+
45+
var messageHandler = CreateBatchMessageHandler(queueName, prefetchCount, connectionFactoryMock.Object, callerMock.Object);
46+
await messageHandler.StartAsync(CancellationToken.None);
47+
48+
for (var i = 0; i < numberOfMessages; i++)
49+
{
50+
await consumer.HandleBasicDeliver(
51+
"1",
52+
(ulong)numberOfMessages,
53+
false,
54+
"exchange",
55+
"routing,key",
56+
null,
57+
new ReadOnlyMemory<byte>());
58+
}
59+
60+
var numberOfBatches = numberOfMessages / prefetchCount;
61+
callerMock.Verify(x => x.EmptyCall(), Times.Exactly(numberOfBatches));
62+
63+
var processedMessages = numberOfBatches * prefetchCount;
64+
callerMock.Verify(x => x.Call(It.IsAny<string>()), Times.Exactly(processedMessages));
65+
66+
await messageHandler.StopAsync(CancellationToken.None);
67+
}
68+
69+
BatchMessageHandler CreateBatchMessageHandler(
70+
string queueName,
71+
ushort prefetchCount,
72+
IRabbitMqConnectionFactory connectionFactory,
73+
IStubCaller caller)
74+
{
75+
var connectionOptions = new BatchConsumerConnectionOptions
76+
{
77+
Type = typeof(StubBatchMessageHandler),
78+
ClientOptions = new RabbitMqClientOptions()
79+
};
80+
var loggerMock = new Mock<ILogger<StubBatchMessageHandler>>();
81+
return new StubBatchMessageHandler(
82+
caller,
83+
connectionFactory,
84+
new List<BatchConsumerConnectionOptions> { connectionOptions },
85+
loggerMock.Object)
86+
{
87+
QueueName = queueName,
88+
PrefetchCount = prefetchCount
89+
};
90+
}
91+
}
92+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System.Collections.Generic;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using Microsoft.Extensions.Logging;
5+
using RabbitMQ.Client.Core.DependencyInjection.BatchMessageHandlers;
6+
using RabbitMQ.Client.Core.DependencyInjection.Models;
7+
using RabbitMQ.Client.Core.DependencyInjection.Services;
8+
9+
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.UnitTests.Stubs
10+
{
11+
public class StubBatchMessageHandler : BatchMessageHandler
12+
{
13+
readonly IStubCaller _caller;
14+
15+
public StubBatchMessageHandler(
16+
IStubCaller caller,
17+
IRabbitMqConnectionFactory rabbitMqConnectionFactory,
18+
IEnumerable<BatchConsumerConnectionOptions> batchConsumerConnectionOptions,
19+
ILogger<StubBatchMessageHandler> logger)
20+
: base(rabbitMqConnectionFactory, batchConsumerConnectionOptions, logger)
21+
{
22+
_caller = caller;
23+
}
24+
25+
public override ushort PrefetchCount { get; set; }
26+
27+
public override string QueueName { get; set; }
28+
29+
public override Task HandleMessages(IEnumerable<string> messages, CancellationToken cancellationToken)
30+
{
31+
_caller.EmptyCall();
32+
foreach (var message in messages)
33+
{
34+
_caller.Call(message);
35+
}
36+
return Task.CompletedTask;
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)