using LCU.API.Internal.LoanRate.Services; using LCU.API.Internal.LoanRateLoadTestingLib.Repositories; using LCU.Library.Internal.Exceptions; using LCU.Library.Internal.LCUFilterModels.Pagination; using LCU.Library.Internal.LoanRateModels.Entities.LoadTestingEntities; using LCU.Library.Internal.LoanRateModels.Enums; namespace LCU.API.Internal.LoanRateTests.ServiceTests; public class LoadTestRunInfoServiceTest { private readonly Mock _mockUnitOfWork; private readonly Mock _mockLoadTestRunInfoRepository; private readonly ILoadTestRunInfoService _loadTestRunInfoService; public LoadTestRunInfoServiceTest() { _mockUnitOfWork = new Mock(); _mockLoadTestRunInfoRepository = new Mock(); _loadTestRunInfoService = new LoadTestRunInfoService(_mockUnitOfWork.Object, _mockLoadTestRunInfoRepository.Object); } [Fact] public async void LoadTestRunInfo_GetAsync_Success() { var loadTestRunInfos = new List { new() { LoadTestRunInfoId = 1 }, new() { LoadTestRunInfoId = 2 }, new() { LoadTestRunInfoId = 3 } }; _mockLoadTestRunInfoRepository.Setup(x => x.FindAsync()) .ReturnsAsync(loadTestRunInfos).Verifiable(); var result = (await _loadTestRunInfoService.GetAsync()).ToList(); Assert.NotNull(result); Assert.Equal(loadTestRunInfos.First().LoadTestRunInfoId, result.First().LoadTestRunInfoId); Assert.Equal(loadTestRunInfos.Count, result.Count); _mockLoadTestRunInfoRepository.Verify(); } [Fact] public async void LoadTestRunInfo_GetAsync_Success_NotFound() { List? loadTestRunInfos = null; _mockLoadTestRunInfoRepository.Setup(x => x.FindAsync()) .ReturnsAsync(loadTestRunInfos).Verifiable(); var result = await _loadTestRunInfoService.GetAsync(); Assert.NotNull(result); Assert.Empty(result); _mockLoadTestRunInfoRepository.Verify(); } [Fact] public void LoadTestRunInfo_GetAsync_Failure_Exception() { _mockLoadTestRunInfoRepository.Setup(x => x.FindAsync()) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.GetAsync()); _mockLoadTestRunInfoRepository.Verify(x => x.FindAsync(), Times.Once); } [Fact] public async void LoadTestRunInfo_GetByIdAsync_Success() { var loadTestRunInfoId = 1; var loadTestRunInfo = new LoadTestRunInfo { LoadTestRunInfoId = loadTestRunInfoId }; _mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(loadTestRunInfoId)) .ReturnsAsync(loadTestRunInfo).Verifiable(); var result = await _loadTestRunInfoService.GetByIdAsync(loadTestRunInfoId); Assert.NotNull(result); Assert.Equal(loadTestRunInfo.LoadTestRunInfoId, result.LoadTestRunInfoId); _mockLoadTestRunInfoRepository.Verify(); } [Fact] public async void LoadTestRunInfo_GetByIdAsync_Success_NotFound() { var loadTestRunInfoId = 1; LoadTestRunInfo? loadTestRunInfo = null; _mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(loadTestRunInfoId)) .ReturnsAsync(loadTestRunInfo).Verifiable(); var result = await _loadTestRunInfoService.GetByIdAsync(loadTestRunInfoId); Assert.Null(result); _mockLoadTestRunInfoRepository.Verify(); } [Fact] public void LoadTestRunInfo_GetByIdAsync_Failure_Exception() { _mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(It.IsAny())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.GetByIdAsync(It.IsAny())); _mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once); } [Fact] public async void LoadTestRunInfo_GetRangeByIdAsync_Success() { var loadTestRunInfos = new List { new() { LoadTestRunInfoId = 1 }, new() { LoadTestRunInfoId = 2 }, new() { LoadTestRunInfoId = 3 } }; var ids = loadTestRunInfos.Select(x => x.LoadTestRunInfoId).ToList(); _mockLoadTestRunInfoRepository.Setup(x => x.FindRangeByIdAsync(ids)) .ReturnsAsync(loadTestRunInfos).Verifiable(); var results = (await _loadTestRunInfoService.GetRangeByIdAsync(ids)).ToList(); Assert.NotNull(results); Assert.Equal(loadTestRunInfos.First().LoadTestRunInfoId, results.First().LoadTestRunInfoId); Assert.Equal(loadTestRunInfos.Count, results.Count); _mockLoadTestRunInfoRepository.Verify(); } [Fact] public async void LoadTestRunInfo_GetRangeByIdAsync_Success_NotFound() { List? loadTestRunInfos = null; var ids = new List { 1,2,3 }; _mockLoadTestRunInfoRepository.Setup(x => x.FindRangeByIdAsync(ids)) .ReturnsAsync(loadTestRunInfos).Verifiable(); var result = await _loadTestRunInfoService.GetRangeByIdAsync(ids); Assert.NotNull(result); Assert.Empty(result); _mockLoadTestRunInfoRepository.Verify(); } [Fact] public void LoadTestRunInfo_GetRangeByIdAsync_Failure_Exception() { _mockLoadTestRunInfoRepository.Setup(x => x.FindRangeByIdAsync(It.IsAny>())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.GetRangeByIdAsync(It.IsAny>())); _mockLoadTestRunInfoRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny>()), Times.Once); } [Fact] public async Task LoadTestRunInfo_GetFilteredLoadTestRunInfo_Success() { var pagedLoadTestRunInfoResult = new PagedResult(); var filter = new LoadTestRunInfoFilter { Page = 1, Limit = 2, SortableFields = null, RateTypes = new List { RateTypes.DirectAuto } }; _mockLoadTestRunInfoRepository.Setup(repo => repo.FindFilteredLoadTestRunInfosAsync(filter)) .ReturnsAsync(pagedLoadTestRunInfoResult).Verifiable(); var result = await _loadTestRunInfoService.GetFilteredLoadTestRunInfo(filter); Assert.NotNull(result); Assert.Equal(pagedLoadTestRunInfoResult, result); _mockLoadTestRunInfoRepository.Verify(x => x.FindFilteredLoadTestRunInfosAsync(It.IsAny()), Times.Once); } [Fact] public async Task LoadTestRunInfo_GetFilteredLoadTestRunInfo_NotFound() { var pagedLoadTestRunInfoResult = new PagedResult { Total = 0, Items = new List() }; var filter = new LoadTestRunInfoFilter { Page = 1, Limit = 2, SortableFields = null, RateTypes = new List { RateTypes.DirectAuto } }; _mockLoadTestRunInfoRepository.Setup(repo => repo.FindFilteredLoadTestRunInfosAsync(filter)) .ReturnsAsync(pagedLoadTestRunInfoResult).Verifiable(); var result = await _loadTestRunInfoService.GetFilteredLoadTestRunInfo(filter); Assert.NotNull(result); Assert.Equal(0, result.Total); _mockLoadTestRunInfoRepository.Verify(x => x.FindFilteredLoadTestRunInfosAsync(It.IsAny()), Times.Once); } [Fact] public void LoadTestRunInfo_GetFilteredLoadTestRunInfo_Failure_Exception() { _mockLoadTestRunInfoRepository.Setup(x => x.FindFilteredLoadTestRunInfosAsync(It.IsAny())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.GetFilteredLoadTestRunInfo(It.IsAny())); _mockLoadTestRunInfoRepository.Verify(x => x.FindFilteredLoadTestRunInfosAsync(It.IsAny()), Times.Once); } [Fact] public async void LoadTestRunInfo_SaveAsync_Success() { var loadTestRunInfo = new LoadTestRunInfo { RateType = RateTypes.DirectBoat }; var LoadTestRunInfoReturned = new LoadTestRunInfo { LoadTestRunInfoId = 1, RateType = RateTypes.DirectPowerSport }; _mockLoadTestRunInfoRepository.Setup(x => x.AddAsync(loadTestRunInfo)) .ReturnsAsync(LoadTestRunInfoReturned).Verifiable(); var result = await _loadTestRunInfoService.SaveAsync(loadTestRunInfo); Assert.NotNull(result); Assert.Equal(LoadTestRunInfoReturned.LoadTestRunInfoId, result.LoadTestRunInfoId); Assert.Equal(LoadTestRunInfoReturned.RateType, result.RateType); _mockLoadTestRunInfoRepository.Verify(x => x.AddAsync(It.IsAny()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once); } [Fact] public void LoadTestRunInfo_SaveAsync_Failure_ReturnedNull() { var loadTestRunInfo = new LoadTestRunInfo { RateType = RateTypes.DirectSignatureLoan }; LoadTestRunInfo? loadTestRunInfoReturned = null; _mockLoadTestRunInfoRepository.Setup(x => x.AddAsync(loadTestRunInfo)) .ReturnsAsync(loadTestRunInfoReturned).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.SaveAsync(loadTestRunInfo)); _mockLoadTestRunInfoRepository.Verify(x => x.AddAsync(It.IsAny()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public void LoadTestRunInfo_SaveAsync_Failure_Exception() { _mockLoadTestRunInfoRepository.Setup(x => x.AddAsync(It.IsAny())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.SaveAsync(It.IsAny())); _mockLoadTestRunInfoRepository.Verify(x => x.AddAsync(It.IsAny()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public async void LoadTestRunInfo_SaveRangeAsync_Success() { var loadTestRunInfos = new List { new() { RateType = RateTypes.DirectAuto }, new() { RateType = RateTypes.DirectBoat }, new() { RateType = RateTypes.DirectRv } }; _mockLoadTestRunInfoRepository.Setup(x => x.AddRangeAsync(loadTestRunInfos)).Verifiable(); await _loadTestRunInfoService.SaveRangeAsync(loadTestRunInfos); _mockLoadTestRunInfoRepository.Verify(x => x.AddRangeAsync(It.IsAny>()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once); } [Fact] public void LoadTestRunInfo_SaveRangeAsync_Failure_Exception() { _mockLoadTestRunInfoRepository.Setup(x => x.AddRangeAsync(It.IsAny>())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.SaveRangeAsync(It.IsAny>())); _mockLoadTestRunInfoRepository.Verify(x => x.AddRangeAsync(It.IsAny>()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public async void LoadTestRunInfo_IncreaseRateProcessingInfosCompleteCountAsync_Success() { var random = new Random(); var previousComplete = random.Next(1, 100); var countCompleted = random.Next(1, 100); var loadTestRunInfo = new LoadTestRunInfo { LoadTestRunInfoId = DateTime.Now.Millisecond, RateProcessingInfosCompleteCount = previousComplete, RateProcessingInfosCount = previousComplete + countCompleted }; _mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(loadTestRunInfo.LoadTestRunInfoId)).ReturnsAsync(loadTestRunInfo).Verifiable(); var result = await _loadTestRunInfoService.IncreaseRateProcessingInfosCompleteCountAsync(loadTestRunInfo.LoadTestRunInfoId, countCompleted); Assert.NotNull(result); Assert.Equal(previousComplete + countCompleted, result.RateProcessingInfosCompleteCount); Assert.Equal(DateTime.Now.Date, ((DateTime)result.EndTimeStamp!).Date); _mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once); } [Fact] public async void LoadTestRunInfo_IncreaseRateProcessingInfosCompleteCountAsync_Failure_ReturnedNull() { var loadTestRuninfoId = new Random().Next(1, 100); LoadTestRunInfo? loadTestRunInfo = null; _mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(loadTestRuninfoId)).ReturnsAsync(loadTestRunInfo).Verifiable(); var result = await _loadTestRunInfoService.IncreaseRateProcessingInfosCompleteCountAsync(loadTestRuninfoId, 10); Assert.Null(result); _mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public void LoadTestRunInfo_IncreaseRateProcessingInfosCompleteCountAsync_Failure_Exception() { var random = new Random(); var previousComplete = random.Next(1, 100); var countCompleted = random.Next(1, 100); var loadTestRunInfo = new LoadTestRunInfo { LoadTestRunInfoId = DateTime.Now.Millisecond, RateProcessingInfosCompleteCount = previousComplete, RateProcessingInfosCount = previousComplete + countCompleted }; _mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(loadTestRunInfo.LoadTestRunInfoId)) .ThrowsAsync(new Exception("Test")).Verifiable(); Assert.ThrowsAsync( async () => await _loadTestRunInfoService.IncreaseRateProcessingInfosCompleteCountAsync(loadTestRunInfo.LoadTestRunInfoId, countCompleted)); _mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public async void LoadTestRunInfo_UpdateAsync_Success() { var loadTestRunInfo = new LoadTestRunInfo { LoadTestRunInfoId = 1, RateType = RateTypes.DirectAuto }; _mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(loadTestRunInfo.LoadTestRunInfoId)) .ReturnsAsync(loadTestRunInfo).Verifiable(); var result = await _loadTestRunInfoService.UpdateAsync(loadTestRunInfo); Assert.NotNull(result); Assert.Equal(loadTestRunInfo.LoadTestRunInfoId, result.LoadTestRunInfoId); Assert.Equal(loadTestRunInfo.RateType, result.RateType); _mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once()); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once); } [Fact] public void LoadTestRunInfo_UpdateAsync_Failure_ReturnedNull() { var loadTestRunInfo = new LoadTestRunInfo { RateType = RateTypes.DirectAuto }; LoadTestRunInfo? loadTestRunInfoReturned = null; _mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(loadTestRunInfo.LoadTestRunInfoId)) .ReturnsAsync(loadTestRunInfoReturned).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.UpdateAsync(loadTestRunInfo)); _mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public void LoadTestRunInfo_UpdateAsync_Failure_Exception() { _mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(It.IsAny())) .ThrowsAsync(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.UpdateAsync(It.IsAny())); _mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Never); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public async void LoadTestRunInfo_UpdateRangeAsync_Success() { var loadTestRunInfos = new List { new() { LoadTestRunInfoId = 1 }, new() { LoadTestRunInfoId = 2 }, new() { LoadTestRunInfoId = 3 } }; _mockLoadTestRunInfoRepository.Setup(x => x.UpdateRange(loadTestRunInfos)).Verifiable(); await _loadTestRunInfoService.UpdateRangeAsync(loadTestRunInfos); _mockLoadTestRunInfoRepository.Verify(x => x.UpdateRange(It.IsAny>()), Times.Once()); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once); } [Fact] public void LoadTestRunInfo_UpdateRangeAsync_Failure_Exception() { _mockLoadTestRunInfoRepository.Setup(x => x.UpdateRange(It.IsAny>())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.UpdateRangeAsync(It.IsAny>())); _mockLoadTestRunInfoRepository.Verify(x => x.UpdateRange(It.IsAny>()), Times.Never); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public async void LoadTestRunInfo_DeleteAsync_Success() { var loadTestRunInfoId = 1; var loadTestRunInfo = new LoadTestRunInfo { LoadTestRunInfoId = loadTestRunInfoId }; _mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(loadTestRunInfoId)) .ReturnsAsync(loadTestRunInfo).Verifiable(); _mockLoadTestRunInfoRepository.Setup(x => x.Remove(loadTestRunInfo)).Verifiable(); await _loadTestRunInfoService.DeleteAsync(loadTestRunInfoId); _mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once()); _mockLoadTestRunInfoRepository.Verify(x => x.Remove(It.IsAny()), Times.Once()); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once); } [Fact] public void LoadTestRunInfo_DeleteAsync_Failure_ReturnedNull() { var loadTestRunInfoId = 1; LoadTestRunInfo? loadTestRunInfo = null; _mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(loadTestRunInfoId)) .ReturnsAsync(loadTestRunInfo).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.DeleteAsync(loadTestRunInfoId)); _mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once()); _mockLoadTestRunInfoRepository.Verify(x => x.Remove(It.IsAny()), Times.Never); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public void LoadTestRunInfo_DeleteAsync_Failure_Exception() { _mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(It.IsAny())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.DeleteAsync(It.IsAny())); _mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once); _mockLoadTestRunInfoRepository.Verify(x => x.Remove(It.IsAny()), Times.Never); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public async void LoadTestRunInfo_DeleteRangeAsync_Success() { var loadTestRunInfoIds = new List { 1, 2, 3 }; var loadTestRunInfos = new List { new() { LoadTestRunInfoId = loadTestRunInfoIds[0] }, new() { LoadTestRunInfoId = loadTestRunInfoIds[1] }, new() { LoadTestRunInfoId = loadTestRunInfoIds[2] } }; _mockLoadTestRunInfoRepository.Setup(x => x.FindRangeByIdAsync(loadTestRunInfoIds)).ReturnsAsync(loadTestRunInfos).Verifiable(); _mockLoadTestRunInfoRepository.Setup(x => x.RemoveRange(loadTestRunInfos)).Verifiable(); await _loadTestRunInfoService.DeleteRangeAsync(loadTestRunInfoIds); _mockLoadTestRunInfoRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny>()), Times.Once()); _mockLoadTestRunInfoRepository.Verify(x => x.RemoveRange(It.IsAny>()), Times.Once()); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once); } [Fact] public void LoadTestRunInfo_DeleteRangeAsync_Failure_ReturnedNull() { var loadTestRunInfoIds = new List { 1, 2, 3 }; List? loadTestRunInfos = null; _mockLoadTestRunInfoRepository.Setup(x => x.FindRangeByIdAsync(loadTestRunInfoIds)) .ReturnsAsync(loadTestRunInfos).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.DeleteRangeAsync(loadTestRunInfoIds)); _mockLoadTestRunInfoRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny>()), Times.Once()); _mockLoadTestRunInfoRepository.Verify(x => x.RemoveRange(It.IsAny>()), Times.Never); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public void LoadTestRunInfo_DeleteRangeAsync_Failure_Exception() { _mockLoadTestRunInfoRepository.Setup(x => x.RemoveRange(It.IsAny>())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _loadTestRunInfoService.DeleteRangeAsync(It.IsAny>())); _mockLoadTestRunInfoRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny>()), Times.Once()); _mockLoadTestRunInfoRepository.Verify(x => x.RemoveRange(It.IsAny>()), Times.Never); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } }