using System.Collections.Concurrent; using System.Net.Http.Json; using System.Text.Json; public static class AuthHelper { private static readonly ConcurrentDictionary TokenCache = new(); /// /// Logs in as the given user and returns an HttpClient with the JWT /// Authorization header pre-configured. Login also returns a refresh token; /// integration tests use the access token only. /// public static async Task LoginAsync( ApiFixture fixture, string username = "entry1", string password = "password") { var cacheKey = $"{username}:{password}"; if (!TokenCache.TryGetValue(cacheKey, out var token)) { var loginClient = fixture.CreateClient(); var loginResp = await loginClient.PostAsJsonAsync("/api/v1/auth/login", new { username, password }); loginResp.EnsureSuccessStatusCode(); var body = await loginResp.Content.ReadFromJsonAsync(); token = body!.RootElement.GetProperty("data").GetProperty("token").GetString()!; TokenCache[cacheKey] = token; } var client = fixture.CreateClient(); client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); return client; } }