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

Commit cd75e77

Browse files
Merge pull request #42 from AntonyVorontsov/feature/integration-tests
Feature/integration tests
2 parents 6942e0f + 62b1a4f commit cd75e77

17 files changed

+195
-66
lines changed
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
1-
name: .NET Core
1+
name: Tests
22

33
on: [push]
44

55
jobs:
66
workflow:
77
runs-on: ubuntu-latest
8+
container: mcr.microsoft.com/dotnet/core/runtime:3.1
9+
10+
services:
11+
rabbitmq:
12+
image: rabbitmq:latest
13+
ports:
14+
- 5672:5672
15+
options: --health-cmd "rabbitmqctl node_health_check" --health-interval 10s --health-timeout 5s --health-retries 5
16+
817
steps:
918
- uses: actions/checkout@v2
1019
- name: Setup .NET Core
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
using Microsoft.Extensions.DependencyInjection;
6+
using Moq;
7+
using RabbitMQ.Client.Core.DependencyInjection.Configuration;
8+
using RabbitMQ.Client.Core.DependencyInjection.Services;
9+
using RabbitMQ.Client.Core.DependencyInjection.Tests.Stubs;
10+
using RabbitMQ.Client.Events;
11+
using Xunit;
12+
13+
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.IntegrationTests
14+
{
15+
public class QueueServiceTests
16+
{
17+
readonly TimeSpan _globalTestsTimeout = TimeSpan.FromSeconds(60);
18+
19+
const string DefaultExchangeName = "exchange.name";
20+
const string FirstRoutingKey = "first.routing.key";
21+
const string SecondRoutingKey = "second.routing.key";
22+
23+
[Fact]
24+
public async Task ShouldProperlyPublishAndConsumeMessages()
25+
{
26+
var connectionFactoryMock = new Mock<RabbitMqConnectionFactory> { CallBase = true }
27+
.As<IRabbitMqConnectionFactory>();
28+
29+
AsyncEventingBasicConsumer consumer = null;
30+
connectionFactoryMock.Setup(x => x.CreateConsumer(It.IsAny<IModel>()))
31+
.Returns<IModel>(channel =>
32+
{
33+
consumer = new AsyncEventingBasicConsumer(channel);
34+
return consumer;
35+
});
36+
37+
var callerMock = new Mock<IStubCaller>();
38+
39+
var serviceCollection = new ServiceCollection();
40+
serviceCollection
41+
.AddSingleton(connectionFactoryMock.Object)
42+
.AddSingleton(callerMock.Object)
43+
.AddRabbitMqClient(GetClientOptions())
44+
.AddConsumptionExchange(DefaultExchangeName, GetExchangeOptions())
45+
.AddMessageHandlerTransient<StubMessageHandler>(FirstRoutingKey)
46+
.AddNonCyclicMessageHandlerTransient<StubNonCyclicMessageHandler>(FirstRoutingKey)
47+
.AddAsyncMessageHandlerTransient<StubAsyncMessageHandler>(SecondRoutingKey)
48+
.AddAsyncNonCyclicMessageHandlerTransient<StubAsyncNonCyclicMessageHandler>(SecondRoutingKey);
49+
50+
var serviceProvider = serviceCollection.BuildServiceProvider();
51+
var queueService = serviceProvider.GetRequiredService<IQueueService>();
52+
queueService.StartConsuming();
53+
54+
var resetEvent = new AutoResetEvent(false);
55+
consumer.Received += (sender, @event) =>
56+
{
57+
resetEvent.Set();
58+
return Task.CompletedTask;
59+
};
60+
61+
await queueService.SendAsync(new { Message = "message" }, DefaultExchangeName, FirstRoutingKey);
62+
resetEvent.WaitOne(_globalTestsTimeout);
63+
callerMock.Verify(x => x.Call(It.IsAny<string>()), Times.Exactly(2));
64+
65+
await queueService.SendAsync(new { Message = "message" }, DefaultExchangeName, SecondRoutingKey);
66+
resetEvent.WaitOne(_globalTestsTimeout);
67+
callerMock.Verify(x => x.CallAsync(It.IsAny<string>()), Times.Exactly(2));
68+
}
69+
70+
static RabbitMqClientOptions GetClientOptions() =>
71+
new RabbitMqClientOptions
72+
{
73+
HostName = "rabbitmq",
74+
Port = 5672,
75+
UserName = "guest",
76+
Password = "guest",
77+
VirtualHost = "/"
78+
};
79+
80+
static RabbitMqExchangeOptions GetExchangeOptions() =>
81+
new RabbitMqExchangeOptions
82+
{
83+
Type = "direct",
84+
DeadLetterExchange = "exchange.dlx",
85+
Queues = new List<RabbitMqQueueOptions>
86+
{
87+
new RabbitMqQueueOptions
88+
{
89+
Name = "test.queue",
90+
RoutingKeys = new HashSet<string> { FirstRoutingKey, SecondRoutingKey }
91+
}
92+
}
93+
};
94+
}
95+
}

tests/RabbitMQ.Client.Core.DependencyInjection.Tests/UnitTests/Stubs/IStubCaller.cs renamed to tests/RabbitMQ.Client.Core.DependencyInjection.Tests/Stubs/IStubCaller.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
2+
using System.Threading.Tasks;
23

3-
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.UnitTests.Stubs
4+
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.Stubs
45
{
56
public interface IStubCaller
67
{
@@ -9,5 +10,7 @@ public interface IStubCaller
910
void Call(ReadOnlyMemory<byte> message);
1011

1112
void Call(string message);
13+
14+
Task CallAsync(string message);
1215
}
1316
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System.Threading.Tasks;
2+
using RabbitMQ.Client.Core.DependencyInjection.MessageHandlers;
3+
4+
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.Stubs
5+
{
6+
public class StubAsyncMessageHandler : IAsyncMessageHandler
7+
{
8+
readonly IStubCaller _caller;
9+
10+
public StubAsyncMessageHandler(IStubCaller caller)
11+
{
12+
_caller = caller;
13+
}
14+
15+
public async Task Handle(string message, string routingKey)
16+
{
17+
await _caller.CallAsync($"{message}:{routingKey}");
18+
}
19+
}
20+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System.Threading.Tasks;
2+
using RabbitMQ.Client.Core.DependencyInjection.MessageHandlers;
3+
using RabbitMQ.Client.Core.DependencyInjection.Services;
4+
5+
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.Stubs
6+
{
7+
public class StubAsyncNonCyclicMessageHandler : IAsyncNonCyclicMessageHandler
8+
{
9+
readonly IStubCaller _caller;
10+
11+
public StubAsyncNonCyclicMessageHandler(IStubCaller caller)
12+
{
13+
_caller = caller;
14+
}
15+
16+
public async Task Handle(string message, string routingKey, IQueueService queueService)
17+
{
18+
await _caller.CallAsync($"{message}:{routingKey}:{queueService.GetType()}");
19+
}
20+
}
21+
}

tests/RabbitMQ.Client.Core.DependencyInjection.Tests/UnitTests/Stubs/StubBaseBatchMessageHandler.cs renamed to tests/RabbitMQ.Client.Core.DependencyInjection.Tests/Stubs/StubBaseBatchMessageHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
using RabbitMQ.Client.Core.DependencyInjection.Models;
88
using RabbitMQ.Client.Core.DependencyInjection.Services;
99

10-
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.UnitTests.Stubs
10+
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.Stubs
1111
{
1212
public class StubBaseBatchMessageHandler : BaseBatchMessageHandler
1313
{

tests/RabbitMQ.Client.Core.DependencyInjection.Tests/UnitTests/Stubs/StubBatchMessageHandler.cs renamed to tests/RabbitMQ.Client.Core.DependencyInjection.Tests/Stubs/StubBatchMessageHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using RabbitMQ.Client.Core.DependencyInjection.Models;
77
using RabbitMQ.Client.Core.DependencyInjection.Services;
88

9-
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.UnitTests.Stubs
9+
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.Stubs
1010
{
1111
public class StubBatchMessageHandler : BatchMessageHandler
1212
{
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using RabbitMQ.Client.Core.DependencyInjection.MessageHandlers;
2+
3+
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.Stubs
4+
{
5+
public class StubMessageHandler : IMessageHandler
6+
{
7+
readonly IStubCaller _caller;
8+
9+
public StubMessageHandler(IStubCaller caller)
10+
{
11+
_caller = caller;
12+
}
13+
14+
public void Handle(string message, string routingKey)
15+
{
16+
_caller.Call($"{message}:{routingKey}");
17+
}
18+
}
19+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using RabbitMQ.Client.Core.DependencyInjection.MessageHandlers;
2+
using RabbitMQ.Client.Core.DependencyInjection.Services;
3+
4+
namespace RabbitMQ.Client.Core.DependencyInjection.Tests.Stubs
5+
{
6+
public class StubNonCyclicMessageHandler : INonCyclicMessageHandler
7+
{
8+
readonly IStubCaller _caller;
9+
10+
public StubNonCyclicMessageHandler(IStubCaller caller)
11+
{
12+
_caller = caller;
13+
}
14+
15+
public void Handle(string message, string routingKey, IQueueService queueService)
16+
{
17+
_caller.Call($"{message}:{routingKey}:{queueService.GetType()}");
18+
}
19+
}
20+
}

tests/RabbitMQ.Client.Core.DependencyInjection.Tests/UnitTests/BaseBatchMessageHandlerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
using RabbitMQ.Client.Core.DependencyInjection.Configuration;
99
using RabbitMQ.Client.Core.DependencyInjection.Models;
1010
using RabbitMQ.Client.Core.DependencyInjection.Services;
11-
using RabbitMQ.Client.Core.DependencyInjection.Tests.UnitTests.Stubs;
11+
using RabbitMQ.Client.Core.DependencyInjection.Tests.Stubs;
1212
using RabbitMQ.Client.Events;
1313
using Xunit;
1414

0 commit comments

Comments
 (0)