Backend/e-suite.Automation.UITests/ESuite.UI.E2E/Helpers/APIHelper.cs
2026-01-20 21:50:10 +00:00

490 lines
19 KiB
C#

using e_suite.API.Common.models;
using e_suite.Database.Core.Models;
using eSuite.Core.Miscellaneous;
using eSuite.Core.Sequences;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Net.Http.Headers;
using System.Text;
namespace ESuite.UI.E2E.Helpers
{
public class APIHelper
{
private readonly HttpClient httpClient;
private readonly ConfigHelper configHelper;
private readonly ScenarioContext _scenarioContext;
public APIHelper(ScenarioContext scenarioContext)
{
this.httpClient = new HttpClient();
configHelper = new ConfigHelper();
_scenarioContext = scenarioContext;
}
public async Task<string> SendGetRequest(string url)
{
try
{
HttpResponseMessage response = await httpClient.GetAsync(url);
return await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
throw new Exception($"Error sending GET request: {ex.Message}");
}
}
public async Task<HttpResponseMessage> SendPostRequest(string url, string requestBody)
{
try
{
StringContent content = new(requestBody, Encoding.UTF8, "application/json");
return await httpClient.PostAsync(url, content);
}
catch (Exception ex)
{
throw new Exception($"Error sending POST request: {ex.Message}");
}
}
private string _authToken { get; set; } = string.Empty;
public void ClearAuthToken()
{
_authToken = string.Empty;
}
public async Task<string> GetAuthToken()
{
if (!string.IsNullOrWhiteSpace(_authToken))
{
return _authToken;
}
var url = $"{configHelper.APIUrl}/api/Authentication/login";
string requestBody = $@"
{{
""email"": ""{configHelper.AdminName}"",
""password"": ""{configHelper.AdminPassword}"",
""securityCode"": """",
""requestTfaRemoval"": false
}}";
try
{
HttpResponseMessage response = await SendPostRequest(url, requestBody);
if (response.IsSuccessStatusCode)
{
var responseContent = await response.Content.ReadAsStringAsync();
_authToken = GetFieldValueFromJSONResponse("token", responseContent);
return _authToken;
}
else
{
throw new Exception("GetAuthToken Response is: " + response.StatusCode);
}
}
catch (Exception ex)
{
throw new Exception($"Error getting authentication token: {ex.Message}");
}
}
public async Task<string> SendAuthenticatedRequest(string url, string token, string requestType = "GET")
{
try
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
HttpResponseMessage response;
switch (requestType)
{
case "GET": response = await httpClient.GetAsync(url); break;
case "POST":
response = await httpClient.PostAsync(url, null);
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Response content: " + await response.Content.ReadAsStringAsync());
}
else
{
var body = await response.Content.ReadAsStringAsync();
throw new Exception("Response status code from POST request: " + response.StatusCode + body);
}
break;
default: throw new Exception("Unknown request type");
}
return await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
throw new Exception($"Error sending authenticated POST request: {ex.Message}");
}
finally
{
httpClient.DefaultRequestHeaders.Authorization = null;
}
}
public async Task<HttpResponseMessage> SendAuthenticatedRequest<T>(string url, string token, T requestBody = default!, string requestType = "GET")
{
try
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
HttpResponseMessage response;
switch (requestType)
{
case "GET": response = await httpClient.GetAsync(url); break;
case "POST":
var postPayload = System.Text.Json.JsonSerializer.Serialize(requestBody);
StringContent postContent = new(postPayload!, Encoding.UTF8, "application/json");
response = await httpClient.PostAsync(url, postContent);
AutomationTestManagerHelper.SaveTimingForAction(_scenarioContext);
break;
case "DELETE":
var deletePayload = System.Text.Json.JsonSerializer.Serialize(requestBody);
var deleteContent = new StringContent(deletePayload, Encoding.UTF8, "application/json");
var request = new HttpRequestMessage
{
Method = HttpMethod.Delete,
RequestUri = new Uri(url),
Content = deleteContent
};
response = await httpClient.SendAsync(request);
AutomationTestManagerHelper.SaveTimingForAction(_scenarioContext);
break;
default: throw new Exception("Unknown request type");
}
return response;
}
catch (Exception ex)
{
throw new Exception($"Error sending authenticated POST request: {ex.Message}");
}
finally
{
httpClient.DefaultRequestHeaders.Authorization = null;
}
}
public static string GetFieldValueFromJSONResponse(string field, dynamic jsonString)
{
try
{
dynamic json = JsonConvert.DeserializeObject(jsonString);
return json[field]; ;
}
catch (Exception)
{
throw new Exception(
$"Error appears in process of getting field '{field}' data from JSON string: {jsonString}"
);
}
}
public async Task<JObject> GetDomains(string url)
{
string token = await GetAuthToken();
UriBuilder domainsUriBuilder = new($"{url}/api/Domain/domains");
var query = System.Web.HttpUtility.ParseQueryString(domainsUriBuilder.Query);
query["SortAscending"] = "false";
query["SortKey"] = "id";
domainsUriBuilder.Query = query.ToString();
string domainsUrl = domainsUriBuilder.ToString();
string getDomainsResponse = await SendAuthenticatedRequest(domainsUrl, token);
if (string.IsNullOrEmpty(getDomainsResponse))
{
throw new Exception("Could not get response for getting all domains.");
}
JObject getDomainsJson = JObject.Parse(getDomainsResponse);
return getDomainsJson;
}
public async Task<JObject> GetUsers(string url)
{
string token = await GetAuthToken();
UriBuilder usersUriBuilder = new($"{url}/api/User/users");
var query = System.Web.HttpUtility.ParseQueryString(usersUriBuilder.Query);
query["SortKey"] = "created";
query["SortAscending"] = "false";
usersUriBuilder.Query = query.ToString();
string usersUrl = usersUriBuilder.ToString();
string getUsersResponse = await SendAuthenticatedRequest(usersUrl, token);
if (string.IsNullOrEmpty(getUsersResponse))
{
throw new Exception("Could not get response for getting all Users.");
}
var settings = new JsonSerializerSettings
{
DateParseHandling = DateParseHandling.None, // Prevent automatic DateTime parsing
DateFormatHandling = DateFormatHandling.IsoDateFormat
};
JObject getUsers = JsonConvert.DeserializeObject<JObject>(getUsersResponse, settings)!;
return getUsers;
}
public async Task<JObject> GetOrganisations(string url)
{
string token = await GetAuthToken();
UriBuilder usersUriBuilder = new($"{url}/api/Organisations/organisations");
var query = System.Web.HttpUtility.ParseQueryString(usersUriBuilder.Query);
query["SortAscending"] = "false";
query["SortKey"] = "id";
usersUriBuilder.Query = query.ToString();
string usersUrl = usersUriBuilder.ToString();
string getUsersResponse = await SendAuthenticatedRequest(usersUrl, token);
if (string.IsNullOrEmpty(getUsersResponse))
{
throw new Exception("Could not get response for getting all Organisations.");
}
JObject getUsers = JsonConvert.DeserializeObject<JObject>(getUsersResponse)!;
return getUsers;
}
public async Task<JObject> GetRoles(string url)
{
string token = await GetAuthToken();
UriBuilder rolesUriBuilder = new($"{url}/api/Role/roles");
var query = System.Web.HttpUtility.ParseQueryString(rolesUriBuilder.Query);
query["SortAscending"] = "false";
query["SortKey"] = "id";
rolesUriBuilder.Query = query.ToString();
string rolesUrl = rolesUriBuilder.ToString();
string getRolesResponse = await SendAuthenticatedRequest(rolesUrl, token);
if (string.IsNullOrEmpty(getRolesResponse))
{
throw new Exception("Could not get response for getting all domains.");
}
JObject getDomainsJson = JObject.Parse(getRolesResponse);
return getDomainsJson;
}
public async Task CreateNewUser(string url, string firstName, string middleName, string lastName, string email, int domainId)
{
var requestBody = new UserRegistration
{
FirstName = firstName,
MiddleNames = middleName,
LastName = lastName,
Email = email,
DomainId = new eSuite.Core.Miscellaneous.GeneralIdRef
{
Id = domainId
}
};
string token = await GetAuthToken();
UriBuilder usersUriBuilder = new($"{url}/api/User/user");
string usersUrl = usersUriBuilder.ToString();
await SendAuthenticatedRequest(usersUrl, token, requestBody, "POST");
}
public async Task CreateNewSSOProvider(string url, string name, string clientId, string clientSecret, string validIssuer, string authorizationEndpoint, string tokenEndpoint, bool isPublic, Guid guid)
{
var requestBody = new CreateSsoProvider()
{
Name = name,
ClientId = clientId,
ClientSecret = clientSecret,
ValidIssuer = validIssuer,
AuthorizationEndpoint = authorizationEndpoint,
TokenEndpoint = tokenEndpoint,
IsPublic = isPublic,
Guid = guid
};
string token = await GetAuthToken();
UriBuilder ssoProviderUriBuilder = new($"{url}/api/SsoManager/ssoProvider");
string ssoProviderUrl = ssoProviderUriBuilder.ToString();
await SendAuthenticatedRequest(ssoProviderUrl, token, requestBody, "POST");
}
public async Task<HttpResponseMessage> CreateNewOrganisation(string url, Guid guid, string name, string address, OrganisationStatus status)
{
var requestBody = new CreateOrganisation()
{
Guid = guid,
Name = name,
Address = address,
Status = status
};
string token = await GetAuthToken();
UriBuilder organisationUriBuilder = new($"{url}/api/Organisations/organisation");
string siteUrl = organisationUriBuilder.ToString();
HttpResponseMessage response = await SendAuthenticatedRequest(siteUrl, token, requestBody, "POST");
return response;
}
public async Task CreateNewSite(string url, Guid guid, string name, string address, OrganisationStatus status, int organisationId)
{
var requestBody = new CreateSite()
{
Name = name,
Address = address,
Status = status,
OrganisationId = new eSuite.Core.Miscellaneous.GeneralIdRef
{
Id = organisationId
},
Guid = guid
};
string token = await GetAuthToken();
UriBuilder siteUriBuilder = new($"{url}/api/Site/site");
string siteUrl = siteUriBuilder.ToString();
await SendAuthenticatedRequest(siteUrl, token, requestBody, "POST");
}
public async Task<HttpResponseMessage> CreateNewDomain(string url, Guid guid, string name, string sunriseHostName, string sunriseAppId, string sunriseCategoryId, int? sigmaId)
{
var requestBody = new CreateDomain()
{
Guid = guid,
Name = name,
SunriseHostName = sunriseHostName,
SunriseAppId = sunriseAppId,
SunriseCategoryId = sunriseCategoryId,
SigmaId = sigmaId
};
string token = await GetAuthToken();
UriBuilder domainUriBuilder = new($"{url}/api/Domain/domain");
string siteUrl = domainUriBuilder.ToString();
HttpResponseMessage response = await SendAuthenticatedRequest(siteUrl, token, requestBody, "POST");
return response;
}
public async Task CreateNewRole(string url, string name, Guid guid, bool isSuperUser, bool isAdministrator, int domainId)
{
var requestBody = new CreateRole
{
Name = name,
Guid = guid,
IsSuperUser = isSuperUser,
IsAdministrator = isAdministrator,
DomainId = new eSuite.Core.Miscellaneous.GeneralIdRef
{
Id = domainId
}
};
string token = await GetAuthToken();
UriBuilder roleUriBuilder = new($"{url}/api/Role/role");
string roleUrl = roleUriBuilder.ToString();
await SendAuthenticatedRequest(roleUrl, token, requestBody, "POST");
}
public async Task CreateNewSequence(string url, string name, int seed, int increment, string pattern, Rollover rollOver, Guid guid)
{
var requestBody = new Sequence
{
Name = name,
Seed = seed,
Increment = increment,
Pattern = pattern,
RolloverType = rollOver,
GeneralIdRef = new eSuite.Core.Miscellaneous.GeneralIdRef()
{
Guid = guid
}
};
string token = await GetAuthToken();
UriBuilder sequenceUriBuilder = new($"{url}/api/Sequences/sequence");
string sequenceUrl = sequenceUriBuilder.ToString();
await SendAuthenticatedRequest(sequenceUrl, token, requestBody, "POST");
}
public async Task CreateAdminRoleToLatestDomain(string url, Guid roleGuid, int roleId, Guid userGuid, int userId)
{
var requestBody = new UserRoleIds
{
RoleId = new eSuite.Core.Miscellaneous.GeneralIdRef()
{
Guid = roleGuid,
Id = roleId
},
UserId = new eSuite.Core.Miscellaneous.GeneralIdRef()
{
Guid = userGuid,
Id = userId
}
};
string token = await GetAuthToken();
UriBuilder sequenceUriBuilder = new($"{url}/api/Role/roleUsers");
string sequenceUrl = sequenceUriBuilder.ToString();
await SendAuthenticatedRequest(sequenceUrl, token, requestBody, "POST");
}
public async Task DeleteUserAPI(string url, Guid userGuid, int userId)
{
var requestBody = new GeneralIdRef
{
Guid = userGuid,
Id = userId
};
string token = await GetAuthToken();
UriBuilder sequenceUriBuilder = new($"{url}/api/User/user");
string sequenceUrl = sequenceUriBuilder.ToString();
string ddd = JsonConvert.SerializeObject(requestBody);
var response = await SendAuthenticatedRequest(sequenceUrl, token, requestBody, "DELETE");
var r = await response.Content.ReadAsStringAsync();
var statusCode = response.StatusCode;
}
public async Task DeleteDomainAPI(string url, Guid userGuid, int userId)
{
var requestBody = new GeneralIdRef
{
Guid = userGuid,
Id = userId
};
string token = await GetAuthToken();
UriBuilder sequenceUriBuilder = new($"{url}/api/Domain/domain");
string sequenceUrl = sequenceUriBuilder.ToString();
string ddd = JsonConvert.SerializeObject(requestBody);
var response = await SendAuthenticatedRequest(sequenceUrl, token, requestBody, "DELETE");
var r = await response.Content.ReadAsStringAsync();
var statusCode = response.StatusCode;
}
public void Dispose()
{
httpClient.Dispose();
}
internal void AssignAdminRoleToUser(string v)
{
throw new NotImplementedException();
}
}
}