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 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 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 StartReceivingCommandsThrowsExceptionWhenNoQueueDeclared(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
            void Act() => receiver.StartReceivingCommands(e => new CommandMessage());

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

            Assert.AreEqual($"Queue {queueName} has not been declared yet", exception.Message);
        }