public void EnqueuedMessagesArePersistentTest()
        {
            var connFactory = Substitute.For<IConnectionFactory>();
            var conn = Substitute.For<IConnection>();
            var model = Substitute.For<IModel>();
            var msg = new MemoryStream(Guid.NewGuid().ToByteArray());

            connFactory.CreateConnection().Returns(conn);
            connFactory.CreateConnection(string.Empty).ReturnsForAnyArgs(conn);
            conn.CreateModel().Returns(model);

            var setup = new RabbitMQWriterSetup
            {
                ConnectionFactory = connFactory,
                Options = new RabbitMQWriterOptions(),
            };
            using (var writer = new RabbitMQWriter(setup, false))
            {
                IBasicProperties props = null;
                model.WhenForAnyArgs(x => x.BasicPublish(null, null, false, null, null)).Do(ci =>
                {
                    props = ci.Arg<IBasicProperties>();
                    model.BasicAcks += Raise.EventWith(model, new BasicAckEventArgs());
                });
                writer.Enqueue(null, null, msg, TimeSpan.MaxValue, TimeSpan.FromSeconds(90), CancellationToken.None);
                Assert.NotNull(props);
                Assert.True(props.Persistent);
            }
        }
 public IRabbitMQWriter CreateWriter(RabbitMQWriterSetup setup)
 {
     setup = setup.Clone();
     RabbitMQWriter writer = null;
     try
     {
         writer = new RabbitMQWriter(setup, false);
         writer.EnsureOpen(setup.Timeout, setup.CancelToken);
         return writer;
     }
     catch
     {
         DisposeHelper.DisposeIfNotNull(writer);
         throw;
     }
 }
        public void ConfirmSelectIsEnabledTest()
        {
            var connFactory = Substitute.For<IConnectionFactory>();
            var conn = Substitute.For<IConnection>();
            var model = Substitute.For<IModel>();

            connFactory.CreateConnection().Returns(conn);
            connFactory.CreateConnection(string.Empty).ReturnsForAnyArgs(conn);
            conn.CreateModel().Returns(model);

            var setup = new RabbitMQWriterSetup
            {
                ConnectionFactory = connFactory,
                Options = new RabbitMQWriterOptions(),
            };
            using (var rdr = new RabbitMQWriter(setup, false))
            {
                rdr.EnsureOpen(TimeSpan.FromSeconds(90), CancellationToken.None);
                model.Received().ConfirmSelect();
            }
        }
        public void EnqueueUsesPassedInExchangeAndQueueNameTest()
        {
            var connFactory = Substitute.For<IConnectionFactory>();
            var conn = Substitute.For<IConnection>();
            var model = Substitute.For<IModel>();
            model.WhenForAnyArgs(x => x.BasicPublish(null, null, false, null, null)).Do(ci => model.BasicAcks += Raise.EventWith(model, new BasicAckEventArgs()));

            connFactory.CreateConnection().Returns(conn);
            connFactory.CreateConnection(string.Empty).ReturnsForAnyArgs(conn);
            conn.CreateModel().Returns(model);

            var setup = new RabbitMQWriterSetup
            {
                ConnectionFactory = connFactory,
                Options = new RabbitMQWriterOptions(),
            };
            using (var writer = new RabbitMQWriter(setup, false))
            {
                var exchange = Guid.NewGuid().ToString();
                var queueName = Guid.NewGuid().ToString();
                var msg = Guid.NewGuid();
                writer.Enqueue(exchange, queueName, new MemoryStream(msg.ToByteArray()), TimeSpan.MaxValue, TimeSpan.FromSeconds(30), CancellationToken.None);
                model.Received(1).BasicPublish(exchange, queueName, true, Arg.Any<IBasicProperties>(), Arg.Is<byte[]>(m => new Guid(m) == msg));
            }
        }
        public void WaitForMessageReturnsTrueWhenMessageIsAvailableTest()
        {
            var delay = TimeSpan.FromSeconds(15);

            var queueName = Guid.NewGuid().ToString();

            var setup = new RabbitMQReaderSetup
            {
                ConnectionFactory = new ConnectionFactory(),
                QueueName = queueName,
                Exchange= PredeclaredExchangeNames.Direct,
                IsDurable = false,
                DeleteQueueOnClose = true,
                QueueTimeToLive = TimeSpan.FromMinutes(20),
                Options = new RabbitMQReaderOptions(),
            };
            using (var rdr = new RabbitMQReader(setup, false))
            using (var writer = new RabbitMQWriter(new RabbitMQWriterSetup { ConnectionFactory = new ConnectionFactory() }, false))
            using (var timer = new Timer(state => writer.Publish(PredeclaredExchangeNames.Direct, queueName, new MemoryStream(), TimeSpan.MaxValue, CancellationToken.None), null, delay, TimeSpan.Zero))
            {
                var stopwatch = Stopwatch.StartNew();
                var gotMsg = rdr.WaitForMessage(TimeSpan.FromSeconds(90), CancellationToken.None);
                stopwatch.Stop();
                Assert.True(gotMsg);
                Assert.True(stopwatch.Elapsed >= delay);
            }
        }