using System.Text; using FindAndDrive.Domain.Models.DTO.Request; using FindAndDrive.Domain.Models.DTO.Response; using FindAndDrive.Domain.Models.Entities; using FindAndDrive.Tests.Performance.Helpers; using NBomber.Contracts; using NBomber.CSharp; using Newtonsoft.Json; namespace FindAndDrive.Tests.Performance.Scenarios; public class AdminUserScenario { private readonly TokenRequest _tokenRequest; private readonly HttpClient _httpClient; public AdminUserScenario(TokenRequest tokenRequest, string baseUrl) { _tokenRequest = tokenRequest; _httpClient = new HttpClient() { BaseAddress = new Uri(baseUrl) }; } public List GetScenarios() { var scenarios = new List(); var clientClientScenario = Scenario.Create("admin_create_client_scenario", async context => { var token = await AuthenticationHelper.GetToken(_httpClient, _tokenRequest); // new client var client = await CreateClient(token.Token); var getClient = await GetClient(token.Token, client.ClientId); var roles = await GetRoles(token.Token); // new api keys var roleId = roles.First(f => f.RoleName == "Financing").RoleId; var apiKey = await CreateApiKey(token.Token, getClient.ClientId, roleId); var getApiKeys = await GetApiKeys(token.Token, getClient.ClientId); return Response.Ok(); }) .WithoutWarmUp() .WithLoadSimulations( Simulation.Inject(rate: 10, interval: TimeSpan.FromSeconds(1), during: TimeSpan.FromSeconds(30)) ); scenarios.Add(clientClientScenario); return scenarios; } private async Task CreateClient(string token) { var payload = new CreateClientRequest { ClientName = $"TestClient{Guid.NewGuid()}" }; var uriBuilder = new UriBuilder(_httpClient.BaseAddress) { Path = $"api/Client" }; using var request = new HttpRequestMessage(HttpMethod.Post, uriBuilder.Uri); request.Headers.Add("Authorization", $"Bearer {token}"); request.Content = new StringContent( JsonConvert.SerializeObject(payload), Encoding.UTF8, "application/json" ); var response = await _httpClient.SendAsync(request); response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject(body); return result; } private async Task GetClient(string token, Guid clientId) { var uriBuilder = new UriBuilder(_httpClient.BaseAddress) { Path = $"api/Client/{clientId}" }; using var request = new HttpRequestMessage(HttpMethod.Get, uriBuilder.Uri); request.Headers.Add("Authorization", $"Bearer {token}"); var response = await _httpClient.SendAsync(request); response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject(body); return result; } private async Task> GetRoles(string token) { var uriBuilder = new UriBuilder(_httpClient.BaseAddress) { Path = "api/Role" }; using var request = new HttpRequestMessage(HttpMethod.Get, uriBuilder.Uri); request.Headers.Add("Authorization", $"Bearer {token}"); var response = await _httpClient.SendAsync(request); response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject>(body); return result; } private async Task CreateApiKey(string token, Guid clientId, Guid roleId) { var payload = new CreateApiKeyRequest { ClientId = clientId, RoleId = roleId }; var uriBuilder = new UriBuilder(_httpClient.BaseAddress) { Path = $"api/ApiKey" }; using var request = new HttpRequestMessage(HttpMethod.Post, uriBuilder.Uri); request.Headers.Add("Authorization", $"Bearer {token}"); request.Content = new StringContent( JsonConvert.SerializeObject(payload), Encoding.UTF8, "application/json" ); var response = await _httpClient.SendAsync(request); response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject(body); return result; } private async Task> GetApiKeys(string token, Guid clientId) { var uriBuilder = new UriBuilder(_httpClient.BaseAddress) { Path = $"api/ApiKey/{clientId}" }; using var request = new HttpRequestMessage(HttpMethod.Get, uriBuilder.Uri); request.Headers.Add("Authorization", $"Bearer {token}"); var response = await _httpClient.SendAsync(request); response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject>(body); return result; } }