public void InvalidOperationException_when_IMongoDatabase_dependency_is_missing()
        {
            using (var runner = new TestDatabaseRunner())
            {
                var database = runner.Database;
                var builder  = new HostBuilder()
                               .ConfigureWebHost(config =>
                {
                    config.UseTestServer()
                    .ConfigureServices(services =>
                    {
                        services.AddMongoMigrations();
                    })
                    .Configure(app =>
                    {
                        app.UseMongoMigrations();
                    });
                });

                Assert.Throws <InvalidOperationException>(() =>
                {
                    using (var host = builder.Start()) { }
                });
            }
        }
        public void SuccessFulMigration()
        {
            using (var runner = new TestDatabaseRunner())
            {
                var database = runner.Database;
                var builder  = new HostBuilder()
                               .ConfigureWebHost(config =>
                {
                    config.UseTestServer()
                    .ConfigureServices(services =>
                    {
                        services.AddSingleton(database);
                        services.AddMongoMigrations();
                    })
                    .Configure(app =>
                    {
                        app.UseMongoMigrations();
                    });
                });

                using (var host = builder.Start())
                {
                    var studentFilter = Builders <BsonDocument> .Filter.Empty;
                    var studentCount  = database.GetCollection <BsonDocument>("Students").Find(studentFilter).CountDocuments();

                    Assert.Equal(1, studentCount);

                    var migrationFilter = Builders <MigratedItem> .Filter.Empty;
                    var migrationItem   = database.GetCollection <MigratedItem>("Migrations").Find(migrationFilter).ToList().Where(x => x.MigrationNumber == 1).FirstOrDefault();

                    Assert.Equal(1, migrationItem.MigrationNumber);
                    Assert.Equal("Create the students collection.", migrationItem.Description);
                }
            }
        }
        public void AlternateIMongoDatabase()
        {
            using (var runner = new TestDatabaseRunner())
            {
                var iDatabaseMock = new Mock <IMongoDatabase>();
                var database      = runner.Database;
                var builder       = new HostBuilder()
                                    .ConfigureWebHost(config =>
                {
                    config.UseTestServer()
                    .ConfigureServices(services =>
                    {
                        services.AddSingleton(database);
                        services.AddMongoMigrations(options =>
                        {
                            options.MongoDatabase = iDatabaseMock.Object;
                        });
                    })
                    .Configure(app => { });
                });

                using (var host = builder.Start())
                {
                    var sp              = host.Services;
                    var options         = sp.GetService <IOptions <MigrationOptions> >();
                    var db              = sp.GetService <IMongoDatabase>();
                    var logger          = sp.GetService <ILogger <MigrationRunner> >();
                    var migrationRunner = new MigrationRunner(sp, options, db, logger);
                    //var migrationRunner = host.Services.GetService<IMigrationRunner>() as MigrationRunner;

                    Assert.Equal(iDatabaseMock.Object.GetType(), migrationRunner.Database.GetType());
                    Assert.NotEqual(database.GetType(), migrationRunner.Database.GetType());
                }
            }
        }
        public void SuccessFulMigration_from_another_assembly()
        {
            using (var runner = new TestDatabaseRunner())
            {
                var database = runner.Database;
                var builder  = new HostBuilder()
                               .ConfigureWebHost(config =>
                {
                    config.UseTestServer()
                    .ConfigureServices(services =>
                    {
                        services.AddTransient <TestMigrations.ITestDependency, TestDependency>();
                        services.AddSingleton(database);
                        services.AddMongoMigrations(options =>
                        {
                            options.Assemblies.Add(typeof(TestMigrations.Migration_002).Assembly);
                        });
                    })
                    .Configure(app =>
                    {
                        app.UseMongoMigrations();
                    });
                });

                using (var host = builder.Start())
                {
                    var classFilter = Builders <BsonDocument> .Filter.Empty;
                    var classCount  = database.GetCollection <BsonDocument>("Classes").Find(classFilter).CountDocuments();

                    Assert.Equal(1, classCount);

                    var migrationFilter = Builders <MigratedItem> .Filter.Empty;
                    var migrationItems  = database.GetCollection <MigratedItem>("Migrations").Find(migrationFilter).ToList();

                    Assert.Equal(3, migrationItems.Count);
                    Assert.True(migrationItems.Where(x => x.MigrationNumber == 1).Count() == 1);
                    Assert.True(migrationItems.Where(x => x.MigrationNumber == 2).Count() == 1);
                    Assert.True(migrationItems.Where(x => x.MigrationNumber == 3).Count() == 1);
                }
            }
        }