public void ShouldNotAckOrNackOnAutoAcknowledgement()
        {
            // GIVEN - An autoAck consumer
            var serviceCollectionFactory = new ServiceCollection();

            // Make singleton so we can assert that the method ran
            serviceCollectionFactory.AddSingleton <ConsumerController>();
            serviceCollectionFactory.AddTransient <IByteConversionService, ByteConversionService>();
            serviceCollectionFactory.AddTransient <IInvocationParameterService, InvocationParameterService>();

            var serviceCollection = serviceCollectionFactory.BuildServiceProvider();

            var consumerMethod = new ConsumerMethod(
                typeof(ConsumerController).GetMethod("Consume"),
                typeof(ConsumerController),
                new RabbitConsumerAttribute(
                    queueName: "consumerQueue",
                    acknowledgementType: AcknowledgementType.AutoAck),
                null
                );

            var mockModel = new Mock <IModel>();
            var logger    = TestLogger.CreateXUnit <RabbitConsumer>(this.output);

            var eventArgs = new BasicDeliverEventArgs();

            // WHEN - The consumer consumes a message
            var rabbitConsumer = new RabbitConsumer(
                consumerMethod,
                mockModel.Object,
                null,
                serviceCollection,
                logger
                );

            rabbitConsumer.RecievedEventHandler(null, eventArgs);

            // THEN - Neither BasicAck nor BasicNack should be called
            var service = serviceCollection.GetRequiredService <ConsumerController>();

            Assert.True(service.ConsumeCalled);

            mockModel.Verify(m => m.BasicConsume(
                                 It.IsAny <string>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <string>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <IDictionary <string, object> >(),
                                 It.IsAny <EventingBasicConsumer>()
                                 )
                             );
            mockModel.VerifyNoOtherCalls();
        }
        public void ShouldStartConsumerOnQueueNameFromConfiguration()
        {
            // GIVEN
            var configKey  = "Config:Key:For:QueueName";
            var configVal  = "nameOfQueue";
            var configDict = new Dictionary <string, string>()
            {
                { configKey, configVal }
            };
            var configuration = new ConfigurationBuilder()
                                .AddInMemoryCollection(configDict)
                                .Build();

            Mock <IModel> model  = new Mock <IModel>();
            var           logger = TestLogger.CreateXUnit <RabbitConsumer>(output);

            RabbitConsumerAttribute consumerAttribute = new RabbitConsumerAttribute(
                "{" + configKey + "}",
                acknowledgementType: AcknowledgementType.ManualAck,
                false
                );

            ConsumerMethod method = new ConsumerMethod(
                this.GetType().GetMethods().First(),  // Just use any old method
                this.GetType(),
                consumerAttribute,
                null
                );

            // WHEN
            new RabbitConsumer(method, model.Object, configuration, null, logger);

            // THEN
            model.Verify(m =>
                         m.BasicConsume(
                             It.Is <string>(s => s == configVal),
                             It.Is <bool>(b => b == false),
                             It.IsAny <string>(),
                             It.IsAny <bool>(),
                             It.IsAny <bool>(),
                             It.IsAny <IDictionary <string, object> >(),
                             It.IsAny <EventingBasicConsumer>()
                             )
                         );
            model.VerifyNoOtherCalls();
        }
Ejemplo n.º 3
0
        public object[] GetParameterList(ConsumerMethod method, BasicDeliverEventArgs eventArgs, IModel model)
        {
            List <object> paramList = new List <object>();

            foreach (var param in method.Method.GetParameters())
            {
                if (param.IsDefined(typeof(FromBodyAttribute), false))
                {
                    paramList.Add(this.byteConversionService.ConvertFromByteArray(eventArgs.Body, param.ParameterType));
                }
                else if (param.IsDefined(typeof(FromDeliveryTagAttribute), false))
                {
                    paramList.Add(eventArgs.DeliveryTag);
                }
                else if (param.IsDefined(typeof(FromModelAttribute), false))
                {
                    paramList.Add(model);
                }
                else if (param.IsDefined(typeof(FromBasicPropertiesAttribute), false))
                {
                    paramList.Add(eventArgs.BasicProperties);
                }
                else if (param.IsDefined(typeof(FromConsumerTagAttribute), false))
                {
                    paramList.Add(eventArgs.ConsumerTag);
                }
                else if (param.IsDefined(typeof(FromExchangeAttribute), false))
                {
                    paramList.Add(eventArgs.Exchange);
                }
                else if (param.IsDefined(typeof(FromRedeliveredAttribute), false))
                {
                    paramList.Add(eventArgs.Redelivered);
                }
                else if (param.IsDefined(typeof(FromRoutingKeyAttribute), false))
                {
                    paramList.Add(eventArgs.RoutingKey);
                }
            }

            return(paramList.ToArray());
        }
        public void ShouldInvokeConsumer()
        {
            // GIVEN
            var serviceCollectionFactory = new ServiceCollection();

            // Make singleton so we can assert that the method ran
            serviceCollectionFactory.AddSingleton <ConsumerController>();
            serviceCollectionFactory.AddTransient <IByteConversionService, ByteConversionService>();
            serviceCollectionFactory.AddTransient <IInvocationParameterService, InvocationParameterService>();

            var serviceCollection = serviceCollectionFactory.BuildServiceProvider();

            var consumerMethod = new ConsumerMethod(
                typeof(ConsumerController).GetMethod("Consume"),
                typeof(ConsumerController),
                new RabbitConsumerAttribute("consumerQueue"),
                null
                );

            var mockModel = new Mock <IModel>();
            var logger    = TestLogger.CreateXUnit <RabbitConsumer>(this.output);

            var eventArgs = new BasicDeliverEventArgs();

            // WHEN
            var rabbitConsumer = new RabbitConsumer(
                consumerMethod,
                mockModel.Object,
                null,
                serviceCollection,
                logger
                );

            rabbitConsumer.RecievedEventHandler(null, eventArgs);

            // THEN
            var service = serviceCollection.GetRequiredService <ConsumerController>();

            Assert.True(service.ConsumeCalled);
        }
        public void AckOnInvokeShouldStartConsumerWithoutAutoAck()
        {
            // GIVEN
            var queueName = "queueName";

            Mock <IModel> model  = new Mock <IModel>();
            var           logger = TestLogger.CreateXUnit <RabbitConsumer>(output);

            RabbitConsumerAttribute consumerAttribute = new RabbitConsumerAttribute(
                queueName,
                acknowledgementType: AcknowledgementType.AckOnInvoke,
                false
                );

            ConsumerMethod method = new ConsumerMethod(
                this.GetType().GetMethods().First(),  // Just use any old method
                this.GetType(),
                consumerAttribute,
                null
                );

            // WHEN
            new RabbitConsumer(method, model.Object, null, null, logger);

            // THEN
            model.Verify(m =>
                         m.BasicConsume(
                             It.Is <string>(s => s == queueName),
                             It.Is <bool>(b => b == false),
                             It.IsAny <string>(),
                             It.IsAny <bool>(),
                             It.IsAny <bool>(),
                             It.IsAny <IDictionary <string, object> >(),
                             It.IsAny <EventingBasicConsumer>()
                             )
                         );
            model.VerifyNoOtherCalls();
        }
        public void ShouldPublishToConfiguredExchange()
        {
            // GIVEN - A consumer which will publish the returned value
            var routingKeyConfigKey   = "Config:Key:For:RoutingKey";
            var routingKeyConfigVal   = "routingKey";
            var exchangeNameConfigKey = "Config:Key:For:ExchangeName";
            var exchangeNameConfigVal = "exchangeName";
            var configDict            = new Dictionary <string, string>()
            {
                { routingKeyConfigKey, routingKeyConfigVal },
                { exchangeNameConfigKey, exchangeNameConfigVal }
            };
            var configuration = new ConfigurationBuilder()
                                .AddInMemoryCollection(configDict)
                                .Build();

            var serviceCollectionFactory = new ServiceCollection();

            // Make singleton so we can assert that the method ran
            serviceCollectionFactory.AddSingleton <ConsumerController>(new ConsumerController(returnValue: "returnValue"));
            serviceCollectionFactory.AddTransient <IByteConversionService, ByteConversionService>();
            serviceCollectionFactory.AddTransient <IInvocationParameterService, InvocationParameterService>();

            var serviceCollection = serviceCollectionFactory.BuildServiceProvider();

            var consumerMethod = new ConsumerMethod(
                typeof(ConsumerController).GetMethod("Consume"),
                typeof(ConsumerController),
                new RabbitConsumerAttribute(
                    queueName: "consumerQueue",
                    acknowledgementType: AcknowledgementType.AutoAck,
                    nackOnException: true),
                new RabbitPublisherAttribute(
                    routingKey: "{" + routingKeyConfigKey + "}",
                    exchangeName: "{" + exchangeNameConfigKey + "}"
                    )
                );

            var mockModel = new Mock <IModel>();
            var logger    = TestLogger.CreateXUnit <RabbitConsumer>(this.output);

            var eventArgs = new BasicDeliverEventArgs()
            {
                DeliveryTag = 99
            };

            // WHEN - The consumer consumes a message
            var rabbitConsumer = new RabbitConsumer(
                consumerMethod,
                mockModel.Object,
                configuration,
                serviceCollection,
                logger
                );

            rabbitConsumer.RecievedEventHandler(null, eventArgs);

            // THEN - Ack should be called but it will throw exception so nack will be called
            var service = serviceCollection.GetRequiredService <ConsumerController>();

            Assert.True(service.ConsumeCalled);

            mockModel.Verify(m => m.BasicConsume(
                                 It.IsAny <string>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <string>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <IDictionary <string, object> >(),
                                 It.IsAny <EventingBasicConsumer>()
                                 )
                             );
            mockModel.Verify(m => m.BasicPublish(
                                 It.Is <string>(s => s == exchangeNameConfigVal),
                                 It.Is <string>(s => s == routingKeyConfigVal),
                                 It.IsAny <bool>(),
                                 It.IsAny <IBasicProperties>(),
                                 It.IsAny <byte[]>()
                                 ));
            mockModel.VerifyNoOtherCalls();
        }
        public void ShouldNackOnInvocationException()
        {
            // GIVEN - An ack on invoke consumer, throw exception when acking
            ulong deliveryTag = 99;

            var serviceCollectionFactory = new ServiceCollection();

            // Make singleton so we can assert that the method ran
            serviceCollectionFactory.AddSingleton <ConsumerController>(new ConsumerController(throwException: true));
            //serviceCollectionFactory.AddSingleton<ConsumerController>();
            serviceCollectionFactory.AddTransient <IByteConversionService, ByteConversionService>();
            serviceCollectionFactory.AddTransient <IInvocationParameterService, InvocationParameterService>();

            var serviceCollection = serviceCollectionFactory.BuildServiceProvider();

            var consumerMethod = new ConsumerMethod(
                typeof(ConsumerController).GetMethod("Consume"),
                typeof(ConsumerController),
                new RabbitConsumerAttribute(
                    queueName: "consumerQueue",
                    acknowledgementType: AcknowledgementType.AckOnPublish,
                    nackOnException: true),
                null
                );

            var mockModel = new Mock <IModel>();
            var logger    = TestLogger.CreateXUnit <RabbitConsumer>(this.output);

            var eventArgs = new BasicDeliverEventArgs()
            {
                DeliveryTag = deliveryTag
            };

            // WHEN - The consumer consumes a message
            var rabbitConsumer = new RabbitConsumer(
                consumerMethod,
                mockModel.Object,
                null,
                serviceCollection,
                logger
                );

            Assert.Throws <TargetInvocationException>(() => {
                rabbitConsumer.RecievedEventHandler(null, eventArgs);
            });

            // THEN - Ack should be called but it will throw exception so nack will be called
            var service = serviceCollection.GetRequiredService <ConsumerController>();

            Assert.True(service.ConsumeCalled);

            mockModel.Verify(m => m.BasicConsume(
                                 It.IsAny <string>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <string>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <IDictionary <string, object> >(),
                                 It.IsAny <EventingBasicConsumer>()
                                 )
                             );
            mockModel.Verify(m => m.BasicNack(
                                 It.Is <ulong>(l => l == deliveryTag),
                                 It.IsAny <bool>(),
                                 It.IsAny <bool>()
                                 ));
            mockModel.VerifyNoOtherCalls();
        }