Skip to content

Commit 1419085

Browse files
committed
Added test coverage on correct construction of global vs tenant aware senders and listeners when Rabbit MQ is multi-tenanted
1 parent 9becd10 commit 1419085

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/multi_tenancy_through_virtual_hosts.cs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
using JasperFx.Core;
44
using Microsoft.Extensions.Configuration;
55
using Microsoft.Extensions.Hosting;
6+
using NSubstitute;
67
using NSubstitute.ReceivedExtensions;
78
using Oakton.Resources;
89
using Shouldly;
910
using Wolverine.ComplianceTests.Compliance;
11+
using Wolverine.Configuration;
12+
using Wolverine.RabbitMQ.Internal;
1013
using Wolverine.Tracking;
14+
using Wolverine.Transports;
1115
using Wolverine.Transports.Sending;
1216
using Xunit;
1317

@@ -49,6 +53,14 @@ public async Task InitializeAsync()
4953
// Listen for multiples
5054
opts.ListenToRabbitQueue("multi_response");
5155

56+
opts.ListenToRabbitQueue("global_response").GlobalListener();
57+
58+
// Really just using this to test the construction of senders and listeners
59+
opts.PublishMessage<Message1>().ToRabbitQueue("message1");
60+
opts.PublishMessage<Message2>().ToRabbitQueue("message2").GlobalSender();
61+
opts.PublishMessage<Message3>().ToRabbitExchange("message3");
62+
opts.PublishMessage<Message4>().ToRabbitExchange("message4").GlobalSender();
63+
5264
opts.PublishMessage<MultiTenantMessage>().ToRabbitQueue("multi_incoming");
5365

5466
opts.Services.AddResourceSetupOnStartup();
@@ -151,6 +163,90 @@ public async Task send_message_to_a_specific_tenant()
151163
response.Envelope.Message.ShouldBeOfType<MultiTenantResponse>()
152164
.Id.ShouldBe(message.Id);
153165
}
166+
167+
/*
168+
169+
opts.PublishMessage<Message3>().ToRabbitExchange("message3");
170+
opts.PublishMessage<Message4>().ToRabbitExchange("message4").GlobalSender();
171+
*/
172+
173+
[Fact]
174+
public void build_compound_sender_for_tenant_aware_exchange()
175+
{
176+
var runtime = _fixture.Main.GetRuntime();
177+
var transport = runtime.Options.Transports.GetOrCreate<RabbitMqTransport>();
178+
var exchange = transport.Exchanges["message3"];
179+
exchange.TenancyBehavior.ShouldBe(TenancyBehavior.TenantAware);
180+
181+
var sender = exchange.ResolveSender(runtime);
182+
sender.ShouldBeOfType<TenantedSender>();
183+
}
184+
185+
[Fact]
186+
public void build_simple_sender_for_global_exchange()
187+
{
188+
var runtime = _fixture.Main.GetRuntime();
189+
var transport = runtime.Options.Transports.GetOrCreate<RabbitMqTransport>();
190+
var exchange = transport.Exchanges["message4"];
191+
exchange.TenancyBehavior.ShouldBe(TenancyBehavior.Global);
192+
193+
var sender = exchange.ResolveSender(runtime);
194+
sender.ShouldBeOfType<RabbitMqSender>();
195+
}
196+
197+
[Fact]
198+
public void build_compound_sender_for_tenant_aware_queue()
199+
{
200+
var runtime = _fixture.Main.GetRuntime();
201+
var transport = runtime.Options.Transports.GetOrCreate<RabbitMqTransport>();
202+
var queue = transport.Queues["message1"];
203+
queue.TenancyBehavior.ShouldBe(TenancyBehavior.TenantAware);
204+
205+
var sender = queue.ResolveSender(runtime);
206+
sender.ShouldBeOfType<TenantedSender>();
207+
}
208+
209+
[Fact]
210+
public void build_simple_sender_for_global_queue()
211+
{
212+
var runtime = _fixture.Main.GetRuntime();
213+
var transport = runtime.Options.Transports.GetOrCreate<RabbitMqTransport>();
214+
var queue = transport.Queues["message2"];
215+
queue.TenancyBehavior.ShouldBe(TenancyBehavior.Global);
216+
217+
var sender = queue.ResolveSender(runtime);
218+
sender.ShouldBeOfType<RabbitMqSender>();
219+
}
220+
221+
[Fact]
222+
public async Task opt_into_global_listener_for_queue()
223+
{
224+
var runtime = _fixture.Main.GetRuntime();
225+
var transport = runtime.Options.Transports.GetOrCreate<RabbitMqTransport>();
226+
var queue = transport.Queues["global_response"];
227+
queue.TenancyBehavior.ShouldBe(TenancyBehavior.Global);
228+
229+
var receiver = Substitute.For<IReceiver>();
230+
var listener = await queue.BuildListenerAsync(runtime, receiver);
231+
232+
// Not parallel
233+
listener.ShouldBeOfType<RabbitMqListener>();
234+
}
235+
236+
[Fact]
237+
public async Task use_tenanted_for_listener_when_appropriate()
238+
{
239+
var runtime = _fixture.Main.GetRuntime();
240+
var transport = runtime.Options.Transports.GetOrCreate<RabbitMqTransport>();
241+
var queue = transport.Queues["multi_response"];
242+
queue.TenancyBehavior.ShouldBe(TenancyBehavior.TenantAware);
243+
244+
var receiver = Substitute.For<IReceiver>();
245+
var listener = await queue.BuildListenerAsync(runtime, receiver);
246+
247+
// Not parallel
248+
listener.ShouldBeOfType<CompoundListener>();
249+
}
154250
}
155251

156252
public static class MultiTenantedRabbitMqSamples
@@ -198,6 +294,13 @@ public static async Task Configure()
198294
// brokers
199295
opts.ListenToRabbitQueue("incoming");
200296

297+
opts.ListenToRabbitQueue("incoming_global")
298+
299+
// This opts this queue out from being per-tenant, such that
300+
// there will only be the single "incoming_global" queue for the default
301+
// broker connection
302+
.GlobalListener();
303+
201304
// More on this in the docs....
202305
opts.PublishMessage<Message1>()
203306
.ToRabbitQueue("outgoing");

0 commit comments

Comments
 (0)