87 lines
2.7 KiB
C#
87 lines
2.7 KiB
C#
using GameList.Data;
|
|
using Microsoft.AspNetCore.Hosting;
|
|
using Microsoft.AspNetCore.Mvc.Testing;
|
|
using Microsoft.Data.Sqlite;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Hosting;
|
|
|
|
namespace GameList.Tests.Support;
|
|
|
|
internal class TestWebApplicationFactory : WebApplicationFactory<Program>
|
|
{
|
|
private SqliteConnection? _connection;
|
|
|
|
protected override void ConfigureWebHost(IWebHostBuilder builder)
|
|
{
|
|
builder.UseEnvironment("Development");
|
|
builder.ConfigureAppConfiguration((_, config) => { config.AddInMemoryCollection(new Dictionary<string, string?> { ["ADMIN_PASSWORD"] = "admin-key" }); });
|
|
|
|
builder.ConfigureServices(services =>
|
|
{
|
|
var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<AppDbContext>));
|
|
if (descriptor != null)
|
|
{
|
|
services.Remove(descriptor);
|
|
}
|
|
|
|
_connection = new SqliteConnection("Data Source=:memory:;Cache=Shared");
|
|
_connection.Open();
|
|
|
|
services.AddDbContext<AppDbContext>(options => { options.UseSqlite(_connection); });
|
|
|
|
services.AddSingleton<StubHttpMessageHandler>();
|
|
services.AddSingleton<IHttpClientFactory, StubHttpClientFactory>();
|
|
});
|
|
|
|
builder.UseSetting("https_port", "0");
|
|
}
|
|
|
|
protected override IHost CreateHost(IHostBuilder builder)
|
|
{
|
|
var host = base.CreateHost(builder);
|
|
|
|
using var scope = host.Services.CreateScope();
|
|
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
|
|
db.Database.EnsureCreated();
|
|
db.Database.Migrate();
|
|
|
|
return host;
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
base.Dispose(disposing);
|
|
if (disposing)
|
|
{
|
|
_connection?.Dispose();
|
|
}
|
|
}
|
|
|
|
public StubHttpMessageHandler HttpHandler => Services.GetRequiredService<StubHttpMessageHandler>();
|
|
|
|
public Task WithDbContextAsync(Func<AppDbContext, Task> action)
|
|
{
|
|
using var scope = Services.CreateScope();
|
|
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
|
|
return action(db);
|
|
}
|
|
|
|
public Task<T> WithDbContextAsync<T>(Func<AppDbContext, Task<T>> action)
|
|
{
|
|
using var scope = Services.CreateScope();
|
|
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
|
|
return action(db);
|
|
}
|
|
|
|
public HttpClient CreateClientWithCookies()
|
|
{
|
|
return CreateClient(new WebApplicationFactoryClientOptions
|
|
{
|
|
HandleCookies = true,
|
|
AllowAutoRedirect = false
|
|
});
|
|
}
|
|
}
|