Files
2026-04-07 14:21:04 -05:00

128 lines
6.9 KiB
C#

using System.Globalization;
using System.Reflection;
using LCU.API.Internal.LoanRate.Services;
using LCU.API.Internal.LoanRate.Services.LoadTestingServices;
using LCU.API.Internal.LoanRate.Services.QueueServices;
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.LoanRateModels.Entities.LoadTestingEntities;
using LCU.Library.Internal.LoanRateModels.Enums;
using LCU.Library.Internal.LoanRateModels.Enums.LoadTestingEnums;
using LCU.Library.Internal.LoanRateModels.Requests;
using LCU.Library.Internal.LoanRateModels.Requests.LoadTestRequest;
using Newtonsoft.Json;
namespace LCU.API.Internal.LoanRateTests.ServiceTests.LoadTestingServices;
public class LoadTestInitiationServiceTest
{
private readonly Mock<ILoadTestRunInfoService> _mockLoadTestRunInfoService;
private readonly Mock<IRateProcessingInfoService> _mockRateProcessingInfoService;
private readonly Mock<IQueueLoadTestProcessRateService> _mockQueueLoadTestProcessRateService;
private readonly ILoadTestInitiationService _loadTestInitiationService;
public LoadTestInitiationServiceTest()
{
_mockLoadTestRunInfoService = new Mock<ILoadTestRunInfoService>();
_mockRateProcessingInfoService = new Mock<IRateProcessingInfoService>();
_mockQueueLoadTestProcessRateService = new Mock<IQueueLoadTestProcessRateService>();
_loadTestInitiationService = new LoadTestInitiationService(_mockLoadTestRunInfoService.Object,
_mockRateProcessingInfoService.Object,
_mockQueueLoadTestProcessRateService.Object);
}
[Fact]
public async void HandleLoadTestInitiation_Success()
{
var propertyCount = new Random().Next(1, 100);
var request = GenerateLoadTestInitiateRequest(propertyCount);
var loadTestRunInfo = new LoadTestRunInfo { LoadTestRunInfoId = DateTime.Now.Millisecond };
var rateProcessingInfos = GenerateRateProcessingInfos(request, loadTestRunInfo.LoadTestRunInfoId).ToList();
_mockLoadTestRunInfoService.Setup(x => x.SaveAsync(It.IsAny<LoadTestRunInfo>())).ReturnsAsync(loadTestRunInfo).Verifiable();
_mockRateProcessingInfoService.Setup(x => x.SaveRangeAsync(It.Is<List<RateProcessingInfo>>(
list => list.All(
rateProcessingInfo => rateProcessingInfo.LoadTestRunInfoId == loadTestRunInfo.LoadTestRunInfoId
&& !string.IsNullOrWhiteSpace(rateProcessingInfo.Payload)
&& rateProcessingInfo.RateProcessingStatusType == RateProcessingStatusTypes.Processing)
&& list.Count == propertyCount))).Verifiable();
_mockRateProcessingInfoService.Setup(x => x.GetByLoadTestRunInfoId(loadTestRunInfo.LoadTestRunInfoId)).ReturnsAsync(rateProcessingInfos).Verifiable();
_mockQueueLoadTestProcessRateService.Setup(x => x.QueueLoadTestProcessRateRequest(It.Is<LoadTestProcessRateRequest>( loadTestRequest =>
loadTestRequest.RateProcessingInfo.LoadTestRunInfoId == loadTestRunInfo.LoadTestRunInfoId ))).Verifiable();
await _loadTestInitiationService.HandleLoadTestInitiation(request);
_mockLoadTestRunInfoService.Verify(x => x.SaveAsync(It.IsAny<LoadTestRunInfo>()), Times.Once);
_mockRateProcessingInfoService.Verify(x => x.SaveRangeAsync(It.IsAny<List<RateProcessingInfo>>()), Times.Once);
_mockRateProcessingInfoService.Verify(x => x.GetByLoadTestRunInfoId(It.IsAny<int>()), Times.Once);
_mockQueueLoadTestProcessRateService.Verify(x => x.QueueLoadTestProcessRateRequest(It.IsAny<LoadTestProcessRateRequest>()), Times.Exactly(rateProcessingInfos.Count));
}
[Fact]
public void HandleLoadTestInitiation_Failure_ThrowsException()
{
var propertyCount = new Random().Next(1, 100);
var request = GenerateLoadTestInitiateRequest(propertyCount);
_mockLoadTestRunInfoService.Setup(x => x.SaveAsync(It.IsAny<LoadTestRunInfo>())).ThrowsAsync(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>( async () => await _loadTestInitiationService.HandleLoadTestInitiation(request));
_mockLoadTestRunInfoService.Verify(x => x.SaveAsync(It.IsAny<LoadTestRunInfo>()), Times.Once);
_mockRateProcessingInfoService.Verify(x => x.SaveRangeAsync(It.IsAny<List<RateProcessingInfo>>()), Times.Never);
_mockRateProcessingInfoService.Verify(x => x.GetByLoadTestRunInfoId(It.IsAny<int>()), Times.Never);
_mockQueueLoadTestProcessRateService.Verify(x => x.QueueLoadTestProcessRateRequest(It.IsAny<LoadTestProcessRateRequest>()), Times.Never);
}
private LoadTestInitiateRequest GenerateLoadTestInitiateRequest(int propertyListLength = 1)
{
var values = Enum.GetValues(typeof(RateTypes));
var random = new Random();
var rateType = (RateTypes)(values.GetValue(random.Next(values.Length)) ?? RateTypes.DirectAuto);
var propertyList = new Dictionary<string, List<string>>();
var properties = typeof(RateRequest).GetProperties();
var availableProperties = properties.Except(new List<PropertyInfo> {properties.First(x => x.Name == nameof(RateRequest.RateType))}).ToList();
for (var i = 0; i < propertyListLength; i++)
{
var key = availableProperties[random.Next(availableProperties.Count)];
string value;
if (key.PropertyType == typeof(DateTime))
{
value = new DateTime().AddDays(random.Next(1000)).ToString(CultureInfo.InvariantCulture);
}
else if (new List<Type> {typeof(int), typeof(decimal), typeof(long)}.Contains(key.PropertyType))
{
value = random.Next(100).ToString();
}
else
{
value = Guid.NewGuid().ToString();
}
if (!propertyList.ContainsKey(key.Name))
{
propertyList.Add(key.Name, new List<string> { value } );
}
else
{
propertyList[key.Name].Add(value);
}
}
return new LoadTestInitiateRequest
{
RateType = rateType,
PropertyList = propertyList
};
}
private static IEnumerable<RateProcessingInfo> GenerateRateProcessingInfos(LoadTestInitiateRequest request, int loadTestRunInfoId)
=> request.PropertyList.Select(
combination => new RateProcessingInfo
{
LoadTestRunInfoId = loadTestRunInfoId,
RateProcessingStatusType = RateProcessingStatusTypes.Processing,
Payload = JsonConvert.SerializeObject(combination)
}).ToList();
}