using CandyHouseDatabase; using CandyHouseTests.Infrastructure; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Serilog; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json; using System.Threading.Tasks; namespace CandyHouseTests.WebApiControllersTests; internal class BaseWebApiControllerTest { private WebApplicationFactory _webApplication; protected HttpClient HttpClient { get; private set; } protected CandyHouseDbContext CandyHouseDbContext { get; private set; } protected static readonly JsonSerializerOptions JsonSerializerOptions = new() { PropertyNameCaseInsensitive = true }; [OneTimeSetUp] public void OneTimeSetUp() { _webApplication = new CustomWebApplicationFactory(); HttpClient = _webApplication .WithWebHostBuilder(builder => { builder.ConfigureTestServices(services => { using var loggerFactory = new LoggerFactory(); loggerFactory.AddSerilog(new LoggerConfiguration() .ReadFrom.Configuration(new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build()) .CreateLogger()); services.AddSingleton(loggerFactory); }); }) .CreateClient(); var request = HttpClient.GetAsync("/login/user").GetAwaiter().GetResult(); var data = request.Content.ReadAsStringAsync().GetAwaiter().GetResult(); HttpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {data}"); CandyHouseDbContext = _webApplication.Services.GetRequiredService(); CandyHouseDbContext.Database.EnsureDeleted(); CandyHouseDbContext.Database.EnsureCreated(); } [OneTimeTearDown] public void OneTimeTearDown() { CandyHouseDbContext?.Database.EnsureDeleted(); CandyHouseDbContext?.Dispose(); HttpClient?.Dispose(); _webApplication?.Dispose(); } protected static async Task GetModelFromResponseAsync(HttpResponseMessage response) => JsonSerializer.Deserialize(await response.Content.ReadAsStringAsync(), JsonSerializerOptions); protected static StringContent MakeContent(object model) => new(JsonSerializer.Serialize(model), Encoding.UTF8, "application/json"); }