public async Task ConfirmsAndAcksWork()
        {
            IBunny bunny = Bunny.ConnectSingle(ConnectSimple.BasicAmqp);
            IQueue queue = bunny.Setup()
                           .Queue("constraint")
                           .MaxLength(1)
                           .QueueExpiry(1500)
                           .Bind("amq.direct", "constraint-key")
                           .OverflowReject();

            bool isNacked  = false;
            bool isAcked   = false;
            var  publisher = bunny.Publisher <TestMessage>("amq.direct");
            Func <BasicNackEventArgs, Task> nacker = ea => { isNacked = true; return(Task.CompletedTask); };
            Func <BasicAckEventArgs, Task>  acker  = ea => { isAcked = true; return(Task.CompletedTask); };

            await publisher.WithQueueDeclare(queue)
            .WithConfirm(acker, nacker)
            .WithRoutingKey("constraint-key")
            .SendAsync(new TestMessage()
            {
                Text = "Confirm-1st"
            });

            await publisher.WithQueueDeclare(queue)
            .WithConfirm(acker, nacker)
            .SendAsync(new TestMessage()
            {
                Text = "Confirm-2nd"
            });

            Assert.True(isAcked);
            Assert.True(isNacked);
            bunny.Dispose();
        }
        public async Task PublisherSimplySendsWithoutQueueReturnsFailure()
        {
            IBunny bunny = Bunny.ConnectSingle(ConnectSimple.BasicAmqp);
            IPublish <TestMessage> publisher = bunny.Publisher <TestMessage>(Exchange);

            OperationResult <TestMessage> result = await publisher.SendAsync(new TestMessage());

            Assert.True(result.IsSuccess);
            bunny.Dispose();
        }
        public async Task ForceCreatesTheExchangeIfNotExists()
        {
            IBunny bunny = Bunny.ConnectSingle(ConnectSimple.BasicAmqp);
            IPublish <TestMessage> publisher = bunny.Publisher <TestMessage>("test-exchange");

            OperationResult <TestMessage> result = await publisher.SendAsync(new TestMessage(), force : true);

            Assert.True(result.IsSuccess);
            bool removed_exchange = await bunny.Setup().DeleteExchangeAsync("test-exchange", force: true);

            Assert.True(removed_exchange);
            bunny.Dispose();
        }
        public async Task PublisherSimplySendsWitQueueReturnsSuccess()
        {
            IBunny bunny = Bunny.ConnectSingle(ConnectSimple.BasicAmqp);
            IPublish <TestMessage> publisher = bunny.Publisher <TestMessage>(Exchange);

            OperationResult <TestMessage> result = await publisher
                                                   .WithQueueDeclare()
                                                   .SendAsync(new TestMessage());

            bool success = await bunny.Setup().DeleteQueueAsync(typeof(TestMessage).FullName, force: true);

            Assert.True(result.IsSuccess);
            Assert.True(success);
            bunny.Dispose();
        }
        public async Task MandatoryFailsWithoutQueue()
        {
            IBunny bunny = Bunny.ConnectSingle(ConnectSimple.BasicAmqp);

            bool isReturned = false;
            var  publisher  = bunny.Publisher <TestMessage>("amq.direct");
            Func <BasicReturnEventArgs, Task> nacker = ea => { isReturned = true; return(Task.CompletedTask); };

            await publisher.AsMandatory(nacker)
            .WithRoutingKey("not-any-bound-queue")
            .SendAsync(new TestMessage());

            await Task.Delay(500);

            Assert.True(isReturned);
            bunny.Dispose();
        }
        public async Task MandatoryWorksWithQueue()
        {
            IBunny bunny = Bunny.ConnectSingle(ConnectSimple.BasicAmqp);

            bool isReturned = true;
            var  publisher  = bunny.Publisher <TestMessage>("amq.direct");
            Func <BasicReturnEventArgs, Task> nacker = ea => { isReturned = false; return(Task.CompletedTask); };

            await publisher.AsMandatory(nacker)
            .WithQueueDeclare()
            .SendAsync(new TestMessage()
            {
                Text = "Mandatory-succeeds"
            });

            bool removed = await bunny.Setup().DeleteQueueAsync(typeof(TestMessage).FullName, force: true);

            Assert.True(isReturned);
            bunny.Dispose();
        }