public void When_called_should_execute_methods_on_message_handler()
        {
            // Arrange
            var channel = Substitute.For<IModel>();
            var handler = Substitute.For<IMessageHandler>();
            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => Thread.Sleep(100));

            var consumer = new PriorityBurrowConsumer(channel, handler, Substitute.For<IRabbitWatcher>(), true, 1);

            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(channel) { ConsumerTag = "Burrow" });
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());
            consumer.Ready();


            // Action
            consumer.HandleMessageDelivery(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For<IBasicProperties>()
            });

            // Assert
            handler.Received(1).HandleMessage(consumer, Arg.Any<BasicDeliverEventArgs>());
            consumer.Dispose();
        }
        public void When_called_should_catch_all_exception()
        {
            // Arrange
            var blockTheThread = new AutoResetEvent(false);
            var waitForFirstDequeue = new AutoResetEvent(false);

            var channel = Substitute.For<IModel>();
            var msgHandler = Substitute.For<IMessageHandler>();
            msgHandler.When(x => x.HandleMessage(Arg.Any<IBasicConsumer>(), Arg.Any<BasicDeliverEventArgs>()))
                      .Do(callInfo => { throw new Exception(); });

            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => { waitForFirstDequeue.Set(); blockTheThread.WaitOne(); });

            var consumer = new PriorityBurrowConsumer(channel, msgHandler, Substitute.For<IRabbitWatcher>(), true, 1);

            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(channel) { ConsumerTag = "Burrow" });
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());
            consumer.Ready();


            // Action
            waitForFirstDequeue.WaitOne();
            consumer.HandleMessageDelivery(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For<IBasicProperties>(),
                ConsumerTag = "Burrow"
            });

            // Assert
            msgHandler.Received().HandleError(Arg.Any<IBasicConsumer>(), Arg.Any<BasicDeliverEventArgs>(), Arg.Any<Exception>());
            consumer.Dispose();
            blockTheThread.Set();
        }
        public void When_called_should_throw_BadMessageHandlerException_if_handler_error()
        {
            // Arrange
            var waitHandler = new ManualResetEvent(false);
            var watcher = Substitute.For<IRabbitWatcher>();
            var channel = Substitute.For<IModel>();
            channel.IsOpen.Returns(true);
            var msgHandler = Substitute.For<IMessageHandler>();
            msgHandler.When(x => x.HandleMessage(Arg.Any<BasicDeliverEventArgs>())).Do(callInfo =>{
                waitHandler.Set();
                throw new Exception("Bad excepton");
            });

            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => waitHandler.WaitOne());

            var consumer = new PriorityBurrowConsumer(channel, msgHandler, watcher, true, 1);

            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(channel) { ConsumerTag = "Burrow" });
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());
            consumer.Ready();


            // Action
            try
            {
                consumer.HandleMessageDelivery(new BasicDeliverEventArgs
                {
                    BasicProperties = Substitute.For<IBasicProperties>(),
                    ConsumerTag = "Burrow"
                });
            }
            catch (BadMessageHandlerException)
            {
                waitHandler.Set();
            }
        }