public async Task TestFullBlownStoreAndRetrieve()
        {
            // Arrange
            var msgId = Guid.NewGuid().ToString();

            var idempotencyData = new IdempotencyData();

            idempotencyData.MarkMessageAsHandled(Guid.NewGuid().ToString());
            idempotencyData.AddOutgoingMessage(
                Guid.NewGuid().ToString(),
                new [] { "test_destination" },
                new TransportMessage(new Dictionary <string, string>(), Encoding.ASCII.GetBytes("test_body")));

            var msgData = new MessageData
            {
                MessageId            = msgId,
                InputQueueAddress    = "testQueueName",
                ProcessingThreadId   = 123,
                TimeThreadIdAssigned = new DateTime(2017, 3, 27, 1, 23, 45),
                IdempotencyData      = idempotencyData
            };

            // Act
            await _messageStorage.InsertOrUpdate(msgData);

            var retrievedMsgData = await _messageStorage.Find(msgId);


            // Assert
            Assert.Equal(msgData.MessageId, retrievedMsgData.MessageId);
            Assert.Equal(msgData.InputQueueAddress, retrievedMsgData.InputQueueAddress);
            Assert.Equal(msgData.ProcessingThreadId, retrievedMsgData.ProcessingThreadId);
            Assert.Equal(msgData.TimeThreadIdAssigned, retrievedMsgData.TimeThreadIdAssigned);
            Assert.Equal(msgData.IdempotencyData.HandledMessageIds, retrievedMsgData.IdempotencyData.HandledMessageIds);
            Assert.Equal(msgData.IdempotencyData.OutgoingMessages[0].MessageId, retrievedMsgData.IdempotencyData.OutgoingMessages[0].MessageId);
        }