using AutoTazTest.Infrastructure; using AvtoTAZDatabase; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestPlatform.TestHost; using Serilog; using System.Text; using System.Text.Json; namespace AutoTazTest.WebApiControllersTests; internal class BaseWebApiControllerTest { private WebApplicationFactory _webApplication; protected HttpClient HttpClient { get; private set; } protected AvtoTAZDbContext AvtoTAZDbContext { 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}"); AvtoTAZDbContext = _webApplication.Services.GetRequiredService(); AvtoTAZDbContext.Database.EnsureDeleted(); AvtoTAZDbContext.Database.EnsureCreated(); } [OneTimeTearDown] public void OneTimeTearDown() { AvtoTAZDbContext?.Database.EnsureDeleted(); AvtoTAZDbContext?.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"); }