public void StartHandlingMessagesCallsBasicConsume(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 RabbitMqMessageReceiver(contextMock.Object, queueName, new string[0]);

            receiver.StartReceivingMessages();

            // Act
            receiver.StartHandlingMessages(e => {});

            // Assert
            modelMock.Verify(e => e.BasicConsume(queueName, true, It.IsAny <string>(), false, false, null, It.IsAny <IBasicConsumer>()));
        }
        public void StartHandlingMessagesThrowsExceptionOnNotListening()
        {
            // 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 RabbitMqMessageReceiver(contextMock.Object, "test.queue", null);

            // Act
            void Act() => receiver.StartHandlingMessages(e => {});

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

            Assert.AreEqual("Receiver is not listening to events", exception.Message);
        }
        public void CallbackIsCalledWithProperMessage(string exchangeName, string topic, string eventType)
        {
            // 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);

            IBasicConsumer consumer = null;

            // Retrieve consumer from callback
            var receiver = new RabbitMqMessageReceiver(contextMock.Object, "test.queue", new string[0]);

            modelMock.Setup(
                e => e.BasicConsume("test.queue", true, 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);

            EventMessage eventMessage = null;

            receiver.StartReceivingMessages();
            receiver.StartHandlingMessages(e => eventMessage = e);

            Guid             guid       = Guid.NewGuid();
            IBasicProperties properties = new BasicProperties
            {
                CorrelationId = guid.ToString(),
                Type          = eventType
            };

            // Act
            Thread.Sleep(WaitTime);
            consumer.HandleBasicDeliver(It.IsAny <string>(), 0, false, exchangeName, topic, properties, new byte[0]);

            // Assert
            Assert.AreEqual(topic, eventMessage.Topic);
            Assert.AreEqual(eventType, eventMessage.EventType);
            Assert.AreEqual(guid, eventMessage.CorrelationId);
        }