using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using RacePlannerApi.Data; using System.Net.Http.Headers; using System.Net.Http.Json; using System.Text.Json; using Xunit; namespace backend.Tests.Integration; public class IntegrationTestBase : IClassFixture> { protected readonly WebApplicationFactory _factory; protected readonly HttpClient _client; protected readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web); public IntegrationTestBase(WebApplicationFactory factory) { _factory = factory.WithWebHostBuilder(builder => { builder.ConfigureServices(services => { // Replace the database context with an in-memory database var descriptor = services.SingleOrDefault( d => d.ServiceType == typeof(DbContextOptions)); if (descriptor != null) { services.Remove(descriptor); } services.AddDbContext(options => { options.UseInMemoryDatabase("IntegrationTestDb"); }); // Ensure the database is created and seeded var sp = services.BuildServiceProvider(); using var scope = sp.CreateScope(); var db = scope.ServiceProvider.GetRequiredService(); db.Database.EnsureCreated(); }); }); _client = _factory.CreateClient(); } protected HttpClient CreateAuthenticatedClient(string token = "") { var client = _factory.CreateClient(); if (!string.IsNullOrEmpty(token)) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); } return client; } protected async Task GetAsync(string url) { var response = await _client.GetAsync(url); response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync(_jsonOptions); } protected async Task PostAsync(string url, TRequest data) { var response = await _client.PostAsJsonAsync(url, data, _jsonOptions); response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync(_jsonOptions); } protected async Task PutAsync(string url, TRequest data) { var response = await _client.PutAsJsonAsync(url, data, _jsonOptions); response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync(_jsonOptions); } protected async Task DeleteAsync(string url) { var response = await _client.DeleteAsync(url); response.EnsureSuccessStatusCode(); } }