public void ConsumerCallsBasicAckWithDeliveryTag(long deliveryTagLong)
        {
            // Arrange
            ulong deliveryTag = UInt64.Parse(deliveryTagLong.ToString());

            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);
            modelMock.Setup(e => e.CreateBasicProperties()).Returns(new BasicProperties());

            var receiver = new RabbitMqCommandReceiver(contextMock.Object, "test.queue");

            IBasicConsumer consumer = null;

            // Retrieve consumer from callback
            modelMock.Setup(e => e.BasicConsume("test.queue", false, It.IsAny <string>(), false, false, null, It.IsAny <IBasicConsumer>()))
            .Callback <string, bool, string, bool, bool, IDictionary <string, object>, IBasicConsumer>((a, b, c, d, e, f, givenConsumer) => consumer = givenConsumer);

            var properties = new BasicProperties {
                CorrelationId = Guid.NewGuid().ToString()
            };

            receiver.DeclareCommandQueue();
            receiver.StartReceivingCommands(e => new CommandMessage());

            // Act
            consumer.HandleBasicDeliver(It.IsAny <string>(), deliveryTag, false, "test.exchange", "test.queue", properties, new byte[0]);

            // Assert
            modelMock.Verify(e => e.BasicAck(deliveryTag, false));
        }
        public void DeclareCommandQueueTwiceThrowsException(string queueName)
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);

            var receiver = new RabbitMqCommandReceiver(contextMock.Object, queueName);

            receiver.DeclareCommandQueue();

            // Act
            void Act() => receiver.DeclareCommandQueue();

            // Assert
            var exception = Assert.ThrowsException <BusConfigurationException>(Act);

            Assert.AreEqual($"Queue {queueName} has already been declared!", exception.Message);
        }
        public void ExceptionIsProperlyHandled(string exceptionMessage)
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            contextMock.SetupGet(e => e.ExchangeName).Returns("test.exchange");
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);
            modelMock.Setup(e => e.CreateBasicProperties()).Returns(new BasicProperties());

            var receiver = new RabbitMqCommandReceiver(contextMock.Object, "test.queue");

            IBasicConsumer consumer = null;

            // Retrieve consumer from callback
            modelMock.Setup(e => e.BasicConsume("test.queue", false, It.IsAny <string>(), false, false, null, It.IsAny <IBasicConsumer>()))
            .Callback <string, bool, string, bool, bool, IDictionary <string, object>, IBasicConsumer>((a, b, c, d, e, f, givenConsumer) => consumer = givenConsumer);

            var properties = new BasicProperties
            {
                CorrelationId = Guid.NewGuid().ToString(),
                ReplyTo       = "reply.queue"
            };

            var exception = new Exception(exceptionMessage);

            receiver.DeclareCommandQueue();
            receiver.StartReceivingCommands(e => throw exception);

            var expectedBody = new byte[0];

            modelMock.Setup(e => e.BasicPublish("",
                                                "reply.queue",
                                                false,
                                                It.IsAny <IBasicProperties>(),
                                                It.IsAny <byte[]>()))
            .Callback <string, string, bool, IBasicProperties, byte[]>((a, b, c, d, body) => expectedBody = body);

            // Act
            consumer.HandleBasicDeliver(It.IsAny <string>(), 0, false, "", "test.queue", properties, new byte[0]);

            // Assert
            var          stringBody = Encoding.Unicode.GetString(expectedBody);
            CommandError error      = JsonConvert.DeserializeObject <CommandError>(stringBody);

            Assert.AreEqual(error.Exception?.Message, exceptionMessage);
        }
        public void ConsumerCallsBasicPublishWithValues(string replyTo, string message)
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);
            modelMock.Setup(e => e.CreateBasicProperties()).Returns(new BasicProperties());

            var receiver = new RabbitMqCommandReceiver(contextMock.Object, "test.queue");

            IBasicConsumer consumer = null;

            // Retrieve consumer from callback
            modelMock.Setup(e => e.BasicConsume("test.queue", false, It.IsAny <string>(), false, false, null, It.IsAny <IBasicConsumer>()))
            .Callback <string, bool, string, bool, bool, IDictionary <string, object>, IBasicConsumer>((a, b, c, d, e, f, givenConsumer) => consumer = givenConsumer);

            var properties = new BasicProperties
            {
                CorrelationId = Guid.NewGuid().ToString(),
                ReplyTo       = replyTo
            };

            var responseMessage = new CommandMessage {
                Body = Encoding.Unicode.GetBytes(message)
            };

            receiver.DeclareCommandQueue();
            receiver.StartReceivingCommands(e => responseMessage);

            // Act
            consumer.HandleBasicDeliver(It.IsAny <string>(), 0, false, "", "test.queue", properties, new byte[0]);

            // Assert
            var jsonResponse = JsonConvert.SerializeObject(responseMessage);
            var bodyResponse = Encoding.Unicode.GetBytes(jsonResponse);

            modelMock.Verify(e => e.BasicPublish("",
                                                 replyTo,
                                                 false,
                                                 It.IsAny <IBasicProperties>(),
                                                 bodyResponse));
        }
        public void DeclareCommandQueueDeclaresQueue(string queueName)
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);

            var receiver = new RabbitMqCommandReceiver(contextMock.Object, queueName);

            // Act
            receiver.DeclareCommandQueue();

            // Assert
            modelMock.Verify(
                e => e.QueueDeclare(queueName, true, false, false, null));
        }
        public void PauseCallsBasicCancelOnModel()
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);
            var receiver = new RabbitMqCommandReceiver(contextMock.Object, "queue");

            receiver.DeclareCommandQueue();

            // Act
            receiver.Pause();

            // Assert
            modelMock.Verify(e => e.BasicCancel(It.IsAny <string>()));
        }
        public void StartReceivingCommandsConsumerCallsCallback(string replyQueue, string type, string body)
        {
            // Arrange
            byte[] byteBody = Encoding.Unicode.GetBytes(body);

            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);
            modelMock.Setup(e => e.CreateBasicProperties()).Returns(new BasicProperties());

            var receiver = new RabbitMqCommandReceiver(contextMock.Object, "test.queue");

            CommandMessage result = new CommandMessage();

            IBasicConsumer consumer = null;

            // Retrieve consumer from callback
            modelMock.Setup(e => e.BasicConsume("test.queue", false, It.IsAny <string>(), false, false, null, It.IsAny <IBasicConsumer>()))
            .Callback <string, bool, string, bool, bool, IDictionary <string, object>, IBasicConsumer>((a, b, c, d, e, f, givenConsumer) => consumer = givenConsumer);

            Guid guid       = Guid.NewGuid();
            var  properties = new BasicProperties
            {
                ReplyTo       = replyQueue,
                Type          = type,
                CorrelationId = guid.ToString()
            };

            receiver.DeclareCommandQueue();
            receiver.StartReceivingCommands(e => result = e);

            // Act
            consumer.HandleBasicDeliver(It.IsAny <string>(), 0, false, "test.exchange", "test.queue", properties, byteBody);

            // Assert
            Assert.AreEqual(byteBody, result.Body);
            Assert.AreEqual(guid, result.CorrelationId);
            Assert.AreEqual(type, result.EventType);
            Assert.AreEqual(replyQueue, result.ReplyQueue);
        }
        public void StartReceivingCommandCallsBasicConsume(string queueName)
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);

            var receiver = new RabbitMqCommandReceiver(contextMock.Object, queueName);

            receiver.DeclareCommandQueue();

            // Act
            receiver.StartReceivingCommands(e => new CommandMessage());

            // Assert
            modelMock.Verify(e => e.BasicConsume(queueName, false, It.IsAny <string>(), false, false, null, It.IsAny <IBasicConsumer>()));
        }
        public void ResumeThrowsExceptionIfNotPaused()
        {
            // Arrange
            var connectionMock = new Mock <IConnection>();
            var contextMock    = new Mock <IBusContext <IConnection> >();
            var modelMock      = new Mock <IModel>();

            contextMock.SetupGet(e => e.Connection).Returns(connectionMock.Object);
            connectionMock.Setup(e => e.CreateModel()).Returns(modelMock.Object);
            var receiver = new RabbitMqCommandReceiver(contextMock.Object, "queue");

            receiver.DeclareCommandQueue();

            // Act
            void Act() => receiver.Resume();

            // Assert
            BusConfigurationException exception = Assert.ThrowsException <BusConfigurationException>(Act);

            Assert.AreEqual("Attempting to resume the CommandReceiver, but it was not paused.", exception.Message);
        }