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

188 lines
6.9 KiB
C#

using Newtonsoft.Json.Linq;
namespace ESuite.UI.E2E.Helpers.Mail
{
public class Mailer
{
public static string CustomizeUserEmail(string email, string customText)
{
string[] parts = email.Split('@');
if (parts.Length == 2)
{
string firstPart = parts[0];
string domainPart = parts[1];
firstPart += $".{customText}";
string modifiedEmail = $"{firstPart}@{domainPart}";
return modifiedEmail;
}
else
{
throw new Exception($"Email '{email}' should have one sign '@'!");
}
}
public static async Task<string> GetIdFromPapercutAsync()
{
try
{
string apiUrl = "http://localhost:37408/api/messages?limit=1";
using HttpClient client = new();
HttpResponseMessage response = await client.GetAsync(apiUrl);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(content) ?? throw new Exception("Deserialized JSON is null");
string id = json!.Messages[0].Id;
return id;
}
else
{
throw new Exception($"Response is: {response.StatusCode}");
}
}
catch (Exception ex)
{
return $"Error: {ex.Message}";
}
}
private static string GetLinkFromBodyMessage(string text, string? startSymbols = "http", string? endSymbols = "\"")
{
int startIndex = text.IndexOf(startSymbols!);
int endIndex = text.IndexOf(endSymbols!, startIndex);
if (startIndex != -1 && endIndex != -1)
{
string url = text[startIndex..endIndex];
return url;
}
else
{
throw new Exception($"I can't find the link");
}
}
public static async Task<string> GetLinkFromHtmlBodyViaPapercut(string id, string? LinkText = "")
{
try
{
string apiUrl = $"http://localhost:37408/api/messages/{id}";
using HttpClient client = new();
HttpResponseMessage response = await client.GetAsync(apiUrl);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
if (!string.IsNullOrEmpty(content))
{
dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(content) ?? throw new Exception("Deserialized JSON is null");
string htmlBody = json!.HtmlBody;
return GetLinkFromBodyMessage(htmlBody);
}
else
{
throw new Exception("Received empty or null content.");
}
}
else
{
throw new Exception($"Response status is: {response.StatusCode}");
}
}
catch (Exception ex)
{
return $"Error: {ex.Message}";
}
}
public static async Task<string> GetLinkFromHtmlBodyViaTestMailApp(string clientEmail, string apiKey, string nameSpace, int retryCount = 0)
{
if (string.IsNullOrEmpty(apiKey))
{
throw new Exception("API key is empty! Check release variables!");
}
try
{
string apiUrl = $"https://api.testmail.app/api/json?apikey={apiKey}&namespace={nameSpace}";
using HttpClient client = new();
HttpResponseMessage response = await client.GetAsync(apiUrl);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
if (!string.IsNullOrEmpty(content))
{
dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(content) ?? throw new Exception("Deserialized JSON is null");
try
{
if (json.emails != null && !string.IsNullOrEmpty(json.emails[0].html.ToString()))
{
JArray emails = (JArray)json["emails"];
foreach (JObject email in emails.Cast<JObject>())
{
JObject toParsed = (JObject)email["to_parsed"]![0]!;
string address = (string)toParsed["address"]!;
if (address == clientEmail)
{
return GetLinkFromBodyMessage((string)email["html"]!);
}
else
{
throw new Exception($"I can't find the email with the recipient: {clientEmail}");
}
}
throw new Exception("I can't find address in email");
}
else
{
throw new Exception("Empty emails");
}
}
catch (Exception)
{
if (retryCount < 3)
{
await Task.Delay(TimeSpan.FromMinutes(1));
return await GetLinkFromHtmlBodyViaTestMailApp(clientEmail, apiKey, nameSpace, retryCount + 1);
}
else
{
throw new Exception("Exceeded maximum retry limit to get Email.");
}
}
}
else
{
throw new Exception("Received empty or null content.");
}
}
else
{
throw new Exception($"Response status is: {response.StatusCode}");
}
}
catch (Exception ex)
{
return $"Error: {ex.Message}";
}
}
}
}