using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.EntityFrameworkCore; using Microsoft.eShopWeb.Infrastructure.Data; using Microsoft.eShopWeb.Infrastructure.Identity; using Microsoft.eShopWeb.Web; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System; namespace Microsoft.eShopWeb.FunctionalTests.Web { public class WebTestFixture : WebApplicationFactory<Startup> { protected override void ConfigureWebHost(IWebHostBuilder builder) { builder.UseEnvironment("Testing"); builder.ConfigureServices(services => { services.AddEntityFrameworkInMemoryDatabase(); // Create a new service provider. var provider = services .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider(); // Add a database context (ApplicationDbContext) using an in-memory // database for testing. services.AddDbContext<CatalogContext>(options => { options.UseInMemoryDatabase("InMemoryDbForTesting"); options.UseInternalServiceProvider(provider); }); services.AddDbContext<AppIdentityDbContext>(options => { options.UseInMemoryDatabase("Identity"); options.UseInternalServiceProvider(provider); }); // Build the service provider. var sp = services.BuildServiceProvider(); // Create a scope to obtain a reference to the database // context (ApplicationDbContext). using (var scope = sp.CreateScope()) { var scopedServices = scope.ServiceProvider; var db = scopedServices.GetRequiredService<CatalogContext>(); var loggerFactory = scopedServices.GetRequiredService<ILoggerFactory>(); var logger = scopedServices .GetRequiredService<ILogger<WebTestFixture>>(); // Ensure the database is created. db.Database.EnsureCreated(); try { // Seed the database with test data. CatalogContextSeed.SeedAsync(db, loggerFactory).Wait(); // seed sample user data var userManager = scopedServices.GetRequiredService<UserManager<ApplicationUser>>(); var roleManager = scopedServices.GetRequiredService<RoleManager<IdentityRole>>(); AppIdentityDbContextSeed.SeedAsync(userManager, roleManager).Wait(); } catch (Exception ex) { logger.LogError(ex, $"An error occurred seeding the " + "database with test messages. Error: {ex.Message}"); } } }); } } }