public async Task Should_pass_message_and_headers_to_partition_key_extractor()
        {
            object capturedMessageInstanceFromPartionKeyExtractor = null;
            IReadOnlyDictionary <string, string> capturedHeadersFromPartionKeyExtractor = null;
            var partitionKeyExtractor = new PartitionKeyExtractor(
                (object msg, IReadOnlyDictionary <string, string> headers, out PartitionKey? partitionKey) =>
            {
                partitionKey = null;
                capturedMessageInstanceFromPartionKeyExtractor = msg;
                capturedHeadersFromPartionKeyExtractor         = headers;
                return(true);
            });

            var behavior = new TransactionInformationBeforeTheLogicalOutboxBehavior(partitionKeyExtractor, new ContainerInformationExtractor());

            var messageHeaders = new Dictionary <string, string> {
                { "HeaderKey", "HeaderValue" }
            };
            var messageInstance = new object();
            var context         = new TestableIncomingLogicalMessageContext
            {
                MessageHeaders = messageHeaders,
                Message        = new LogicalMessage(new MessageMetadata(typeof(object)), messageInstance)
            };

            await behavior.Invoke(context, _ => Task.CompletedTask);

            Assert.That(capturedMessageInstanceFromPartionKeyExtractor, Is.Not.Null.And.EqualTo(messageInstance));
            Assert.That(capturedHeadersFromPartionKeyExtractor, Is.Not.Null.And.EqualTo(messageHeaders));
        }
        public async Task Should_not_set_container_information_when_container_information_extractor_returns_false()
        {
            var extractor = new ContainerInformationExtractor(
                (object msg, IReadOnlyDictionary <string, string> headers, out ContainerInformation? container) =>
            {
                container = null;
                return(false);
            });

            var behavior = new TransactionInformationBeforeTheLogicalOutboxBehavior(new CosmosDB.PartitionKeyExtractor(), extractor);

            var context = new TestableIncomingLogicalMessageContext();

            await behavior.Invoke(context, _ => Task.CompletedTask);

            Assert.That(context.Extensions.TryGet <ContainerInformation>(out _), Is.False);
        }
        public async Task Should_set_container_when_container_information_extractor_returns_true()
        {
            var extractor = new ContainerInformationExtractor(
                (object msg, IReadOnlyDictionary <string, string> headers, out ContainerInformation? container) =>
            {
                container = new ContainerInformation("containerName", new PartitionKeyPath("/deep/down"));
                return(true);
            });

            var behavior = new TransactionInformationBeforeTheLogicalOutboxBehavior(new PartitionKeyExtractor(), extractor);

            var context = new TestableIncomingLogicalMessageContext();

            await behavior.Invoke(context, _ => Task.CompletedTask);

            Assert.That(context.Extensions.TryGet <ContainerInformation>(out var containerInformation), Is.True);
            Assert.AreEqual(new ContainerInformation("containerName", new PartitionKeyPath("/deep/down")), containerInformation);
        }
        public async Task Should_set_partition_key_when_partition_key_extractor_returns_true()
        {
            var partitionKeyExtractor = new PartitionKeyExtractor(
                (object msg, IReadOnlyDictionary <string, string> headers, out PartitionKey? key) =>
            {
                key = new PartitionKey(true);
                return(true);
            });

            var behavior = new TransactionInformationBeforeTheLogicalOutboxBehavior(partitionKeyExtractor, new ContainerInformationExtractor());

            var context = new TestableIncomingLogicalMessageContext();

            await behavior.Invoke(context, _ => Task.CompletedTask);

            Assert.That(context.Extensions.TryGet <PartitionKey>(out var partitionKey), Is.True);
            Assert.AreEqual(new PartitionKey(true), partitionKey);
        }