@@ -16,20 +16,55 @@ namespace Liquid.Messaging.RabbitMq.Tests
1616 public class RabbitMqConsumerTest : RabbitMqConsumer < MessageMock >
1717 {
1818 public static readonly IRabbitMqFactory _factory = Substitute . For < IRabbitMqFactory > ( ) ;
19- public static readonly IOptions < RabbitMqConsumerSettings > _settings = GetOptions ( ) ;
20-
19+ public static IOptions < RabbitMqConsumerSettings > _settings = GetOptions ( ) ;
20+ public static RabbitMqConsumerSettings _settingsValue ;
2121 public static IOptions < RabbitMqConsumerSettings > GetOptions ( )
2222 {
2323 var settings = Substitute . For < IOptions < RabbitMqConsumerSettings > > ( ) ;
24- settings . Value . Returns ( new RabbitMqConsumerSettings ( ) ) ;
24+
25+ _settingsValue = new RabbitMqConsumerSettings
26+ {
27+ CompressMessage = true ,
28+ Exchange = "test" ,
29+ Queue = "test" ,
30+ AdvancedSettings = new AdvancedSettings
31+ {
32+ AutoAck = false ,
33+ QueueAckModeSettings = new QueueAckModeSettings ( ) { QueueAckMode = QueueAckModeEnum . BasicAck , Requeue = true }
34+ }
35+ } ;
36+ settings . Value . Returns ( _settingsValue ) ;
2537 return settings ;
2638 }
2739
2840 public RabbitMqConsumerTest ( )
2941 : base ( _factory , _settings )
3042 {
43+ var model = Substitute . For < IModel > ( ) ;
44+ _factory . GetReceiver ( Arg . Any < RabbitMqConsumerSettings > ( ) ) . Returns ( model ) ;
45+ }
46+
47+ [ Fact ]
48+ public void Constructor_WhenFactoryIsNull_ThrowArgumentNullException ( )
49+ {
50+ Assert . Throws < ArgumentNullException > ( ( ) => new RabbitMqConsumer < MessageMock > ( null , _settings ) ) ;
3151 }
3252
53+ [ Fact ]
54+ public void Constructor_WhenSettingsIsNull_ThrowArgumentNullException ( )
55+ {
56+ Assert . Throws < ArgumentNullException > ( ( ) => new RabbitMqConsumer < MessageMock > ( _factory , null ) ) ;
57+ }
58+
59+ [ Fact ]
60+ public void Constructor_WhenSettingsValueIsNull_ThrowArgumentNullException ( )
61+ {
62+ var settings = Substitute . For < IOptions < RabbitMqConsumerSettings > > ( ) ;
63+ settings . Value . Returns ( ( RabbitMqConsumerSettings ) null ) ;
64+ Assert . Throws < ArgumentNullException > ( ( ) => new RabbitMqConsumer < MessageMock > ( _factory , settings ) ) ;
65+ }
66+
67+
3368 [ Fact ]
3469 public void RegisterMessageHandler_WhenRegisteredSucessfully_BasicConsumeReceivedCall ( )
3570 {
@@ -66,10 +101,73 @@ public async Task MessageHandler_WhenProcessExecutedSucessfully()
66101 _factory . GetReceiver ( Arg . Any < RabbitMqConsumerSettings > ( ) ) . Returns ( messageReceiver ) ;
67102
68103 ConsumeMessageAsync += ProcessMessageAsyncMock ;
104+ await RegisterMessageHandler ( ) ;
105+ await MessageHandler ( message , new CancellationToken ( ) ) ;
106+ }
107+
108+ [ Fact ]
109+ public async Task MessageHandler_CallsConsumeMessageAsync_AndAcks_WhenAutoAckIsFalse ( )
110+ {
111+ var message = new BasicDeliverEventArgs ( ) ;
112+ var entity = new MessageMock ( ) { TestMessageId = 1 } ;
113+ message . Body = entity . ToJsonBytes ( ) ;
114+ var messageReceiver = Substitute . For < IModel > ( ) ;
115+ ConsumeMessageAsync += ProcessMessageAsyncMock ;
116+ _factory . GetReceiver ( Arg . Any < RabbitMqConsumerSettings > ( ) ) . Returns ( messageReceiver ) ;
117+
118+ await RegisterMessageHandler ( ) ;
119+
120+ await MessageHandler ( message , new CancellationToken ( ) ) ;
121+ messageReceiver . Received ( 1 ) . BasicAck ( message . DeliveryTag , false ) ;
69122
123+ }
124+
125+ [ Fact ]
126+ public async Task MessageHandler_CallsConsumeMessageAsync_AndNacks_WhenAutoAckIsFalse ( )
127+ {
128+ var message = new BasicDeliverEventArgs ( ) ;
129+ var entity = new MessageMock ( ) { TestMessageId = 2 } ;
130+ message . Body = entity . ToJsonBytes ( ) ;
131+ var messageReceiver = Substitute . For < IModel > ( ) ;
132+ ConsumeMessageAsync += ProcessMessageAsyncMock ;
133+ _factory . GetReceiver ( Arg . Any < RabbitMqConsumerSettings > ( ) ) . Returns ( messageReceiver ) ;
134+
135+ await RegisterMessageHandler ( ) ;
70136 await MessageHandler ( message , new CancellationToken ( ) ) ;
137+ messageReceiver . Received ( 1 ) . BasicNack ( message . DeliveryTag , false , true ) ;
71138 }
72139
140+ [ Fact ]
141+ public async Task MessageHandler_CallsConsumeMessageAsync_AndRejects_WhenAutoAckIsFalse ( )
142+ {
143+ var message = new BasicDeliverEventArgs ( ) ;
144+ var entity = new MessageMock ( ) { TestMessageId = 2 } ;
145+ message . Body = entity . ToJsonBytes ( ) ;
146+ var messageReceiver = Substitute . For < IModel > ( ) ;
147+ ConsumeMessageAsync += ProcessMessageAsyncMock ;
148+
149+ _factory . GetReceiver ( Arg . Any < RabbitMqConsumerSettings > ( ) ) . Returns ( messageReceiver ) ;
150+
151+ _settingsValue = new RabbitMqConsumerSettings
152+ {
153+ CompressMessage = true ,
154+ Exchange = "test" ,
155+ Queue = "test" ,
156+ AdvancedSettings = new AdvancedSettings
157+ {
158+ AutoAck = false ,
159+ QueueAckModeSettings = new QueueAckModeSettings ( ) { QueueAckMode = QueueAckModeEnum . BasicReject , Requeue = true }
160+ }
161+ } ;
162+
163+ _settings . Value . Returns ( _settingsValue ) ;
164+
165+ await RegisterMessageHandler ( ) ;
166+
167+ await MessageHandler ( message , new CancellationToken ( ) ) ;
168+ messageReceiver . Received ( 1 ) . BasicReject ( message . DeliveryTag , true ) ;
169+ }
170+
73171#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
74172 private async Task ProcessMessageAsyncMock ( ConsumerMessageEventArgs < MessageMock > args , CancellationToken cancellationToken )
75173#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
0 commit comments