public void Resolve_should_return_message()
        {
            var messageType    = typeof(DummyMessage);
            var message        = DummyMessage.New();
            var encodedMessage = Newtonsoft.Json.JsonConvert.SerializeObject(message);
            var messageBytes   = Encoding.UTF8.GetBytes(encodedMessage);

            var decoder = NSubstitute.Substitute.For <ISerializer>();

            decoder.Deserialize(messageBytes, messageType).Returns(message);

            var resolver = NSubstitute.Substitute.For <ITypeResolver>();

            resolver.Resolve(messageType.FullName).Returns(messageType);

            var sut = new MessageParser(resolver, decoder);

            var consumeResult = new ConsumeResult <Guid, byte[]>()
            {
                Message = new Message <Guid, byte[]>()
                {
                    Headers = new Headers()
                    {
                        { HeaderNames.MessageType, Encoding.UTF8.GetBytes(messageType.FullName) }
                    },
                    Value = messageBytes
                }
            };
            var result = sut.Parse(consumeResult);

            result.Should().Be(message);
        }
        public async Task PublishAsync_should_publish_message()
        {
            var message = DummyMessage.New();

            var topicName = "lorem";

            var producerResult = new DeliveryResult <Guid, byte[]>()
            {
                Status = PersistenceStatus.Persisted
            };
            var producer = NSubstitute.Substitute.For <IProducer <Guid, byte[]> >();

            producer.ProduceAsync(topicName, Arg.Any <Message <Guid, byte[]> >(), Arg.Any <CancellationToken>())
            .Returns(producerResult);

            var serializer = NSubstitute.Substitute.For <ITransportSerializer>();
            var logger     = NSubstitute.Substitute.For <ILogger <KafkaPublisherExecutor> >();

            var sut = new KafkaPublisherExecutor(producer, serializer, logger);

            await sut.PublishAsync(message, topicName);

            await producer.Received(1)
            .ProduceAsync(topicName,
                          Arg.Is((Message <Guid, byte[]> km) => km.Headers.Any(h =>
                                                                               h.Key == HeaderNames.MessageType) &&
                                 km.Key == message.Id));
        }
        public async Task ReadMessagesToProcess_should_not_return_sent_messages()
        {
            var messages = new[]
            {
                DummyMessage.New(),
                DummyMessage.New(),
                DummyMessage.New(),
            };
            var sut = new InMemoryOutboxRepository();

            foreach (var message in messages)
            {
                await sut.AppendAsync(message);
            }

            var lockId = await sut.LockAsync(messages[0]);

            await sut.ReleaseAsync(messages[0], lockId);

            var results = await sut.ReadMessagesToProcess();

            results.Should().NotBeNull()
            .And.HaveCount(2)
            .And.NotContain(messages[0]);
        }
        public async Task CleanProcessedAsync_should_remove_processed_messages()
        {
            var messages = new[]
            {
                DummyMessage.New(),
                DummyMessage.New(),
                DummyMessage.New(),
            };
            var sut = new InMemoryOutboxRepository();

            foreach (var message in messages)
            {
                await sut.AppendAsync(message);
            }

            var results = await sut.ReadMessagesToProcess();

            results.Should().NotBeNull().And.Contain(messages);

            foreach (var message in messages)
            {
                await sut.LockAsync(message);
            }

            await sut.CleanProcessedAsync();

            results = await sut.ReadMessagesToProcess();

            results.Should().NotBeNull().And.BeEmpty();
        }
        public async Task MarkAsSentAsync_should_throw_when_message_lock_id_invalid()
        {
            var message = DummyMessage.New();
            var sut     = new InMemoryOutboxRepository();

            await sut.AppendAsync(message);

            await Assert.ThrowsAsync <ArgumentException>(async() => await sut.ReleaseAsync(message, Guid.Empty));
        }
        public async Task BeginProcessingAsync_should_throw_when_message_already_locked()
        {
            var message = DummyMessage.New();

            var sut = new InMemoryOutboxRepository();
            await sut.AppendAsync(message);

            await sut.LockAsync(message);

            await Assert.ThrowsAsync <LockException>(async() => await sut.LockAsync(message));
        }
示例#7
0
        public void Create_should_return_valid_references()
        {
            var sp      = NSubstitute.Substitute.For <IServiceProvider>();
            var sysInfo = SystemInfo.New();
            var sut     = new QueueReferenceFactory(sp, sysInfo);
            var message = DummyMessage.New();
            var result  = sut.Create(message);

            result.Should().NotBeNull();
            result.ExchangeName.Should().Be("dummymessage");
            result.QueueName.Should().Be("dummymessage.workers");
            result.DeadLetterExchangeName.Should().Be("dummymessage.dead");
            result.DeadLetterQueue.Should().Be("dummymessage.dead.workers");
        }
        public async Task PublishAsync_should_write_message_to_proper_channel()
        {
            var message = DummyMessage.New();

            var channelFactory = NSubstitute.Substitute.For <IChannelFactory>();
            var writer         = NSubstitute.Substitute.For <ChannelWriter <DummyMessage> >();

            channelFactory.GetWriter <DummyMessage>()
            .Returns(writer);

            var sut = new InMemoryPublisher(channelFactory);

            await sut.PublishAsync(message);

            await writer.Received(1)
            .WriteAsync(message, Arg.Any <CancellationToken>());
        }
        public async Task ReadMessagesToProcess_should_return_pending_messages()
        {
            var messages = new[]
            {
                DummyMessage.New(),
                DummyMessage.New(),
                DummyMessage.New(),
            };
            var sut = new InMemoryOutboxRepository();

            foreach (var message in messages)
            {
                await sut.AppendAsync(message);
            }

            var results = await sut.ReadMessagesToProcess();

            results.Should().NotBeNull().And.Contain(messages);
        }
        public async Task PublishAsync_should_include_additional_headers_when_provided()
        {
            var message = DummyMessage.New();

            var topicName = "lorem";

            var producerResult = new DeliveryResult <Guid, byte[]>()
            {
                Status = PersistenceStatus.Persisted
            };
            var producer = NSubstitute.Substitute.For <IProducer <Guid, byte[]> >();

            producer.ProduceAsync(topicName, Arg.Any <Message <Guid, byte[]> >(), Arg.Any <CancellationToken>())
            .Returns(producerResult);

            var serializer = NSubstitute.Substitute.For <ITransportSerializer>();
            var logger     = NSubstitute.Substitute.For <ILogger <KafkaPublisherExecutor> >();

            var sut = new KafkaPublisherExecutor(producer, serializer, logger);

            var headers = new[]
            {
                new Header("lorem", Encoding.UTF8.GetBytes("ipsum")),
                new Header("dolor", Encoding.UTF8.GetBytes("amet"))
            };

            await sut.PublishAsync(message, topicName, headers);

            await producer.Received(1)
            .ProduceAsync(topicName,
                          Arg.Is((Message <Guid, byte[]> km) => km.Headers.Count == 3 &&
                                 km.Headers.Single(h => h.Key == HeaderNames.MessageType) != null &&
                                 km.Headers.Single(h => h.Key == "lorem") != null &&
                                 km.Headers.Single(h => h.Key == "dolor") != null &&
                                 km.Key == message.Id));
        }
        public async Task PublishAsync_should_throw_when_input_invalid()
        {
            var producer   = NSubstitute.Substitute.For <IProducer <Guid, byte[]> >();
            var serializer = NSubstitute.Substitute.For <ITransportSerializer>();
            var logger     = NSubstitute.Substitute.For <ILogger <KafkaPublisherExecutor> >();

            var sut = new KafkaPublisherExecutor(producer, serializer, logger);
            await Assert.ThrowsAsync <ArgumentNullException>(async() => await sut.PublishAsync(null, "lorem"));

            await Assert.ThrowsAsync <ArgumentNullException>(async() => await sut.PublishAsync(DummyMessage.New(), null));

            await Assert.ThrowsAsync <ArgumentNullException>(async() => await sut.PublishAsync(DummyMessage.New(), ""));

            await Assert.ThrowsAsync <ArgumentNullException>(async() => await sut.PublishAsync(DummyMessage.New(), "   "));
        }