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 _mockLoadTestRunInfoService; private readonly Mock _mockRateProcessingInfoService; private readonly Mock _mockQueueLoadTestProcessRateService; private readonly ILoadTestInitiationService _loadTestInitiationService; public LoadTestInitiationServiceTest() { _mockLoadTestRunInfoService = new Mock(); _mockRateProcessingInfoService = new Mock(); _mockQueueLoadTestProcessRateService = new Mock(); _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())).ReturnsAsync(loadTestRunInfo).Verifiable(); _mockRateProcessingInfoService.Setup(x => x.SaveRangeAsync(It.Is>( 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( loadTestRequest => loadTestRequest.RateProcessingInfo.LoadTestRunInfoId == loadTestRunInfo.LoadTestRunInfoId ))).Verifiable(); await _loadTestInitiationService.HandleLoadTestInitiation(request); _mockLoadTestRunInfoService.Verify(x => x.SaveAsync(It.IsAny()), Times.Once); _mockRateProcessingInfoService.Verify(x => x.SaveRangeAsync(It.IsAny>()), Times.Once); _mockRateProcessingInfoService.Verify(x => x.GetByLoadTestRunInfoId(It.IsAny()), Times.Once); _mockQueueLoadTestProcessRateService.Verify(x => x.QueueLoadTestProcessRateRequest(It.IsAny()), 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())).ThrowsAsync(new Exception("Test")).Verifiable(); Assert.ThrowsAsync( async () => await _loadTestInitiationService.HandleLoadTestInitiation(request)); _mockLoadTestRunInfoService.Verify(x => x.SaveAsync(It.IsAny()), Times.Once); _mockRateProcessingInfoService.Verify(x => x.SaveRangeAsync(It.IsAny>()), Times.Never); _mockRateProcessingInfoService.Verify(x => x.GetByLoadTestRunInfoId(It.IsAny()), Times.Never); _mockQueueLoadTestProcessRateService.Verify(x => x.QueueLoadTestProcessRateRequest(It.IsAny()), 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>(); var properties = typeof(RateRequest).GetProperties(); var availableProperties = properties.Except(new List {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 {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 { value } ); } else { propertyList[key.Name].Add(value); } } return new LoadTestInitiateRequest { RateType = rateType, PropertyList = propertyList }; } private static IEnumerable GenerateRateProcessingInfos(LoadTestInitiateRequest request, int loadTestRunInfoId) => request.PropertyList.Select( combination => new RateProcessingInfo { LoadTestRunInfoId = loadTestRunInfoId, RateProcessingStatusType = RateProcessingStatusTypes.Processing, Payload = JsonConvert.SerializeObject(combination) }).ToList(); }