public async Task ShouldDropStorageAsync()
        {
            // Given

            const string collectionName = nameof(ShouldDropStorageAsync);

            var connection = MongoTestHelpers.GetConnection();
            var database   = connection.GetDatabase();

            database.DropCollection(collectionName);

            var documentMetadata = new DocumentMetadata {
                Type = collectionName
            };

            // When

            var storageManager = new MongoDocumentStorageManager(connection);
            await storageManager.CreateStorageAsync(documentMetadata);

            var collection        = database.GetCollection <DynamicWrapper>(collectionName);
            var collectionContent = new[] { new DynamicWrapper(), new DynamicWrapper(), new DynamicWrapper() };

            collection.InsertMany(collectionContent);

            var collectionCountBeforeDrop = collection.Count(Builders <DynamicWrapper> .Filter.Empty);

            await storageManager.DropStorageAsync(collectionName);

            var collectionCountAfterDrop = collection.Count(Builders <DynamicWrapper> .Filter.Empty);

            // Then
            Assert.AreEqual(collectionContent.Length, collectionCountBeforeDrop);
            Assert.AreEqual(0, collectionCountAfterDrop);
        }
        private static MongoConnection CreateEmptyStorage(string documentType, IEnumerable <IMemberValueConverter> converters = null, params DocumentIndex[] indexes)
        {
            var connection = GetConnection(converters);
            var database   = connection.GetDatabase();

            database.DropCollection(documentType);

            if (indexes != null && indexes.Length > 0)
            {
                var storageManager = new MongoDocumentStorageManager(connection);
                storageManager.CreateStorageAsync(new DocumentMetadata {
                    Type = documentType, Indexes = indexes
                }).Wait();
            }

            return(connection);
        }
        public async Task ShouldCreateStorageAsync()
        {
            // Given

            const string collectionName = nameof(ShouldCreateStorageAsync);

            var connection = MongoTestHelpers.GetConnection();
            var database   = connection.GetDatabase();

            database.DropCollection(collectionName);

            var documentMetadata = new DocumentMetadata
            {
                Type    = collectionName,
                Indexes = new List <DocumentIndex>
                {
                    new DocumentIndex
                    {
                        Key = new Dictionary <string, DocumentIndexKeyType>
                        {
                            { "Id", DocumentIndexKeyType.Asc },
                        }
                    },
                    new DocumentIndex
                    {
                        Key = new Dictionary <string, DocumentIndexKeyType>
                        {
                            { "Name", DocumentIndexKeyType.Asc },
                            { "Birthday", DocumentIndexKeyType.Desc }
                        }
                    },
                    new DocumentIndex
                    {
                        Key = new Dictionary <string, DocumentIndexKeyType>
                        {
                            { "Description", DocumentIndexKeyType.Text }
                        }
                    }
                }
            };

            // When - Create Collection

            var storageManager = new MongoDocumentStorageManager(connection);
            await storageManager.CreateStorageAsync(documentMetadata);

            await storageManager.CreateStorageAsync(documentMetadata); // No effect

            var collection = connection.GetDatabase().GetCollection <DynamicWrapper>(collectionName);

            // When - Using Indexes

            collection.InsertMany(new[]
            {
                CreateTestObject(1, "Name1", DateTime.Today.AddHours(1), "Some description 1 for Name1"),
                CreateTestObject(2, "Name1", DateTime.Today.AddHours(2), "Some description 2 for Name1"),
                CreateTestObject(3, "Name2", DateTime.Today.AddHours(3), "Some description 3 for Name2"),
                CreateTestObject(4, "Name2", DateTime.Today.AddHours(4), "Some description 4 for Name2"),
                CreateTestObject(5, "Name2", DateTime.Today.AddHours(5), "Some description 5 for Name2"),
                CreateTestObject(6, "Name3", DateTime.Today.AddHours(6), "Some description 6 for Name3")
            });

            var filterBuilder = Builders <DynamicWrapper> .Filter;
            var resultIndex1  = collection.FindSync(filterBuilder.Eq("Id", 3)).ToList();
            var resultIndex2  = collection.FindSync(filterBuilder.And(filterBuilder.Eq("Name", "Name2"), filterBuilder.Lt("Birthday", DateTime.Today.AddHours(5)))).ToList();
            var resultIndex3  = collection.FindSync(filterBuilder.Text("some name2")).ToList();

            // Then

            // Id: Ascending
            Assert.AreEqual(1, resultIndex1.Count);
            Assert.AreEqual(3, resultIndex1[0]["Id"]);
            Assert.AreEqual("Name2", resultIndex1[0]["Name"]);
            Assert.AreEqual(DateTime.Today.AddHours(3).ToUniversalTime(), resultIndex1[0]["Birthday"]);
            Assert.AreEqual("Some description 3 for Name2", resultIndex1[0]["Description"]);

            // Name: Ascending, Birthday: Descending
            Assert.AreEqual(2, resultIndex2.Count);
            Assert.AreEqual(4, resultIndex2[0]["Id"]);
            Assert.AreEqual("Name2", resultIndex2[0]["Name"]);
            Assert.AreEqual(DateTime.Today.AddHours(4).ToUniversalTime(), resultIndex2[0]["Birthday"]);
            Assert.AreEqual("Some description 4 for Name2", resultIndex2[0]["Description"]);
            Assert.AreEqual(3, resultIndex2[1]["Id"]);
            Assert.AreEqual("Name2", resultIndex2[1]["Name"]);
            Assert.AreEqual(DateTime.Today.AddHours(3).ToUniversalTime(), resultIndex2[1]["Birthday"]);
            Assert.AreEqual("Some description 3 for Name2", resultIndex2[1]["Description"]);

            // Description: Text
            Assert.AreEqual(3, resultIndex3.Count);
            CollectionAssert.AreEquivalent(new[] { 3, 4, 5 }, new[] { resultIndex3[0]["Id"], resultIndex3[1]["Id"], resultIndex3[2]["Id"] });
        }