public async Task SendAsyncTransformsEventBatches()
        {
            var messages = new[]
            {
                AmqpMessage.Create(new Data {
                    Value = new ArraySegment <byte>(new byte[] { 0x11 })
                }),
                AmqpMessage.Create(new Data {
                    Value = new ArraySegment <byte>(new byte[] { 0x22 })
                }),
                AmqpMessage.Create(new Data {
                    Value = new ArraySegment <byte>(new byte[] { 0x33 })
                }),
            };

            var options = new BatchOptions {
                MaximumizeInBytes = 30
            };
            var transportBatch = new TransportBatchMock {
                Messages = messages
            };
            var batch    = new EventDataBatch(transportBatch, options);
            var mock     = new ObservableSenderMock(new ClientMock(), null);
            var producer = new TrackOneEventHubProducer(_ => mock, Mock.Of <EventHubRetryPolicy>());

            await producer.SendAsync(batch, CancellationToken.None);

            Assert.That(mock.SendCalledWithParameters, Is.Not.Null, "The Send request should have been delegated.");

            var sentEvents = mock.SendCalledWithParameters.Events.ToArray();

            Assert.That(sentEvents.Length, Is.EqualTo(messages.Length), "The number of events sent should match the number of source events.");
            Assert.That(sentEvents.Where(evt => evt.AmqpMessage == null).Any(), Is.False, "The events should have had an AMQP message populated at transform.");

            var sentMessages = sentEvents.Select(evt => evt.AmqpMessage).ToList();

            for (var index = 0; index < messages.Length; ++index)
            {
                Assert.That(sentMessages.Contains(messages[index]), $"The message at index: { index } was not part of the set that was sent.");
            }

            foreach (var message in messages)
            {
                message.Dispose();
            }
        }
        public async Task SendAsyncForwardsThePartitionHashKeyForBatches()
        {
            var messages = new[]
            {
                AmqpMessage.Create(new Data {
                    Value = new ArraySegment <byte>(new byte[] { 0x11 })
                }),
                AmqpMessage.Create(new Data {
                    Value = new ArraySegment <byte>(new byte[] { 0x22 })
                }),
                AmqpMessage.Create(new Data {
                    Value = new ArraySegment <byte>(new byte[] { 0x33 })
                }),
            };

            var expectedHashKey = "TestKEy";
            var options         = new BatchOptions {
                MaximumizeInBytes = 30, PartitionKey = expectedHashKey
            };
            var transportBatch = new TransportBatchMock {
                Messages = messages
            };
            var batch    = new EventDataBatch(transportBatch, options);
            var mock     = new ObservableSenderMock(new ClientMock(), null);
            var producer = new TrackOneEventHubProducer(_ => mock, Mock.Of <EventHubRetryPolicy>());

            await producer.SendAsync(batch, CancellationToken.None);

            Assert.That(mock.SendCalledWithParameters, Is.Not.Null, "The Send request should have been delegated.");

            (_, var actualHashKey) = mock.SendCalledWithParameters;
            Assert.That(actualHashKey, Is.EqualTo(expectedHashKey), "The partition hash key should have been forwarded.");

            foreach (var message in messages)
            {
                message.Dispose();
            }
        }