using System; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using poi.Data; using IntegrationTests.Utilities; using System.IO; namespace IntegrationTests { public class CustomWebApplicationFactory : WebApplicationFactory { protected override IWebHostBuilder CreateWebHostBuilder(){ //used to read env variables for host/port var configuration = new ConfigurationBuilder() .AddEnvironmentVariables() .Build(); var host = new WebHostBuilder() .UseKestrel() .UseConfiguration(configuration) .UseIISIntegration() .ConfigureLogging((hostingContext, logging) => { logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); logging.AddConsole(); logging.AddDebug(); }) .UseStartup() .UseUrls("http://localhost:8080"); return host; } protected override void ConfigureWebHost(IWebHostBuilder builder) { builder.ConfigureServices(services => { // Create a new service provider. var serviceProvider = new ServiceCollection() .AddEntityFrameworkInMemoryDatabase() .BuildServiceProvider(); // Add a database context (ApplicationDbContext) using an in-memory // database for testing. services.AddDbContext(options => { options.UseInMemoryDatabase("InMemoryDbForTesting"); options.UseInternalServiceProvider(serviceProvider); }); // 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(); var logger = scopedServices .GetRequiredService>>(); // Ensure the database is created. db.Database.EnsureCreated(); try { // Seed the database with test data. DatabaseHelpers.InitializeDbForTests(db); } catch (Exception ex) { logger.LogError(ex, $"An error occurred seeding the " + "database with test POIs. Error: {ex.Message}"); } } }); } } }