using System.Net.Http.Headers; using Microsoft.Extensions.Configuration; using Xunit; namespace Azaion.E2E.Helpers; public sealed class TestFixture : IAsyncLifetime { private string _baseUrl = ""; public HttpClient HttpClient { get; private set; } = null!; public string AdminToken { get; private set; } = ""; public string AdminEmail { get; private set; } = ""; public string AdminPassword { get; private set; } = ""; public string UploaderEmail { get; private set; } = ""; public string UploaderPassword { get; private set; } = ""; public string JwtSecret { get; private set; } = ""; public IConfiguration Configuration { get; private set; } = null!; public async Task InitializeAsync() { Configuration = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile("appsettings.test.json", optional: false) .AddEnvironmentVariables() .Build(); _baseUrl = Configuration["ApiBaseUrl"] ?? throw new InvalidOperationException("Configuration value ApiBaseUrl is required."); AdminEmail = Configuration["AdminEmail"] ?? throw new InvalidOperationException("Configuration value AdminEmail is required."); AdminPassword = Configuration["AdminPassword"] ?? throw new InvalidOperationException("Configuration value AdminPassword is required."); UploaderEmail = Configuration["UploaderEmail"] ?? throw new InvalidOperationException("Configuration value UploaderEmail is required."); UploaderPassword = Configuration["UploaderPassword"] ?? throw new InvalidOperationException("Configuration value UploaderPassword is required."); JwtSecret = Configuration["JwtSecret"] ?? throw new InvalidOperationException("Configuration value JwtSecret is required."); var baseUri = new Uri(_baseUrl, UriKind.Absolute); HttpClient = new HttpClient { BaseAddress = baseUri, Timeout = TimeSpan.FromMinutes(5) }; using var loginClient = CreateApiClient(); AdminToken = await loginClient.LoginAsync(AdminEmail, AdminPassword).ConfigureAwait(false); HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AdminToken); } public Task DisposeAsync() { HttpClient.Dispose(); return Task.CompletedTask; } public ApiClient CreateApiClient() { var client = new HttpClient { BaseAddress = new Uri(_baseUrl, UriKind.Absolute), Timeout = TimeSpan.FromMinutes(5) }; return new ApiClient(client, disposeClient: true); } public ApiClient CreateAuthenticatedClient(string token) { var api = CreateApiClient(); api.SetAuthToken(token); return api; } } [CollectionDefinition("E2E")] public sealed class E2ECollection : ICollectionFixture { }