diff --git a/test/Diagnostics.EFCore.FunctionalTests/DatabaseErrorPageMiddlewareTest.cs b/test/Diagnostics.EFCore.FunctionalTests/DatabaseErrorPageMiddlewareTest.cs index 5113cdb156..328a9353db 100644 --- a/test/Diagnostics.EFCore.FunctionalTests/DatabaseErrorPageMiddlewareTest.cs +++ b/test/Diagnostics.EFCore.FunctionalTests/DatabaseErrorPageMiddlewareTest.cs @@ -76,16 +76,19 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests } } - [ConditionalFact(Skip = "aspnet/Diagnostics#350")] + [ConditionalFact] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task Existing_database_not_using_migrations_exception_passes_thru() { - TestServer server = SetupTestServer(); - var ex = await Assert.ThrowsAsync(async () => - await server.CreateClient().GetAsync("http://localhost/")); + using (var database = SqlServerTestStore.CreateScratch()) + { + TestServer server = SetupTestServer(database); + var ex = await Assert.ThrowsAsync(async () => + await server.CreateClient().GetAsync("http://localhost/")); - Assert.Equal("Invalid column name 'Name'.", ex.InnerException.Message); + Assert.Equal("Invalid column name 'Name'.", ex.InnerException.Message); + } } class DatabaseErrorButNoMigrationsMiddleware @@ -97,7 +100,7 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests { var db = context.RequestServices.GetService(); db.Database.EnsureCreated(); - db.Database.ExecuteSqlCommand("ALTER TABLE dbo.Blog DROP COLUMN Name"); + db.Database.ExecuteSqlCommand("ALTER TABLE dbo.Blogs DROP COLUMN Name"); db.Blogs.Add(new Blog()); db.SaveChanges(); @@ -105,19 +108,22 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests } } - [ConditionalFact(Skip = "aspnet/Diagnostics#350")] + [ConditionalFact] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task Error_page_displayed_no_migrations() { - TestServer server = SetupTestServer(); - HttpResponseMessage response = await server.CreateClient().GetAsync("http://localhost/"); + using (var database = SqlServerTestStore.CreateScratch()) + { + TestServer server = SetupTestServer(database); + HttpResponseMessage response = await server.CreateClient().GetAsync("http://localhost/"); - Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); - var content = await response.Content.ReadAsStringAsync(); - Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_NoDbOrMigrationsTitle", typeof(BloggingContext).Name), content); - Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_AddMigrationCommandPMC").Replace(">", ">"), content); - Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_ApplyMigrationsCommandPMC").Replace(">", ">"), content); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + var content = await response.Content.ReadAsStringAsync(); + Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_NoDbOrMigrationsTitle", typeof(BloggingContext).Name), content); + Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_AddMigrationCommandPMC").Replace(">", ">"), content); + Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_ApplyMigrationsCommandPMC").Replace(">", ">"), content); + } } class NoMigrationsMiddleware @@ -134,23 +140,26 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests } } - [ConditionalFact(Skip = "aspnet/Diagnostics#350")] + [ConditionalFact] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task Error_page_displayed_pending_migrations() { - TestServer server = SetupTestServer(); - HttpResponseMessage response = await server.CreateClient().GetAsync("http://localhost/"); + using (var database = SqlServerTestStore.CreateScratch()) + { + TestServer server = SetupTestServer(database); + HttpResponseMessage response = await server.CreateClient().GetAsync("http://localhost/"); - Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); - var content = await response.Content.ReadAsStringAsync(); - Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_PendingMigrationsTitle", typeof(BloggingContextWithMigrations).Name), content); - Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_ApplyMigrationsCommandPMC").Replace(">", ">"), content); - Assert.Contains("
  • 111111111111111_MigrationOne
  • ", content); - Assert.Contains("
  • 222222222222222_MigrationTwo
  • ", content); + var content = await response.Content.ReadAsStringAsync(); + Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_PendingMigrationsTitle", typeof(BloggingContextWithMigrations).Name), content); + Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_ApplyMigrationsCommandPMC").Replace(">", ">"), content); + Assert.Contains("
  • 111111111111111_MigrationOne
  • ", content); + Assert.Contains("
  • 222222222222222_MigrationTwo
  • ", content); - Assert.DoesNotContain(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_AddMigrationCommandPMC").Replace(">", ">"), content); + Assert.DoesNotContain(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_AddMigrationCommandPMC").Replace(">", ">"), content); + } } class PendingMigrationsMiddleware @@ -167,20 +176,25 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests } } - [ConditionalFact(Skip = "aspnet/Diagnostics#350")] + [ConditionalFact] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task Error_page_displayed_pending_model_changes() { - TestServer server = SetupTestServer(); - HttpResponseMessage response = await server.CreateClient().GetAsync("http://localhost/"); + using (var database = SqlServerTestStore.CreateScratch()) + { + TestServer server = SetupTestServer(database); + HttpResponseMessage response = await server.CreateClient().GetAsync("http://localhost/"); - Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); - var content = await response.Content.ReadAsStringAsync(); - Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_PendingChangesTitle", typeof(BloggingContextWithPendingModelChanges).Name), content); - Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_AddMigrationCommand").Replace(">", ">"), content); - Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_ApplyMigrationsCommand").Replace(">", ">"), content); + var content = await response.Content.ReadAsStringAsync(); + Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_PendingChangesTitle", typeof(BloggingContextWithPendingModelChanges).Name), content); + Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_AddMigrationCommandCLI").Replace(">", ">"), content); + Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_AddMigrationCommandPMC").Replace(">", ">"), content); + Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_ApplyMigrationsCommandCLI").Replace(">", ">"), content); + Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_ApplyMigrationsCommandPMC").Replace(">", ">"), content); + } } class PendingModelChangesMiddleware @@ -191,50 +205,53 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests public virtual Task Invoke(HttpContext context) { var db = context.RequestServices.GetService(); - db.Database.Migrate(); + db.Database.Migrate(); - db.Blogs.Add(new Blog()); - db.SaveChanges(); - throw new Exception("SaveChanges should have thrown"); + db.Blogs.Add(new Blog()); + db.SaveChanges(); + throw new Exception("SaveChanges should have thrown"); } } - [ConditionalFact(Skip = "aspnet/Diagnostics#350")] + [ConditionalFact] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task Error_page_then_apply_migrations() { - TestServer server = SetupTestServer(); - var client = server.CreateClient(); - - var expectedMigrationsEndpoint = "/ApplyDatabaseMigrations"; - var expectedContextType = typeof(BloggingContextWithMigrations).AssemblyQualifiedName; - - // Step One: Initial request with database failure - HttpResponseMessage response = await client.GetAsync("http://localhost/"); - Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); - var content = await response.Content.ReadAsStringAsync(); - - // Ensure the url we're going to test is what the page is using in it's JavaScript - var javaScriptEncoder = JavaScriptEncoder.Default; - Assert.Contains("req.open(\"POST\", \"" + JavaScriptEncode(expectedMigrationsEndpoint) + "\", true);", content); - Assert.Contains("var formBody = \"context=" + JavaScriptEncode(UrlEncode(expectedContextType)) + "\";", content); - - // Step Two: Request to migrations endpoint - var formData = new FormUrlEncodedContent(new List> + using (var database = SqlServerTestStore.CreateScratch()) { - new KeyValuePair("context", expectedContextType) - }); + TestServer server = SetupTestServer(database); + var client = server.CreateClient(); - response = await client.PostAsync("http://localhost" + expectedMigrationsEndpoint, formData); - content = await response.Content.ReadAsStringAsync(); - Console.WriteLine(content); - Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); + var expectedMigrationsEndpoint = "/ApplyDatabaseMigrations"; + var expectedContextType = typeof(BloggingContextWithMigrations).AssemblyQualifiedName; - // Step Three: Successful request after migrations applied - response = await client.GetAsync("http://localhost/"); - content = await response.Content.ReadAsStringAsync(); - Assert.Equal("Saved a Blog", content); + // Step One: Initial request with database failure + HttpResponseMessage response = await client.GetAsync("http://localhost/"); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + var content = await response.Content.ReadAsStringAsync(); + + // Ensure the url we're going to test is what the page is using in it's JavaScript + var javaScriptEncoder = JavaScriptEncoder.Default; + Assert.Contains("req.open(\"POST\", \"" + JavaScriptEncode(expectedMigrationsEndpoint) + "\", true);", content); + Assert.Contains("var formBody = \"context=" + JavaScriptEncode(UrlEncode(expectedContextType)) + "\";", content); + + // Step Two: Request to migrations endpoint + var formData = new FormUrlEncodedContent(new List> + { + new KeyValuePair("context", expectedContextType) + }); + + response = await client.PostAsync("http://localhost" + expectedMigrationsEndpoint, formData); + content = await response.Content.ReadAsStringAsync(); + Console.WriteLine(content); + Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); + + // Step Three: Successful request after migrations applied + response = await client.GetAsync("http://localhost/"); + content = await response.Content.ReadAsStringAsync(); + Assert.Equal("Saved a Blog", content); + } } class ApplyMigrationsMiddleware @@ -251,7 +268,7 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests } } - [ConditionalFact(Skip = "aspnet/Diagnostics#350")] + [ConditionalFact] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task Customize_migrations_end_point() @@ -272,12 +289,10 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests }) .ConfigureServices(services => { - services.AddEntityFrameworkSqlServer(); - services.AddScoped(); - - var optionsBuilder = new DbContextOptionsBuilder(); - optionsBuilder.UseSqlServer(database.ConnectionString); - services.AddSingleton(optionsBuilder.Options); + services.AddDbContext(optionsBuilder => + { + optionsBuilder.UseSqlServer(database.ConnectionString); + }); }); var server = new TestServer(builder); @@ -290,45 +305,27 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests } } - [ConditionalFact(Skip = "aspnet/Diagnostics#350")] + [ConditionalFact] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task Pass_thru_when_context_not_in_services() { - using (var database = SqlServerTestStore.CreateScratch()) - { - var logProvider = new TestLoggerProvider(); + var logProvider = new TestLoggerProvider(); - var builder = new WebHostBuilder() - .Configure(app => - { - app.UseDatabaseErrorPage(); - app.UseMiddleware(); - app.ApplicationServices.GetService().AddProvider(logProvider); - }) - .ConfigureServices( - services => - { - services.AddEntityFrameworkSqlServer(); - var optionsBuilder = new DbContextOptionsBuilder(); - if (!PlatformHelper.IsMono) - { - optionsBuilder.UseSqlServer(database.ConnectionString); - } - else - { - optionsBuilder.UseInMemoryDatabase("Scratch"); - } - services.AddSingleton(optionsBuilder.Options); - }); - var server = new TestServer(builder); + var builder = new WebHostBuilder() + .Configure(app => + { + app.UseDatabaseErrorPage(); + app.UseMiddleware(); + app.ApplicationServices.GetService().AddProvider(logProvider); + }); + var server = new TestServer(builder); - var ex = await Assert.ThrowsAsync(async () => - await server.CreateClient().GetAsync("http://localhost/")); + var ex = await Assert.ThrowsAsync(async () => + await server.CreateClient().GetAsync("http://localhost/")); - Assert.True(logProvider.Logger.Messages.Any(m => - m.StartsWith(StringsHelpers.GetResourceString("FormatDatabaseErrorPageMiddleware_ContextNotRegistered", typeof(BloggingContext))))); - } + Assert.True(logProvider.Logger.Messages.Any(m => + m.StartsWith(StringsHelpers.GetResourceString("FormatDatabaseErrorPageMiddleware_ContextNotRegistered", typeof(BloggingContext))))); } class ContextNotRegisteredInServicesMiddleware @@ -338,15 +335,28 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests public virtual Task Invoke(HttpContext context) { - var options = context.RequestServices.GetService(); - var db = new BloggingContext(options); - db.Blogs.Add(new Blog()); - db.SaveChanges(); - throw new Exception("SaveChanges should have thrown"); + using (var database = SqlServerTestStore.CreateScratch()) + { + var optionsBuilder = new DbContextOptionsBuilder() + .UseLoggerFactory(context.RequestServices.GetService()); + if (!PlatformHelper.IsMono) + { + optionsBuilder.UseSqlServer(database.ConnectionString); + } + else + { + optionsBuilder.UseInMemoryDatabase("Scratch"); + } + + var db = new BloggingContext(optionsBuilder.Options); + db.Blogs.Add(new Blog()); + db.SaveChanges(); + throw new Exception("SaveChanges should have thrown"); + } } } - [ConditionalFact(Skip = "aspnet/Diagnostics#350")] + [ConditionalFact] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task Pass_thru_when_exception_in_logic() @@ -355,12 +365,12 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests { var logProvider = new TestLoggerProvider(); - var server = SetupTestServer(logProvider); + var server = SetupTestServer(database, logProvider); var ex = await Assert.ThrowsAsync(async () => await server.CreateClient().GetAsync("http://localhost/")); - Assert.True(logProvider.Logger.Messages.Any(m => + Assert.True(logProvider.Logger.Messages.ToList().Any(m => m.StartsWith(StringsHelpers.GetResourceString("FormatDatabaseErrorPageMiddleware_Exception")))); } } @@ -379,18 +389,21 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests } } - [ConditionalFact(Skip = "aspnet/Diagnostics#350")] + [ConditionalFact] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] public async Task Error_page_displayed_when_exception_wrapped() { - TestServer server = SetupTestServer(); - HttpResponseMessage response = await server.CreateClient().GetAsync("http://localhost/"); + using (var database = SqlServerTestStore.CreateScratch()) + { + TestServer server = SetupTestServer(database); + HttpResponseMessage response = await server.CreateClient().GetAsync("http://localhost/"); - Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); - var content = await response.Content.ReadAsStringAsync(); - Assert.Contains("I wrapped your exception", content); - Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_NoDbOrMigrationsTitle", typeof(BloggingContext).Name), content); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + var content = await response.Content.ReadAsStringAsync(); + Assert.Contains("I wrapped your exception", content); + Assert.Contains(StringsHelpers.GetResourceString("FormatDatabaseErrorPage_NoDbOrMigrationsTitle", typeof(BloggingContext).Name), content); + } } class WrappedExceptionMiddleware @@ -414,30 +427,25 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests } } - private static TestServer SetupTestServer(ILoggerProvider logProvider = null) + private static TestServer SetupTestServer(SqlServerTestStore database, ILoggerProvider logProvider = null) where TContext : DbContext { - using (var database = SqlServerTestStore.CreateScratch()) - { - var builder = new WebHostBuilder() - .Configure(app => + var builder = new WebHostBuilder() + .Configure(app => + { + app.UseDatabaseErrorPage(); + + app.UseMiddleware(); + + if (logProvider != null) { - app.UseDatabaseErrorPage(); - - app.UseMiddleware(); - - if (logProvider != null) - { - app.ApplicationServices.GetService().AddProvider(logProvider); - } - }) - .ConfigureServices(services => + app.ApplicationServices.GetService().AddProvider(logProvider); + } + }) + .ConfigureServices(services => + { + services.AddDbContext(optionsBuilder => { - services.AddEntityFrameworkSqlServer(); - - services.AddScoped(); - - var optionsBuilder = new DbContextOptionsBuilder(); if (!PlatformHelper.IsMono) { optionsBuilder.UseSqlServer(database.ConnectionString); @@ -446,10 +454,9 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests { optionsBuilder.UseInMemoryDatabase("Scratch"); } - services.AddSingleton(optionsBuilder.Options); }); - return new TestServer(builder); - } + }); + return new TestServer(builder); } private static UrlEncoder _urlEncoder = UrlEncoder.Default; diff --git a/test/Diagnostics.EFCore.FunctionalTests/MigrationsEndPointMiddlewareTest.cs b/test/Diagnostics.EFCore.FunctionalTests/MigrationsEndPointMiddlewareTest.cs index 9f66592b27..4d19ce3a07 100644 --- a/test/Diagnostics.EFCore.FunctionalTests/MigrationsEndPointMiddlewareTest.cs +++ b/test/Diagnostics.EFCore.FunctionalTests/MigrationsEndPointMiddlewareTest.cs @@ -98,9 +98,10 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests }) .ConfigureServices(services => { - services.AddEntityFrameworkSqlServer(); - services.AddScoped(); - services.AddSingleton(optionsBuilder.Options); + services.AddDbContext(options => + { + options.UseSqlServer(database.ConnectionString); + }); }); var server = new TestServer(builder); @@ -205,16 +206,14 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests { using (var database = SqlServerTestStore.CreateScratch()) { - var optionsBuilder = new DbContextOptionsBuilder(); - optionsBuilder.UseSqlServer(database.ConnectionString); - var builder = new WebHostBuilder() .Configure(app => app.UseMigrationsEndPoint()) .ConfigureServices(services => { - services.AddEntityFrameworkSqlServer(); - services.AddScoped(); - services.AddSingleton(optionsBuilder.Options); + services.AddDbContext(optionsBuilder => + { + optionsBuilder.UseSqlServer(database.ConnectionString); + }); }); var server = new TestServer(builder); diff --git a/test/Diagnostics.EFCore.FunctionalTests/TestModels/BloggingContextWithMigrations.cs b/test/Diagnostics.EFCore.FunctionalTests/TestModels/BloggingContextWithMigrations.cs index 42ef21ec2e..90e38ed1c0 100644 --- a/test/Diagnostics.EFCore.FunctionalTests/TestModels/BloggingContextWithMigrations.cs +++ b/test/Diagnostics.EFCore.FunctionalTests/TestModels/BloggingContextWithMigrations.cs @@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests protected override void Up(MigrationBuilder migrationBuilder) { - migrationBuilder.CreateTable("Blog", + migrationBuilder.CreateTable("Blogs", c => new { BlogId = c.Column().Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), @@ -54,7 +54,7 @@ namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Tests protected override void Down(MigrationBuilder migrationBuilder) { - migrationBuilder.DropTable("Blog"); + migrationBuilder.DropTable("Blogs"); } }