public void RegisterConventionPack_RegisterEqualConventionPacksTwoTimes_OneConventionPackRegistered()
        {
            // Arrange
            var mongoDatabaseBuilder = new MongoDatabaseBuilder(_mongoOptions);

            mongoDatabaseBuilder.RegisterConventionPack(
                "duplicateTestConventionPack", new ConventionPack
            {
                new DuplicateTestConvention1(),
                new DuplicateTestConvention2()
            }, t => true);

            mongoDatabaseBuilder.RegisterConventionPack(
                "duplicateTestConventionPack", new ConventionPack
            {
                new DuplicateTestConvention2(),
                new DuplicateTestConvention1()
            }, t => true);

            // Act
            MongoDbContextData result = mongoDatabaseBuilder.Build();

            // Assert
            IEnumerable <IConvention> conventions = ConventionRegistry
                                                    .Lookup(typeof(string)).Conventions;
            int duplicateTestConventionCount1 = conventions
                                                .Count(convention => convention.Name == nameof(DuplicateTestConvention1));
            int duplicateTestConventionCount2 = conventions
                                                .Count(convention => convention.Name == nameof(DuplicateTestConvention2));

            Assert.Equal(1, duplicateTestConventionCount1);
            Assert.Equal(1, duplicateTestConventionCount2);
        }
        public void GetCollection_GetNotExistingCollection_ReturnsNewCollection()
        {
            // Arrange
            IMongoCollection <Foo> mongoCollectionFoo =
                _mongoDatabase.GetCollection <Foo>(nameof(Foo));
            IMongoCollection <Bar> mongoCollectionBar =
                _mongoDatabase.GetCollection <Bar>(nameof(Bar));

            IMongoCollections mongoCollections = new MongoCollections();

            mongoCollections.Add(mongoCollectionFoo);

            MongoDbContextData mongoDbContextData = new MongoDbContextData(
                _mongoDatabase.Client,
                _mongoDatabase,
                mongoCollections);

            // Act
            IMongoCollection <Bar> collection = mongoDbContextData.GetCollection <Bar>();

            // Assert
            Assert.NotNull(collection);
            Assert.NotSame(mongoCollectionBar, collection);
            Assert.Equal("Bar", collection.CollectionNamespace.CollectionName);
        }
        public void ConfigureCollection_SetDifferentSettingsToCollection_CollectionConfiguredSuccessfully()
        {
            // Arrange
            var mongoDatabaseBuilder = new MongoDatabaseBuilder(_mongoOptions);

            // Act
            mongoDatabaseBuilder.ConfigureCollection(new FooCollectionConfiguration());
            MongoDbContextData result = mongoDatabaseBuilder.Build();

            // Assert
            IMongoCollection <Foo> collection = result.GetCollection <Foo>();

            IEnumerable <BsonClassMap> classMaps = BsonClassMap.GetRegisteredClassMaps();

            Snapshot.Match(new
            {
                CollectionName = collection.CollectionNamespace.CollectionName,
                Settings       = collection.Settings,
                Indexes        = collection.Indexes.List().ToList(),
                ClassMaps      = classMaps.Select(map => new {
                    Name        = map.Discriminator,
                    IdMemberMap = new {
                        map.IdMemberMap?.ElementName,
                        map.IdMemberMap?.MemberName
                    },
                    AllMemberMaps = map.AllMemberMaps.Select(amm =>
                                                             new { amm.ElementName, amm.MemberName }),
                    IgnoreExtraElements = map.IgnoreExtraElements
                })
            });
        }
        public void DisableTableScan_SetMongoServerTableScanToDisabled_MongoServerTableScanIsDisabled()
        {
            // Arrange
            var mongoDatabaseBuilder = new MongoDatabaseBuilder(_mongoOptions);

            // Act
            mongoDatabaseBuilder.ConfigureDatabase(db => db.Client.DisableTableScan());
            MongoDbContextData result = mongoDatabaseBuilder.Build();

            // Assert
            Assert.True(result.Client.IsTableScanDisabled());
        }
        public void AddInstrumentation_Command_ActivityCreated()
        {
            // Arrange
            var mongoDatabaseBuilder = new MongoDatabaseBuilder(_mongoOptions);

            mongoDatabaseBuilder.AddInstrumentation();

            // Act
            MongoDbContextData result = mongoDatabaseBuilder.Build();

            // Assert
            result.Client.Settings.ClusterConfigurator.Should().NotBeNull();
        }
        public void ConfigureConnection_NoConnectionSettingsSet_DefaultConnectionSettingsSet()
        {
            // Arrange
            var mongoDatabaseBuilder = new MongoDatabaseBuilder(_mongoOptions);

            // Act
            MongoDbContextData result = mongoDatabaseBuilder.Build();

            // Assert
            Assert.Equal(ReadPreference.Primary, result.Client.Settings.ReadPreference);
            Assert.Equal(ReadConcern.Majority, result.Client.Settings.ReadConcern);
            Assert.Equal(WriteConcern.WMajority.With(journal: true),
                         result.Client.Settings.WriteConcern);
        }
        public void Database_GetDatabase_ReturnsRightDatabase()
        {
            // Arrange
            MongoDbContextData mongoDbContextData = new MongoDbContextData(
                _mongoDatabase.Client,
                _mongoDatabase,
                new MongoCollections());

            // Act
            IMongoDatabase database = mongoDbContextData.Database;

            // Assert
            Assert.Same(_mongoDatabase, database);
        }
        public void Client_GetClient_ReturnsRightClient()
        {
            // Arrange
            MongoDbContextData mongoDbContextData = new MongoDbContextData(
                _mongoDatabase.Client,
                _mongoDatabase,
                new MongoCollections());

            // Act
            IMongoClient client = mongoDbContextData.Client;

            // Assert
            Assert.Same(_mongoDatabase.Client, client);
        }
        public void RegisterConventionPack_ConventionPackNotRegistered_ConventionPacksNotRegistered()
        {
            // Arrange
            var mongoDatabaseBuilder = new MongoDatabaseBuilder(_mongoOptions);

            // Act
            MongoDbContextData result = mongoDatabaseBuilder.Build();

            // Assert
            IEnumerable <IConvention> conventions = ConventionRegistry.Lookup(typeof(string)).Conventions;
            int enumRepConvention   = conventions.Count(convention => convention.Name == "EnumRepresentation");
            int camelCaseConvention = conventions.Count(convention => convention.Name == "CamelCaseElementName");

            Assert.Equal(0, enumRepConvention);
            Assert.Equal(0, camelCaseConvention);
        }
        public void RegisterDefaultConventionPack_RegisteredSuccessfully()
        {
            // Arrange
            var mongoDatabaseBuilder = new MongoDatabaseBuilder(_mongoOptions);

            mongoDatabaseBuilder.RegisterDefaultConventionPack();

            // Act
            MongoDbContextData result = mongoDatabaseBuilder.Build();

            // Assert
            IEnumerable <IConvention> conventions = ConventionRegistry.Lookup(typeof(string)).Conventions;

            Assert.NotNull(conventions.OfType <EnumRepresentationConvention>().FirstOrDefault(c => c.Representation == BsonType.String));
            Assert.NotNull(conventions.OfType <IgnoreExtraElementsConvention>().FirstOrDefault());
            Assert.NotNull(conventions.OfType <ImmutableConvention>().FirstOrDefault());
        }
        public void ConfigureConnection_SetSpecificConnectionSettings_MongoConnectionSettingsSetSuccessfully()
        {
            // Arrange
            var mongoDatabaseBuilder = new MongoDatabaseBuilder(_mongoOptions);

            // Act
            mongoDatabaseBuilder
            .ConfigureConnection(settings => settings.ApplicationName = "Test")
            .ConfigureConnection(settings => settings.ConnectionMode  = ConnectionMode.Direct)
            .ConfigureConnection(settings => settings.WriteConcern    = WriteConcern.W3);
            MongoDbContextData result = mongoDatabaseBuilder.Build();

            // Assert
            Assert.Equal("Test", result.Client.Settings.ApplicationName);
            Assert.Equal(ConnectionMode.Direct, result.Client.Settings.ConnectionMode);
            Assert.Equal(WriteConcern.W3, result.Client.Settings.WriteConcern);
        }
        public void GetCollection_GetNotExistingCollectionTwice_ReturnsSameCollection()
        {
            // Arrange
            IMongoCollections mongoCollections = new MongoCollections();

            MongoDbContextData mongoDbContextData = new MongoDbContextData(
                _mongoDatabase.Client,
                _mongoDatabase,
                mongoCollections);

            // Act
            IMongoCollection <Bar> collection1 = mongoDbContextData.GetCollection <Bar>();
            IMongoCollection <Bar> collection2 = mongoDbContextData.GetCollection <Bar>();

            // Assert
            Assert.NotNull(collection1);
            Assert.Same(collection1, collection2);
        }
        public void RegisterConventionPack_RegisterOneSpecificConventionPack_RegisteredSuccessfully()
        {
            // Arrange
            var mongoDatabaseBuilder = new MongoDatabaseBuilder(_mongoOptions);

            mongoDatabaseBuilder.RegisterConventionPack(
                "camelCase", new ConventionPack
            {
                new EnumRepresentationConvention(BsonType.String),
                new CamelCaseElementNameConvention()
            }, t => true);

            // Act
            MongoDbContextData result = mongoDatabaseBuilder.Build();

            // Assert
            IEnumerable <IConvention> conventions = ConventionRegistry.Lookup(typeof(string)).Conventions;

            Assert.NotNull(conventions.OfType <EnumRepresentationConvention>().FirstOrDefault(c => c.Representation == BsonType.String));
            Assert.NotNull(conventions.OfType <CamelCaseElementNameConvention>().FirstOrDefault());
        }
        public void GetCollection_GetBarCollection_ReturnsRightCollection()
        {
            // Arrange
            IMongoCollection <Foo> mongoCollectionFoo =
                _mongoDatabase.GetCollection <Foo>(nameof(Foo));
            IMongoCollection <Bar> mongoCollectionBar =
                _mongoDatabase.GetCollection <Bar>(nameof(Bar));

            IMongoCollections mongoCollections = new MongoCollections();

            mongoCollections.Add(mongoCollectionFoo);
            mongoCollections.Add(mongoCollectionBar);

            MongoDbContextData mongoDbContextData = new MongoDbContextData(
                _mongoDatabase.Client,
                _mongoDatabase,
                mongoCollections);

            // Act
            IMongoCollection <Bar> collection = mongoDbContextData.GetCollection <Bar>();

            // Assert
            Assert.Same(mongoCollectionBar, collection);
        }
 public NullableValueTypeCase(MongoResource mongoResource)
 {
     _context = CreateContext(mongoResource);
 }
 public SimpleImmutableWithInterfaceCase(MongoResource mongoResource)
 {
     _context = CreateContext(mongoResource);
 }
 public AbstractImmutableWithNullableVirtualBasePropertyCase(MongoResource mongoResource)
 {
     _context = CreateContext(mongoResource);
 }
 public AbstractImmutableWithVirtualBasePropertyOverriddenCase(MongoResource mongoResource)
 {
     _context = CreateContext(mongoResource);
 }
 public SimpleRecordCase(MongoResource mongoResource)
 {
     _context = CreateContext(mongoResource);
 }
 public NullableReferenceTypeCase(MongoResource mongoResource)
 {
     _context = CreateContext(mongoResource);
 }
 public RecordWithNullableCase(MongoResource mongoResource)
 {
     _context = CreateContext(mongoResource);
 }