|
3 | 3 | using JasperFx.Core; |
4 | 4 | using Microsoft.Extensions.Configuration; |
5 | 5 | using Microsoft.Extensions.Hosting; |
| 6 | +using NSubstitute; |
6 | 7 | using NSubstitute.ReceivedExtensions; |
7 | 8 | using Oakton.Resources; |
8 | 9 | using Shouldly; |
9 | 10 | using Wolverine.ComplianceTests.Compliance; |
| 11 | +using Wolverine.Configuration; |
| 12 | +using Wolverine.RabbitMQ.Internal; |
10 | 13 | using Wolverine.Tracking; |
| 14 | +using Wolverine.Transports; |
11 | 15 | using Wolverine.Transports.Sending; |
12 | 16 | using Xunit; |
13 | 17 |
|
@@ -49,6 +53,14 @@ public async Task InitializeAsync() |
49 | 53 | // Listen for multiples |
50 | 54 | opts.ListenToRabbitQueue("multi_response"); |
51 | 55 |
|
| 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 | + |
52 | 64 | opts.PublishMessage<MultiTenantMessage>().ToRabbitQueue("multi_incoming"); |
53 | 65 |
|
54 | 66 | opts.Services.AddResourceSetupOnStartup(); |
@@ -151,6 +163,90 @@ public async Task send_message_to_a_specific_tenant() |
151 | 163 | response.Envelope.Message.ShouldBeOfType<MultiTenantResponse>() |
152 | 164 | .Id.ShouldBe(message.Id); |
153 | 165 | } |
| 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 | + } |
154 | 250 | } |
155 | 251 |
|
156 | 252 | public static class MultiTenantedRabbitMqSamples |
@@ -198,6 +294,13 @@ public static async Task Configure() |
198 | 294 | // brokers |
199 | 295 | opts.ListenToRabbitQueue("incoming"); |
200 | 296 |
|
| 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 | + |
201 | 304 | // More on this in the docs.... |
202 | 305 | opts.PublishMessage<Message1>() |
203 | 306 | .ToRabbitQueue("outgoing"); |
|
0 commit comments