public async Task CanBlockBuffer()
        {
            // Arrange
            var ra       = new RabbitAdapter(1);
            var message1 = new BasicDeliverEventArgs();
            var message2 = new BasicDeliverEventArgs();

            // Act
            ra.ConsumeData(null, message1);
            var consume2Task = Task.Run(() =>
            {
                ra.ConsumeData(null, message2);
            });

            // Assert
            await Task.Delay(1000).ConfigureAwait(false); // Attempts to ensure that consume2 Task will never finished

            consume2Task.IsCompleted.Should().BeFalse();

            var _ = ra.GetAsyncEnumerator().MoveNextAsync();

            await Task.Delay(1000).ConfigureAwait(false); // Attempts to ensure that possible spinWait delay will finished

            consume2Task.IsCompleted.Should().BeTrue();
        }
        public void CaRunConsumeWithNotNullMessage()
        {
            // Arrange
            var ra = new RabbitAdapter(1);

            // Act
            var exception = Record.Exception(
                () => ra.ConsumeData(null, new RabbitMQ.Client.Events.BasicDeliverEventArgs()));

            // Assert
            exception.Should().BeNull();
        }
        public void CanNotRunConsumeWithNullMessage()
        {
            // Arrange
            var ra = new RabbitAdapter(1);

            // Act
            var exception = Record.Exception(
                () => ra.ConsumeData(null, null !));

            // Assert
            exception.Should().NotBeNull().And.BeOfType <ArgumentNullException>();
        }
        public void CanReadEmptyEnumerator()
        {
            // Arrange
            var ra = new RabbitAdapter(1);

            // Act
            var enumerator = ra.GetAsyncEnumerator();

            // Assert
            enumerator.Should().NotBeNull();

            enumerator.MoveNextAsync().IsCompleted.Should().BeFalse();
        }
        public void CaRunConsumeWithNotNullMessageWithAck()
        {
            // Arrange
            var message = new RabbitMQ.Client.Events.BasicDeliverEventArgs()
            {
                DeliveryTag = 42
            };
            ulong ackId = 0;
            var   ra    = new RabbitAdapter(1, id =>
            {
                ackId = id;
            });

            // Act
            ra.ConsumeData(null, message);

            // Assert
            ackId.Should().Be(message.DeliveryTag);
        }
        public async Task CanReadEnumerator()
        {
            // Arrange
            var ra      = new RabbitAdapter(1);
            var message = new BasicDeliverEventArgs()
            {
                DeliveryTag = 1
            };

            // Act
            var enumerator = ra.GetAsyncEnumerator();
            var t          = enumerator.MoveNextAsync();

            // Assert
            t.IsCompleted.Should().BeFalse();

            ra.ConsumeData(null, message);

            await Task.Delay(1000).ConfigureAwait(false); // Attempts to ensure that continuation from WaitToReadAsync in enumerator will be finished

            t.IsCompleted.Should().BeTrue();

            enumerator.Current.Should().Be(message);
        }