This commit is contained in:
Zeeshaun
2026-04-07 14:21:04 -05:00
parent e37826fe30
commit 75ea216a17
264 changed files with 15920 additions and 0 deletions
@@ -0,0 +1,191 @@
using LCU.API.Internal.LoanRate.Services;
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.LcuEvaluation.Services;
using LCU.Library.Internal.LcuEvaluationModels.Entities;
using LCU.Library.Internal.LcuEvaluationModels.Requests;
using LCU.Library.Internal.LoanRateModels.Entities;
namespace LCU.API.Internal.LoanRateTests.ServiceTests;
public class ComplexEvaluationDetailServiceTest
{
private readonly Mock<IRateEvaluationService> _mockRateEvaluationService;
private readonly Mock<IEvaluationDetailService> _mockEvaluationDetailService;
private readonly IComplexEvaluationDetailService _service;
public ComplexEvaluationDetailServiceTest()
{
_mockRateEvaluationService = new Mock<IRateEvaluationService>();
_mockEvaluationDetailService = new Mock<IEvaluationDetailService>();
_service = new ComplexEvaluationDetailService(_mockRateEvaluationService.Object,
_mockEvaluationDetailService.Object);
}
[Fact]
public async void ComplexEvaluationDetail_UpdateComplexAsync_Success()
{
var evaluationDetail = new EvaluationDetail
{
EvaluationDetailId = DateTime.Now.Millisecond,
Description = Guid.NewGuid().ToString()
};
var newEvaluationDetail = new EvaluationDetail
{
EvaluationDetailId = DateTime.Now.Millisecond,
Description = Guid.NewGuid().ToString()
};
_mockEvaluationDetailService.Setup(x => x.UpdateComplexAsync(It.IsAny<EvaluationDetail>()))
.ReturnsAsync(newEvaluationDetail).Verifiable();
var result = await _service.UpdateComplexAsync(evaluationDetail);
Assert.NotNull(result);
Assert.Equal(result.Description, newEvaluationDetail.Description);
_mockEvaluationDetailService.Verify(x => x.UpdateComplexAsync(It.IsAny<EvaluationDetail>()), Times.Once);
}
[Fact]
public async void ComplexEvaluationDetail_UpdateComplexAsync_Success_NotFound()
{
EvaluationDetail? evaluationDetail = null;
_mockEvaluationDetailService.Setup(x => x.UpdateComplexAsync(It.IsAny<EvaluationDetail>()))
.ReturnsAsync(evaluationDetail).Verifiable();
var result = await _service.UpdateComplexAsync(evaluationDetail);
Assert.Null(result);
_mockEvaluationDetailService.Verify(x => x.UpdateComplexAsync(It.IsAny<EvaluationDetail>()), Times.Once);
}
[Fact]
public void ComplexEvaluationDetail_UpdateComplexAsync_Failure_Exception()
{
var evaluationDetail = new EvaluationDetail();
_mockEvaluationDetailService.Setup(x => x.UpdateComplexAsync(It.IsAny<EvaluationDetail>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.UpdateComplexAsync(evaluationDetail));
_mockEvaluationDetailService.Verify(x => x.UpdateComplexAsync(It.IsAny<EvaluationDetail>()), Times.Once);
}
[Fact]
public async void ComplexEvaluationDetail_SaveComplexAsync_Success_NewEvaluationDetail()
{
var evaluationDetail = new EvaluationDetail
{
Description = Guid.NewGuid().ToString()
};
var request = new EvaluationDetailRequest
{
EvaluationDetail = evaluationDetail
};
var newEvaluationDetail = new EvaluationDetail
{
EvaluationDetailId = DateTime.Now.Millisecond + 1,
Description = evaluationDetail.Description
};
_mockEvaluationDetailService.Setup(x => x.SaveComplexAsync(It.IsAny<EvaluationDetailRequest>()))
.ReturnsAsync(newEvaluationDetail).Verifiable();
var result = await _service.SaveComplexAsync(request);
Assert.NotNull(result);
Assert.Equal(request.EvaluationDetail.Description, newEvaluationDetail.Description);
_mockEvaluationDetailService.Verify(x => x.SaveComplexAsync(It.IsAny<EvaluationDetailRequest>()), Times.Once);
}
[Fact]
public async void ComplexEvaluationDetail_SaveComplexAsync_Success_ExistingEvaluationDetail()
{
var evaluationDetail = new EvaluationDetail
{
EvaluationDetailId = DateTime.Now.Millisecond,
Description = Guid.NewGuid().ToString()
};
var rateEvaluations = new List<RateEvaluation>
{
new()
{
EvaluationDetailId = evaluationDetail.EvaluationDetailId,
RateId = DateTime.Now.Millisecond + 5
}
};
var request = new EvaluationDetailRequest
{
PreviousVersionEvaluationDetailId = evaluationDetail.EvaluationDetailId,
EvaluationDetail = evaluationDetail
};
var newEvaluationDetail = new EvaluationDetail
{
EvaluationDetailId = DateTime.Now.Millisecond + 1,
Description = evaluationDetail.Description
};
_mockEvaluationDetailService.Setup(x => x.SaveComplexAsync(It.IsAny<EvaluationDetailRequest>()))
.ReturnsAsync(newEvaluationDetail).Verifiable();
_mockRateEvaluationService.Setup(x => x.GetRangeByEvaluationDetailIdAsync(It.IsAny<int>()))
.ReturnsAsync(rateEvaluations).Verifiable();
_mockRateEvaluationService.Setup(x => x.SaveRangeAsync(rateEvaluations)).Verifiable();
var result = await _service.SaveComplexAsync(request);
Assert.NotNull(result);
Assert.Equal(request.EvaluationDetail.Description, newEvaluationDetail.Description);
_mockEvaluationDetailService.Verify(x => x.SaveComplexAsync(It.IsAny<EvaluationDetailRequest>()), Times.Once);
_mockRateEvaluationService.Verify(x => x.GetRangeByEvaluationDetailIdAsync(It.IsAny<int>()), Times.Once);
_mockRateEvaluationService.Verify(x => x.SaveRangeAsync(It.IsAny<List<RateEvaluation>>()), Times.Once);
}
[Fact]
public async void ComplexEvaluationDetail_SaveComplexAsync_Success_NotFound()
{
var request = new EvaluationDetailRequest();
EvaluationDetail? evaluationDetail = null;
_mockEvaluationDetailService.Setup(x => x.SaveComplexAsync(It.IsAny<EvaluationDetailRequest>()))
.ReturnsAsync(evaluationDetail).Verifiable();
var result = await _service.SaveComplexAsync(request);
Assert.Null(result);
_mockEvaluationDetailService.Verify(x => x.SaveComplexAsync(It.IsAny<EvaluationDetailRequest>()), Times.Once);
}
[Fact]
public void ComplexEvaluationDetail_SaveComplexAsync_Failure_Exception()
{
var request = new EvaluationDetailRequest();
_mockEvaluationDetailService.Setup(x => x.SaveComplexAsync(It.IsAny<EvaluationDetailRequest>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.SaveComplexAsync(request));
_mockEvaluationDetailService.Verify(x => x.SaveComplexAsync(It.IsAny<EvaluationDetailRequest>()), Times.Once);
}
[Fact]
public async void ComplexEvaluationDetail_DeleteComplexAsync_Success()
{
var evaluationDetailId = DateTime.Now.Millisecond;
_mockEvaluationDetailService.Setup(x => x.DeleteComplexAsync(It.IsAny<int>())).Verifiable();
_mockRateEvaluationService.Setup(x => x.DeleteRangeByEvaluationDetailIdAsync(It.IsAny<int>())).Verifiable();
await _service.DeleteComplexAsync(evaluationDetailId);
_mockEvaluationDetailService.Verify(x => x.DeleteComplexAsync(It.IsAny<int>()), Times.Once);
_mockRateEvaluationService.Verify(x => x.DeleteRangeByEvaluationDetailIdAsync(It.IsAny<int>()), Times.Once);
}
[Fact]
public void ComplexEvaluationDetail_DeleteComplexAsync_Failure_Exception()
{
_mockEvaluationDetailService.Setup(x => x.DeleteComplexAsync(It.IsAny<int>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.DeleteComplexAsync(It.IsAny<int>()));
_mockEvaluationDetailService.Verify(x => x.DeleteComplexAsync(It.IsAny<int>()), Times.Once);
}
}
@@ -0,0 +1,586 @@
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<IUnitOfWork> _mockUnitOfWork;
private readonly Mock<ILoadTestRunInfoRepository> _mockLoadTestRunInfoRepository;
private readonly ILoadTestRunInfoService _loadTestRunInfoService;
public LoadTestRunInfoServiceTest()
{
_mockUnitOfWork = new Mock<IUnitOfWork>();
_mockLoadTestRunInfoRepository = new Mock<ILoadTestRunInfoRepository>();
_loadTestRunInfoService = new LoadTestRunInfoService(_mockUnitOfWork.Object,
_mockLoadTestRunInfoRepository.Object);
}
[Fact]
public async void LoadTestRunInfo_GetAsync_Success()
{
var loadTestRunInfos = new List<LoadTestRunInfo>
{
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<LoadTestRunInfo>? 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<ServiceException>(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<int>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _loadTestRunInfoService.GetByIdAsync(It.IsAny<int>()));
_mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once);
}
[Fact]
public async void LoadTestRunInfo_GetRangeByIdAsync_Success()
{
var loadTestRunInfos = new List<LoadTestRunInfo>
{
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<LoadTestRunInfo>? loadTestRunInfos = null;
var ids = new List<int>
{
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<List<int>>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _loadTestRunInfoService.GetRangeByIdAsync(It.IsAny<List<int>>()));
_mockLoadTestRunInfoRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()), Times.Once);
}
[Fact]
public async Task LoadTestRunInfo_GetFilteredLoadTestRunInfo_Success()
{
var pagedLoadTestRunInfoResult = new PagedResult<LoadTestRunInfo>();
var filter = new LoadTestRunInfoFilter
{
Page = 1,
Limit = 2,
SortableFields = null,
RateTypes = new List<RateTypes> { 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<LoadTestRunInfoFilter>()), Times.Once);
}
[Fact]
public async Task LoadTestRunInfo_GetFilteredLoadTestRunInfo_NotFound()
{
var pagedLoadTestRunInfoResult = new PagedResult<LoadTestRunInfo>
{
Total = 0,
Items = new List<LoadTestRunInfo>()
};
var filter = new LoadTestRunInfoFilter
{
Page = 1,
Limit = 2,
SortableFields = null,
RateTypes = new List<RateTypes> { 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<LoadTestRunInfoFilter>()), Times.Once);
}
[Fact]
public void LoadTestRunInfo_GetFilteredLoadTestRunInfo_Failure_Exception()
{
_mockLoadTestRunInfoRepository.Setup(x => x.FindFilteredLoadTestRunInfosAsync(It.IsAny<LoadTestRunInfoFilter>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _loadTestRunInfoService.GetFilteredLoadTestRunInfo(It.IsAny<LoadTestRunInfoFilter>()));
_mockLoadTestRunInfoRepository.Verify(x => x.FindFilteredLoadTestRunInfosAsync(It.IsAny<LoadTestRunInfoFilter>()), 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<LoadTestRunInfo>()), 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<ServiceException>(async () => await _loadTestRunInfoService.SaveAsync(loadTestRunInfo));
_mockLoadTestRunInfoRepository.Verify(x => x.AddAsync(It.IsAny<LoadTestRunInfo>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public void LoadTestRunInfo_SaveAsync_Failure_Exception()
{
_mockLoadTestRunInfoRepository.Setup(x => x.AddAsync(It.IsAny<LoadTestRunInfo>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _loadTestRunInfoService.SaveAsync(It.IsAny<LoadTestRunInfo>()));
_mockLoadTestRunInfoRepository.Verify(x => x.AddAsync(It.IsAny<LoadTestRunInfo>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public async void LoadTestRunInfo_SaveRangeAsync_Success()
{
var loadTestRunInfos = new List<LoadTestRunInfo>
{
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<IEnumerable<LoadTestRunInfo>>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
}
[Fact]
public void LoadTestRunInfo_SaveRangeAsync_Failure_Exception()
{
_mockLoadTestRunInfoRepository.Setup(x => x.AddRangeAsync(It.IsAny<IEnumerable<LoadTestRunInfo>>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _loadTestRunInfoService.SaveRangeAsync(It.IsAny<IEnumerable<LoadTestRunInfo>>()));
_mockLoadTestRunInfoRepository.Verify(x =>
x.AddRangeAsync(It.IsAny<IEnumerable<LoadTestRunInfo>>()), 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<int>()), 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<int>()), 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<ServiceException>( async () =>
await _loadTestRunInfoService.IncreaseRateProcessingInfosCompleteCountAsync(loadTestRunInfo.LoadTestRunInfoId, countCompleted));
_mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), 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<int>()), 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<ServiceException>(async () => await _loadTestRunInfoService.UpdateAsync(loadTestRunInfo));
_mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public void LoadTestRunInfo_UpdateAsync_Failure_Exception()
{
_mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(It.IsAny<int>()))
.ThrowsAsync(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _loadTestRunInfoService.UpdateAsync(It.IsAny<LoadTestRunInfo>()));
_mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public async void LoadTestRunInfo_UpdateRangeAsync_Success()
{
var loadTestRunInfos = new List<LoadTestRunInfo>
{
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<List<LoadTestRunInfo>>()), Times.Once());
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
}
[Fact]
public void LoadTestRunInfo_UpdateRangeAsync_Failure_Exception()
{
_mockLoadTestRunInfoRepository.Setup(x => x.UpdateRange(It.IsAny<List<LoadTestRunInfo>>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _loadTestRunInfoService.UpdateRangeAsync(It.IsAny<List<LoadTestRunInfo>>()));
_mockLoadTestRunInfoRepository.Verify(x => x.UpdateRange(It.IsAny<List<LoadTestRunInfo>>()), 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<int>()), Times.Once());
_mockLoadTestRunInfoRepository.Verify(x => x.Remove(It.IsAny<LoadTestRunInfo>()), 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<ServiceException>(async () => await _loadTestRunInfoService.DeleteAsync(loadTestRunInfoId));
_mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once());
_mockLoadTestRunInfoRepository.Verify(x => x.Remove(It.IsAny<LoadTestRunInfo>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public void LoadTestRunInfo_DeleteAsync_Failure_Exception()
{
_mockLoadTestRunInfoRepository.Setup(x => x.FindByIdAsync(It.IsAny<int>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _loadTestRunInfoService.DeleteAsync(It.IsAny<int>()));
_mockLoadTestRunInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once);
_mockLoadTestRunInfoRepository.Verify(x => x.Remove(It.IsAny<LoadTestRunInfo>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public async void LoadTestRunInfo_DeleteRangeAsync_Success()
{
var loadTestRunInfoIds = new List<int>
{
1,
2,
3
};
var loadTestRunInfos = new List<LoadTestRunInfo>
{
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<List<int>>()), Times.Once());
_mockLoadTestRunInfoRepository.Verify(x => x.RemoveRange(It.IsAny<List<LoadTestRunInfo>>()), Times.Once());
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
}
[Fact]
public void LoadTestRunInfo_DeleteRangeAsync_Failure_ReturnedNull()
{
var loadTestRunInfoIds = new List<int>
{
1,
2,
3
};
List<LoadTestRunInfo>? loadTestRunInfos = null;
_mockLoadTestRunInfoRepository.Setup(x => x.FindRangeByIdAsync(loadTestRunInfoIds))
.ReturnsAsync(loadTestRunInfos).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _loadTestRunInfoService.DeleteRangeAsync(loadTestRunInfoIds));
_mockLoadTestRunInfoRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()), Times.Once());
_mockLoadTestRunInfoRepository.Verify(x => x.RemoveRange(It.IsAny<List<LoadTestRunInfo>>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public void LoadTestRunInfo_DeleteRangeAsync_Failure_Exception()
{
_mockLoadTestRunInfoRepository.Setup(x => x.RemoveRange(It.IsAny<List<LoadTestRunInfo>>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _loadTestRunInfoService.DeleteRangeAsync(It.IsAny<List<int>>()));
_mockLoadTestRunInfoRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()), Times.Once());
_mockLoadTestRunInfoRepository.Verify(x => x.RemoveRange(It.IsAny<List<LoadTestRunInfo>>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
}
@@ -0,0 +1,127 @@
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();
}
@@ -0,0 +1,73 @@
using LCU.API.Internal.LoanRate.Services.LoadTestingServices;
using LCU.API.Internal.LoanRate.Services.LoanRateOperationServices;
using LCU.API.Internal.LoanRate.Services.QueueServices;
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.LcuEvaluationModels.Entities;
using LCU.Library.Internal.LoanRateModels.Entities;
using LCU.Library.Internal.LoanRateModels.Entities.LoadTestingEntities;
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 LoadTestProcessRateServiceTest
{
private readonly Mock<IRateFinderService> _mockRateFinderService;
private readonly Mock<IQueueLoadTestRateCompletionService> _mockQueueLoadTestRateCompletionService;
private readonly ILoadTestProcessRateService _loadTestProcessRateService;
public LoadTestProcessRateServiceTest()
{
_mockRateFinderService = new Mock<IRateFinderService>();
_mockQueueLoadTestRateCompletionService = new Mock<IQueueLoadTestRateCompletionService>();
_loadTestProcessRateService = new LoadTestProcessRateService(_mockRateFinderService.Object,
_mockQueueLoadTestRateCompletionService.Object);
}
[Fact]
public async void HandleLoadTestProcessRate_Success()
{
var random = new Random();
var request = new LoadTestProcessRateRequest {
RateProcessingInfo = new RateProcessingInfo
{
LoadTestRunInfoId = random.Next(1, 1000),
RateProcessingInfoId = random.Next(1, 1000),
Payload = JsonConvert.SerializeObject(new RateRequest())
}
};
_mockRateFinderService.Setup(x => x.DetermineRate(It.IsAny<DateTime>(), It.IsAny<List<EvaluationDetail>>())).ReturnsAsync(( new Rate(), string.Empty ));
await _loadTestProcessRateService.HandleLoadTestProcessRate(request);
_mockRateFinderService.Verify(x => x.DeterminePassedRules(It.IsAny<RateRequest>()), Times.Once);
_mockRateFinderService.Verify(x => x.DetermineRate(It.IsAny<DateTime>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
_mockRateFinderService.Verify(x => x.CalculateFinalRateValue(It.IsAny<RateRequest>(), It.IsAny<Rate>()), Times.Once);
_mockQueueLoadTestRateCompletionService.Verify(x => x.QueueLoadTestRateCompletionRequest(It.IsAny<LoadTestRateCompletionRequest>()), Times.Once);
}
[Fact]
public void HandleLoadTestProcessRate_Failure_ThrowsException()
{
var random = new Random();
var request = new LoadTestProcessRateRequest {
RateProcessingInfo = new RateProcessingInfo
{
LoadTestRunInfoId = random.Next(1, 1000),
RateProcessingInfoId = random.Next(1, 1000),
Payload = JsonConvert.SerializeObject(new RateRequest())
}
};
_mockRateFinderService.Setup(x => x.DeterminePassedRules(It.IsAny<RateRequest>())).ThrowsAsync(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>( async () => await _loadTestProcessRateService.HandleLoadTestProcessRate(request));
_mockRateFinderService.Verify(x => x.DeterminePassedRules(It.IsAny<RateRequest>()), Times.Once);
_mockRateFinderService.Verify(x => x.DetermineRate(It.IsAny<DateTime>(), It.IsAny<List<EvaluationDetail>>()), Times.Never);
_mockRateFinderService.Verify(x => x.CalculateFinalRateValue(It.IsAny<RateRequest>(), It.IsAny<Rate>()), Times.Never);
_mockQueueLoadTestRateCompletionService.Verify(x => x.QueueLoadTestRateCompletionRequest(It.IsAny<LoadTestRateCompletionRequest>()), Times.Once);
}
}
@@ -0,0 +1,76 @@
using LCU.API.Internal.LoanRate.Services;
using LCU.API.Internal.LoanRate.Services.LoadTestingServices;
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.LoanRateModels.Entities.LoadTestingEntities;
using LCU.Library.Internal.LoanRateModels.Requests.LoadTestRequest;
namespace LCU.API.Internal.LoanRateTests.ServiceTests.LoadTestingServices;
public class LoadTestRateCompletionServiceTest
{
private readonly Mock<IRateProcessingInfoService> _mockRateProcessingInfoService;
private readonly Mock<ILoadTestRunInfoService> _mockLoadTestRunInfoService;
private readonly ILoadTestRateCompletionService _loadTestRateCompletionService;
public LoadTestRateCompletionServiceTest()
{
_mockRateProcessingInfoService = new Mock<IRateProcessingInfoService>();
_mockLoadTestRunInfoService = new Mock<ILoadTestRunInfoService>();
_loadTestRateCompletionService = new LoadTestRateCompletionService(_mockRateProcessingInfoService.Object,
_mockLoadTestRunInfoService.Object);
}
[Fact]
public async void HandleLoadTestRateCompletion_Success()
{
var random = new Random();
var requestCount = random.Next(1, 100);
var requests = GenerateLoadTestRateCompletionRequests(random.Next(1, requestCount), requestCount);
var rateProcessingInfos = requests.Select(x => x.RateProcessingInfo).ToList();
var loadTestRunInfoGroups = rateProcessingInfos.GroupBy( p => p.LoadTestRunInfoId, p => p.RateProcessingInfoId);
await _loadTestRateCompletionService.HandleLoadTestRateCompletion(requests);
_mockRateProcessingInfoService.Verify(x => x.UpdateRangeAsync(It.IsAny<IEnumerable<RateProcessingInfo>>()), Times.Once);
_mockLoadTestRunInfoService.Verify(x => x.IncreaseRateProcessingInfosCompleteCountAsync(It.IsAny<int>(), It.IsAny<int>()), Times.Exactly(loadTestRunInfoGroups.Count()));
}
[Fact]
public void HandleLoadTestRateCompletion_Failure_ThrowsException()
{
var requests = GenerateLoadTestRateCompletionRequests(1, 2);
_mockRateProcessingInfoService.Setup(x => x.UpdateRangeAsync(It.IsAny<IEnumerable<RateProcessingInfo>>())).ThrowsAsync(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>( async () => await _loadTestRateCompletionService.HandleLoadTestRateCompletion(requests));
_mockRateProcessingInfoService.Verify(x => x.UpdateRangeAsync(It.IsAny<IEnumerable<RateProcessingInfo>>()), Times.Once);
_mockLoadTestRunInfoService.Verify(x => x.IncreaseRateProcessingInfosCompleteCountAsync(It.IsAny<int>(), It.IsAny<int>()), Times.Never);
}
private List<LoadTestRateCompletionRequest> GenerateLoadTestRateCompletionRequests(int loadTestCount, int rateProcessingInfoCount)
{
var random = new Random();
var loadTestIds = new List<int>();
for (var i = 0; i < loadTestCount; i++)
{
loadTestIds.Add(random.Next(1, int.MaxValue));
}
var requests = new List<LoadTestRateCompletionRequest>();
for (var i = 0; i < rateProcessingInfoCount; i++)
{
requests.Add(new LoadTestRateCompletionRequest
{
RateProcessingInfo = new RateProcessingInfo
{
LoadTestRunInfoId = loadTestIds[random.Next(0, loadTestCount - 1)],
RateProcessingInfoId = random.Next(1, int.MaxValue)
}
});
}
return requests;
}
}
@@ -0,0 +1,382 @@
using LCU.Library.Internal.LcuEvaluation.Services;
using LCU.Library.Internal.LcuEvaluationModels.Entities;
using LCU.Library.Internal.LoanRateModels.Entities;
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.LoanRateModels.Requests;
using LCU.API.Internal.LoanRate.Services.LoanRateOperationServices;
using LCU.API.Internal.LoanRate.Services;
using LCU.Library.Internal.LcuEvaluation.Services.EvaluationServices;
using LCU.Library.Internal.LcuEvaluationModels.Enums;
using LCU.Library.Internal.LcuEvaluationModels.Requests;
using LCU.Library.Internal.LoanRateModels.Enums;
namespace LCU.API.Internal.LoanRateTests.ServiceTests.LoanRateOperationServicesTests;
public class RateFinderServiceTest
{
private readonly RateFinderService _rateFinderService;
private readonly Mock<IEvaluationDetailService> _mockEvaluationDetailService;
private readonly Mock<IRateService> _mockRateService;
private readonly Mock<IRateSheetService> _mockRateSheetService;
private readonly Mock<IRateEvaluationService> _mockRateEvaluationService;
private readonly Mock<IRunRuleService> _mockRunEvaluationService;
private readonly Mock<IRunCalculationService> _mockRunCalculationService;
public RateFinderServiceTest()
{
_mockEvaluationDetailService = new Mock<IEvaluationDetailService>();
_mockRateService = new Mock<IRateService>();
_mockRateSheetService = new Mock<IRateSheetService>();
_mockRateEvaluationService = new Mock<IRateEvaluationService>();
_mockRunEvaluationService = new Mock<IRunRuleService>();
_mockRunCalculationService = new Mock<IRunCalculationService>();
_rateFinderService = new RateFinderService(_mockEvaluationDetailService.Object,
_mockRateService.Object,
_mockRateSheetService.Object,
_mockRateEvaluationService.Object,
_mockRunEvaluationService.Object,
_mockRunCalculationService.Object);
}
[Fact]
public void FindRate_NoEvaluationsReturned_Exception()
{
var rateRequest = new RateRequest { ApplicationDate = DateTime.Now};
var rateSheetIds = new List<int> { 1, 2, 3 };
_mockRateSheetService.Setup(x => x.GetRateSheetIdsByRateTypeAsync(RateTypes.DirectBoat)).ReturnsAsync(rateSheetIds);
_mockRateEvaluationService.Setup(x => x.GetByRateSheetIdsAsync(rateSheetIds)).ReturnsAsync(new List<RateEvaluation>());
_mockEvaluationDetailService.Setup(x => x.GetActiveByEvaluationTypeAndIdsAsync(rateRequest.ApplicationDate, EvaluationTypes.Rule, new List<int>())).ReturnsAsync(new List<EvaluationDetail>()).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _rateFinderService.FindRate(rateRequest));
_mockRateSheetService.Verify(x => x.GetRateSheetIdsByRateTypeAsync(RateTypes.DirectBoat), Times.Once);
_mockRateEvaluationService.Verify(x => x.GetByRateSheetIdsAsync(rateSheetIds), Times.Once);
_mockEvaluationDetailService.Verify(x => x.GetActiveByEvaluationTypeAndIdsAsync(rateRequest.ApplicationDate, EvaluationTypes.Rule, new List<int>()), Times.Once);
}
[Fact]
public async Task FindRate_NoRatesReturned_ReturnDefault()
{
var rateRequest = new RateRequest { ApplicationDate = DateTime.Now};
var rateSheetIds = new List<int> { 1, 2, 3 };
var rateEvaluations = new List<RateEvaluation> {
new RateEvaluation
{
EvaluationDetailId = 1
},
new RateEvaluation
{
EvaluationDetailId = 2
}
};
var ratesEvaluationDetailIds = rateEvaluations.GroupBy(rateEvaluation => rateEvaluation.EvaluationDetailId)
.Select(group => group.First().EvaluationDetailId)
.ToList();
_mockRateSheetService.Setup(x => x.GetRateSheetIdsByRateTypeAsync(RateTypes.DirectBoat)).ReturnsAsync(rateSheetIds);
_mockRateEvaluationService.Setup(x => x.GetByRateSheetIdsAsync(rateSheetIds)).ReturnsAsync(rateEvaluations);
_mockEvaluationDetailService.Setup(x => x.GetActiveByEvaluationTypeAndIdsAsync(rateRequest.ApplicationDate, EvaluationTypes.Rule, ratesEvaluationDetailIds)).ReturnsAsync(GetFakeEvaluations()).Verifiable();
var evaluationsReturned = new List<EvaluationDetail>()
{
new EvaluationDetail
{
EvaluationDetailId = 1
},
new EvaluationDetail
{
EvaluationDetailId = 2
}
};
_mockRunEvaluationService.Setup(x => x.ValidateRequestRules(rateRequest, It.IsAny<List<EvaluationDetail>>())).Returns(evaluationsReturned).Verifiable();
var evaluationIds = evaluationsReturned.Select(evaluationReturned => evaluationReturned.EvaluationDetailId).ToList();
_mockRateService.Setup(x => x.GetByDateEvaluationIdAndEvaluationTypeAsync(It.IsAny<DateTime>(), evaluationIds, EvaluationTypes.Rule)).ReturnsAsync(new List<Rate>()).Verifiable();
var possibleCalculationIds = new List<int> { 1, 2 };
_mockEvaluationDetailService.Setup(x => x.GetActiveByEvaluationTypeAndIdsAsync(rateRequest.ApplicationDate, EvaluationTypes.Calculation, possibleCalculationIds)).ReturnsAsync(GetFakeCalculationsEvaluations()).Verifiable();
_mockRunCalculationService.Setup(x => x.CalculateEvaluationWithSetOfRequests(It.IsAny<List<RateRequest>>(), It.IsAny<EvaluationDetail>()))
.Returns(new List<EvaluationDetail>());
var result = await _rateFinderService.FindRate(rateRequest);
Assert.Equal(99, result.Rate);
_mockRateSheetService.Verify(x => x.GetRateSheetIdsByRateTypeAsync(RateTypes.DirectBoat), Times.Once);
_mockRateEvaluationService.Verify(x => x.GetByRateSheetIdsAsync(rateSheetIds), Times.Once);
_mockEvaluationDetailService.Verify(x => x.GetActiveByEvaluationTypeAndIdsAsync(rateRequest.ApplicationDate, EvaluationTypes.Rule, ratesEvaluationDetailIds), Times.Once); ;
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
_mockRateService.Verify(x => x.GetByDateEvaluationIdAndEvaluationTypeAsync(It.IsAny<DateTime>(), It.IsAny<List<int>>(), It.IsAny<EvaluationTypes>()), Times.Once);
_mockRunCalculationService.Verify(x => x.CalculateEvaluationWithSetOfRequests(It.IsAny<List<EvaluationRequest>>(), It.IsAny<EvaluationDetail>()), Times.Never);
}
[Fact]
public void FindRate_NoRatesReturned_Exception()
{
var rateRequest = new RateRequest { ApplicationDate = DateTime.Now};
var rateSheetIds = new List<int> { 1, 2, 3 };
var rateEvaluations = new List<RateEvaluation> {
new RateEvaluation
{
EvaluationDetailId = 600
},
new RateEvaluation
{
EvaluationDetailId = 700
}
};
var ratesEvaluationDetailIds = rateEvaluations.GroupBy(rateEvaluation => rateEvaluation.EvaluationDetailId)
.Select(group => group.First().EvaluationDetailId)
.ToList();
_mockRateSheetService.Setup(x => x.GetRateSheetIdsByRateTypeAsync(RateTypes.DirectBoat)).ReturnsAsync(rateSheetIds);
_mockRateEvaluationService.Setup(x => x.GetByRateSheetIdsAsync(rateSheetIds)).ReturnsAsync(rateEvaluations);
_mockEvaluationDetailService.Setup(x => x.GetActiveByEvaluationTypeAndIdsAsync(rateRequest.ApplicationDate ,EvaluationTypes.Rule, ratesEvaluationDetailIds)).ReturnsAsync(GetFakeEvaluations()).Verifiable();
var evaluationsReturned = new List<EvaluationDetail>
{
new EvaluationDetail
{
EvaluationDetailId = 600
},
new EvaluationDetail
{
EvaluationDetailId = 700
}
};
_mockRunEvaluationService.Setup(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>())).Returns(evaluationsReturned).Verifiable();
var evaluationIds = new List<int> { 600, 700};
var date = Convert.ToDateTime("1/1/2023");
_mockRateService.Setup(x => x.GetByDateEvaluationIdAndEvaluationTypeAsync(date, evaluationIds, EvaluationTypes.Rule)).ReturnsAsync(GetFakeRates()).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _rateFinderService.FindRate(rateRequest));
_mockRateSheetService.Verify(x => x.GetRateSheetIdsByRateTypeAsync(RateTypes.DirectBoat), Times.Once);
_mockRateEvaluationService.Verify(x => x.GetByRateSheetIdsAsync(rateSheetIds), Times.Once);
_mockEvaluationDetailService.Verify(x => x.GetActiveByEvaluationTypeAndIdsAsync(rateRequest.ApplicationDate, EvaluationTypes.Rule, ratesEvaluationDetailIds), Times.Once);
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
_mockRateService.Verify(x => x.GetByDateEvaluationIdAndEvaluationTypeAsync(It.IsAny<DateTime>(), It.IsAny<List<int>>(), It.IsAny<EvaluationTypes>()), Times.Once);
_mockRunCalculationService.Verify(x => x.CalculateEvaluationWithSetOfRequests(It.IsAny<List<EvaluationRequest>>(), It.IsAny<EvaluationDetail>()), Times.Never);
}
[Fact]
public async Task FindRate_RatesReturned_Success()
{
var rateRequest = new RateRequest { ApplicationDate = DateTime.Now };
var rateSheetIds = new List<int> { 1, 2, 3 };
var rateEvaluations = new List<RateEvaluation> {
new RateEvaluation
{
EvaluationDetailId = 1
},
new RateEvaluation
{
EvaluationDetailId = 2
}
};
var ratesEvaluationDetailIds = rateEvaluations.GroupBy(rateEvaluation => rateEvaluation.EvaluationDetailId)
.Select(group => group.First().EvaluationDetailId)
.ToList();
_mockRateSheetService.Setup(x => x.GetRateSheetIdsByRateTypeAsync(RateTypes.DirectBoat)).ReturnsAsync(rateSheetIds);
_mockRateEvaluationService.Setup(x => x.GetByRateSheetIdsAsync(rateSheetIds)).ReturnsAsync(rateEvaluations);
_mockEvaluationDetailService.Setup(x => x.GetActiveByEvaluationTypeAndIdsAsync(rateRequest.ApplicationDate, EvaluationTypes.Rule, ratesEvaluationDetailIds)).ReturnsAsync(GetFakeEvaluations()).Verifiable();
var evaluationsReturned = new List<EvaluationDetail>()
{
new EvaluationDetail
{
EvaluationDetailId = 1
},
new EvaluationDetail
{
EvaluationDetailId = 2
}
};
_mockRunEvaluationService.Setup(x => x.ValidateRequestRules(rateRequest, It.IsAny<List<EvaluationDetail>>())).Returns(evaluationsReturned).Verifiable();
var evaluationIds = evaluationsReturned.Select(evaluationReturned => evaluationReturned.EvaluationDetailId).ToList();
var rate = GetFakeRates().Where(rate => rate.RateId == 1);
_mockRateService.Setup(x => x.GetByDateEvaluationIdAndEvaluationTypeAsync(It.IsAny<DateTime>(), evaluationIds, EvaluationTypes.Rule)).ReturnsAsync(rate).Verifiable();
var possibleCalculationIds = new List<int> { 1, 2 };
_mockEvaluationDetailService.Setup(x => x.GetActiveByEvaluationTypeAndIdsAsync(rateRequest.ApplicationDate, EvaluationTypes.Calculation, possibleCalculationIds)).ReturnsAsync(GetFakeCalculationsEvaluations()).Verifiable();
_mockRunCalculationService.Setup(x => x.CalculateEvaluationWithSetOfRequests(It.IsAny<List<RateRequest>>(), It.IsAny<EvaluationDetail>()))
.Returns(new List<EvaluationDetail>());
var result = await _rateFinderService.FindRate(rateRequest);
Assert.Equal(5.49M, result.Rate);
_mockRateSheetService.Verify(x => x.GetRateSheetIdsByRateTypeAsync(RateTypes.DirectBoat), Times.Once);
_mockRateEvaluationService.Verify(x => x.GetByRateSheetIdsAsync(rateSheetIds), Times.Once);
_mockEvaluationDetailService.Verify(x => x.GetActiveByEvaluationTypeAndIdsAsync(rateRequest.ApplicationDate, EvaluationTypes.Rule, ratesEvaluationDetailIds), Times.Once); ;
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
_mockRateService.Verify(x => x.GetByDateEvaluationIdAndEvaluationTypeAsync(It.IsAny<DateTime>(), It.IsAny<List<int>>(), It.IsAny<EvaluationTypes>()), Times.Once);
_mockRunCalculationService.Verify(x => x.CalculateEvaluationWithSetOfRequests(It.IsAny<List<EvaluationRequest>>(), It.IsAny<EvaluationDetail>()), Times.Exactly(2));
}
public static List<EvaluationDetail> GetFakeEvaluations()
{
var evaluationBuilder1 = new EvaluationDetail()
{
EvaluationDetailId = 1,
Description = "CreditScore Greater Than Or Equal 740.",
EvaluationParameters = new List<EvaluationParameter>()
{
new EvaluationParameter(0, ParameterTypes.Variable, "RateRequest.CreditScore"),
new EvaluationParameter(1, ParameterTypes.GreaterThanOrEqual, ""),
new EvaluationParameter(2, ParameterTypes.TextInput, "740")
}
};
var evaluationBuilder2 = new EvaluationDetail()
{
EvaluationDetailId = 2,
Description = "Model Year Greater than or Equal 2022.",
EvaluationParameters = new List<EvaluationParameter>()
{
new EvaluationParameter(0, ParameterTypes.Variable, "RateRequest.ModelYear"),
new EvaluationParameter(1, ParameterTypes.GreaterThanOrEqual, ""),
new EvaluationParameter(2, ParameterTypes.TextInput, "2022")
}
};
var evaluationBuilder3 = new EvaluationDetail()
{
EvaluationDetailId = 3,
Description = "Model Year Equal 2021.",
EvaluationParameters = new List<EvaluationParameter>()
{
new EvaluationParameter(0, ParameterTypes.Variable, "RateRequest.ModelYear"),
new EvaluationParameter(1, ParameterTypes.Equal, ""),
new EvaluationParameter(2, ParameterTypes.TextInput, "2021")
}
};
var evaluationBuilder4 = new EvaluationDetail()
{
EvaluationDetailId = 4,
Description = "CreditScore Greater Than Or Equal 700 AND Less Than Or Equal 739.",
EvaluationParameters = new List<EvaluationParameter>()
{
new EvaluationParameter(0, ParameterTypes.ParenthesesStart, ""),
new EvaluationParameter(1, ParameterTypes.Variable, "RateRequest.CreditScore"),
new EvaluationParameter(2, ParameterTypes.GreaterThanOrEqual, ""),
new EvaluationParameter(3, ParameterTypes.TextInput, "700"),
new EvaluationParameter(4, ParameterTypes.ParenthesesEnd, ""),
new EvaluationParameter(5, ParameterTypes.And, ""),
new EvaluationParameter(6, ParameterTypes.ParenthesesStart, ""),
new EvaluationParameter(7, ParameterTypes.Variable, "RateRequest.CreditScore"),
new EvaluationParameter(8, ParameterTypes.LessThanOrEqual, ""),
new EvaluationParameter(9, ParameterTypes.TextInput, "739"),
new EvaluationParameter(10, ParameterTypes.ParenthesesEnd, "")
}
};
var evaluations = new List<EvaluationDetail>() { evaluationBuilder1, evaluationBuilder2, evaluationBuilder3, evaluationBuilder4 };
return evaluations;
}
public static List<EvaluationDetail> GetFakeCalculationsEvaluations()
{
var evaluationBuilder1 = new EvaluationDetail()
{
EvaluationDetailId = 5,
Description = "CreditScore - 1.",
EvaluationReturnType = EvaluationReturnTypes.Decimal,
EvaluationType = EvaluationTypes.Calculation,
EvaluationParameters = new List<EvaluationParameter>()
{
new EvaluationParameter(0, ParameterTypes.Variable, "RateRequest.CreditScore"),
new EvaluationParameter(1, ParameterTypes.Subtraction, ""),
new EvaluationParameter(2, ParameterTypes.TextInput, "1")
}
};
var evaluationBuilder2 = new EvaluationDetail()
{
EvaluationDetailId = 6,
Description = "CreditScore - 2.",
EvaluationReturnType = EvaluationReturnTypes.Decimal,
EvaluationType = EvaluationTypes.Calculation,
EvaluationParameters = new List<EvaluationParameter>()
{
new EvaluationParameter(0, ParameterTypes.Variable, "RateRequest.CreditScore"),
new EvaluationParameter(1, ParameterTypes.Subtraction, ""),
new EvaluationParameter(2, ParameterTypes.TextInput, "2")
}
};
var evaluations = new List<EvaluationDetail>() { evaluationBuilder1, evaluationBuilder2 };
return evaluations;
}
public static List<Rate> GetFakeRates()
{
var rate1 = new Rate()
{
RateId = 1,
Value = 5.49M,
RateEvaluations = new List<RateEvaluation>()
{
new RateEvaluation()
{
RateEvaluationId = 1,
RateId = 1,
EvaluationDetailId = 1,
},
new RateEvaluation()
{
RateEvaluationId = 2,
RateId = 1,
EvaluationDetailId = 2,
}
}
};
var rate2 = new Rate()
{
RateId = 2,
Value = 5.50M,
RateEvaluations = new List<RateEvaluation>()
{
new RateEvaluation()
{
RateEvaluationId = 3,
RateId = 2,
EvaluationDetailId = 1,
},
new RateEvaluation()
{
RateEvaluationId = 4,
RateId = 2,
EvaluationDetailId = 3,
}
}
};
var rate3 = new Rate()
{
RateId = 3,
Value = 5.51M,
RateEvaluations = new List<RateEvaluation>()
{
new RateEvaluation()
{
RateEvaluationId = 5,
RateId = 3,
EvaluationDetailId = 4,
}
}
};
var rates = new List<Rate>() { rate1, rate2, rate3 };
return rates;
}
}
@@ -0,0 +1,781 @@
using LCU.Library.Internal.LoanRateModels.Entities;
using LCU.Library.Internal.LcuEvaluation.Services;
using LCU.Library.Internal.Exceptions;
using LCU.Api.Internal.FileOperationsLib.Models.ExcelModels.Requests;
using LCU.API.Internal.LoanRate.Services.LoanRateOperationServices;
using LCU.API.Internal.LoanRate.Services;
using LCU.API.Internal.LoanRate.Services.MicroApiServices;
using LCU.Api.Internal.FileOperationsLib.Models.ExcelModels.Responses;
using LCU.Library.Internal.LcuEvaluationModels.Entities;
using LCU.Library.Internal.LoanRateModels.Enums;
using LCU.Library.Internal.LoanRateModels.Requests;
using LCU.Library.Internal.TypeExtensions.EnumExtensions;
namespace LCU.API.Internal.LoanRateTests.ServiceTests.LoanRateOperationServicesTests;
public class RateUploaderServiceTest
{
private readonly RateUploaderService _rateUploaderService;
private readonly Mock<IRateService> _mockRateService;
private readonly Mock<IRateSheetService> _mockRateSheetService;
private readonly Mock<IEvaluationDetailService> _mockEvaluationDetailService;
private readonly Mock<IRateEvaluationService> _mockRateEvaluationService;
private readonly Mock<IRateUploadInfoService> _mockRateUploadInfoService;
private readonly Mock<IFileOperationsApiService> _mockFileOperationsApiService;
public RateUploaderServiceTest()
{
_mockRateService = new Mock<IRateService>();
_mockRateSheetService = new Mock<IRateSheetService>();
_mockFileOperationsApiService = new Mock<IFileOperationsApiService>();
_mockEvaluationDetailService = new Mock<IEvaluationDetailService>();
_mockRateEvaluationService = new Mock<IRateEvaluationService>();
_mockRateUploadInfoService = new Mock<IRateUploadInfoService>();
_rateUploaderService = new RateUploaderService(_mockRateService.Object,
_mockRateSheetService.Object,
_mockEvaluationDetailService.Object,
_mockRateEvaluationService.Object,
_mockRateUploadInfoService.Object,
_mockFileOperationsApiService.Object);
}
public ExcelDataResponse FakeExcelDataResponse()
{
return new ExcelDataResponse
{
WorkBook = new WorkBook
{
SheetResponses = new List<SheetResponse>
{
new SheetResponse(RateTypes.DirectAuto.GetNameFromValue())
{
CellResponses = new List<CellResponse>
{
new CellResponse
{
ColumnName = "A",
Row = 10,
Value = "2.2",
Formula = ""
},
new CellResponse
{
ColumnName = "B",
Row = 11,
Value = "2.3",
Formula = ""
},
new CellResponse
{
ColumnName = "C",
Row = 12,
Value = "2.4",
Formula = ""
},
new CellResponse
{
ColumnName = "D",
Row = 13,
Value = "2.5",
Formula = ""
}
}
}
}
}
};
}
public List<Rate> FakeRates()
{
return new List<Rate>
{
new Rate
{
RateId = 1,
Column = "A",
Row = "10",
RateSheetId = 1,
Value = 2.1M,
RateStartDate = Convert.ToDateTime("1-1-2023"),
RateEvaluations = new List<RateEvaluation>
{
new RateEvaluation
{
RateEvaluationId = 1,
RateId = 1,
EvaluationDetailId = 1
}
}
},
new Rate
{
RateId = 2,
Column = "B",
Row = "11",
RateSheetId = 1,
Value = 0.0M,
RateStartDate = Convert.ToDateTime("1-1-2023"),
RateEvaluations = new List<RateEvaluation>
{
new RateEvaluation
{
RateEvaluationId = 2,
RateId = 2,
EvaluationDetailId = 2
}
}
}
};
}
public List<Rate> FakeRatesToUpdate()
{
return new List<Rate>()
{
new Rate
{
RateId = 1,
Column = "A",
Row = "10",
RateSheetId = 1,
Value = 2.2M,
RateStartDate = Convert.ToDateTime("1-1-2023"),
RateEvaluations = new List<RateEvaluation>
{
new RateEvaluation
{
RateEvaluationId = 1,
RateId = 1,
EvaluationDetailId = 1
}
}
},
new Rate
{
RateId = 2,
Column = "B",
Row = "11",
RateSheetId = 1,
Value = 2.3M,
RateStartDate = Convert.ToDateTime("1-1-2023"),
RateEvaluations = new List<RateEvaluation>
{
new RateEvaluation
{
RateEvaluationId = 2,
RateId = 2,
EvaluationDetailId = 2
}
}
}
};
}
public List<Rate> FakeRatesToCreate()
{
return new List<Rate>
{
new Rate
{
RateId = 0,
Column = "C",
Row = "12",
RateSheetId = 1,
Value = 2.4M,
RateStartDate = Convert.ToDateTime("1-1-2023")
},
new Rate
{
RateId = 0,
Column = "D",
Row = "13",
RateSheetId = 1,
Value = 2.5M,
RateStartDate = Convert.ToDateTime("1-1-2023")
}
};
}
private List<RateSheet> FakeRateSheets()
{
var rateTypes = Enum.GetValues(typeof(RateTypes)).Cast<RateTypes>().ToList();
return rateTypes.Select((t, i) => new RateSheet { RateSheetId = i + 1, RateType = t }).ToList();
}
private RateUploadInfo FakeRateUploadInfo()
=> new ()
{
EffectiveDate = DateTime.Now
};
[Fact]
public async Task RateUploader_UploadRates_RateExcelPath_Success()
{
var effectiveDate = DateTime.Now;
var request = new RateUploadRequest
{
FileName = "Test",
FileContent = "Test",
EffectiveDate = effectiveDate
};
var excelDataResponse = new ExcelDataResponse
{
WorkBook = new WorkBook
{
SheetResponses = new List<SheetResponse>
{
new SheetResponse(RateTypes.DirectBoat.GetNameFromValue())
{
CellResponses = new List<CellResponse>
{
new CellResponse
{
ColumnName = "A",
Row = 10,
Value = "2.2",
Formula = ""
},
new CellResponse
{
ColumnName = "B",
Row = 11,
Value = "2.3",
Formula = ""
}
}
}
}
}
};
var rates = FakeRates();
var rateSheets = FakeRateSheets();
var ratesToCreate = FakeRatesToCreate();
var previousRateUploadInfo = FakeRateUploadInfo();
_mockRateService.Setup(x => x.GetByDateAsync(It.IsAny<DateTime>())).ReturnsAsync(rates);
_mockRateSheetService.Setup(x => x.GetAsync()).ReturnsAsync(rateSheets);
_mockFileOperationsApiService.Setup(x => x.DirectExtractExcelWorkBookData(It.IsAny<ExcelDataRequest>())).ReturnsAsync(excelDataResponse).Verifiable();
_mockRateUploadInfoService.Setup(x => x.SaveAsync( It.Is<RateUploadInfo>(rateUploadInfo => rateUploadInfo.Rates.Count == ratesToCreate.Count)));
_mockRateUploadInfoService.Setup(x => x.GetLatestVersionOnDate(effectiveDate)).ReturnsAsync(previousRateUploadInfo).Verifiable();
await _rateUploaderService.UploadRates(request);
_mockRateService.Verify(x => x.GetByDateAsync(It.IsAny<DateTime>()), Times.Once);
_mockFileOperationsApiService.Verify(x => x.DirectExtractExcelWorkBookData(It.IsAny<ExcelDataRequest>()), Times.Once);
_mockRateUploadInfoService.Verify(x => x.SaveAsync(It.IsAny<RateUploadInfo>()), Times.Once);
}
[Fact]
public void RateUploader_UploadRates_RateExcelPath_RateServiceGetByDate_ThrowsException()
{
var request = new RateUploadRequest
{
FileContent = "Test",
FileName = "Test",
EffectiveDate = DateTime.Now
};
var excelDataResponse = FakeExcelDataResponse();
var ratesToUpdate = FakeRatesToUpdate();
var ratesToCreate = FakeRatesToCreate();
_mockRateService.Setup(x => x.GetByDateAsync(It.IsAny<DateTime>())).Throws(new Exception("Test")).Verifiable();
_mockFileOperationsApiService.Setup(x => x.DirectExtractExcelWorkBookData(It.IsAny<ExcelDataRequest>())).ReturnsAsync(excelDataResponse).Verifiable();
_mockRateUploadInfoService.Setup(x => x.SaveAsync( It.Is<RateUploadInfo>(rateUploadInfo => rateUploadInfo.Rates.Count == ratesToCreate.Count)));
_mockRateService.Setup(x => x.UpdateRangeAsync(ratesToUpdate)).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _rateUploaderService.UploadRates(request));
_mockRateService.Verify(x => x.GetByDateAsync(It.IsAny<DateTime>()), Times.Once);
_mockFileOperationsApiService.Verify(x => x.DirectExtractExcelWorkBookData(It.IsAny<ExcelDataRequest>()), Times.Never);
_mockRateUploadInfoService.Verify(x => x.SaveAsync(It.IsAny<RateUploadInfo>()), Times.Never);
_mockRateService.Verify(x => x.UpdateRangeAsync(It.Is<List<Rate>>(rates => rates.Count() == 2)), Times.Never);
}
[Fact]
public void RateUploader_UploadRates_RateExcelPath_FileOperations_ThrowsException()
{
var request = new RateUploadRequest
{
FileName = "Test",
FileContent = "Test",
EffectiveDate = DateTime.Now
};
var rates = FakeRates();
var rateSheets = FakeRateSheets();
var ratesToUpdate = FakeRatesToUpdate();
var ratesToCreate = FakeRatesToCreate();
_mockRateService.Setup(x => x.GetByDateAsync(It.IsAny<DateTime>())).ReturnsAsync(rates);
_mockRateSheetService.Setup(x => x.GetAsync()).ReturnsAsync(rateSheets);
_mockFileOperationsApiService.Setup(x => x.DirectExtractExcelWorkBookData(It.IsAny<ExcelDataRequest>())).Throws(new Exception("Test")).Verifiable();
_mockRateUploadInfoService.Setup(x => x.SaveAsync( It.Is<RateUploadInfo>(rateUploadInfo => rateUploadInfo.Rates.Count == ratesToCreate.Count)));
_mockRateService.Setup(x => x.UpdateRangeAsync(ratesToUpdate)).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _rateUploaderService.UploadRates(request));
_mockRateService.Verify(x => x.GetByDateAsync(It.IsAny<DateTime>()), Times.Once);
_mockFileOperationsApiService.Verify(x => x.DirectExtractExcelWorkBookData(It.IsAny<ExcelDataRequest>()), Times.Once);
_mockRateUploadInfoService.Verify(x => x.SaveAsync(It.IsAny<RateUploadInfo>()), Times.Never);
_mockRateService.Verify(x => x.UpdateRangeAsync(It.Is<List<Rate>>(rates => rates.Count() == 2)), Times.Never);
}
[Fact]
public async Task RateUploader_UploadRates_ExcelDataRequest_Success()
{
var effectiveDate = DateTime.Now;
var fileContent = "Test";
var request = new RateUploadExcelDataRequest
{
EffectiveDate = effectiveDate,
ExcelDataRequest = new ExcelDataRequest
{
FileContent = fileContent,
SheetRequests = new List<SheetRequest>
{
new()
{
SheetName = RateTypes.DirectBoat.GetNameFromValue(),
Rows = new List<int> { 10, 11, 12, 13 },
Columns = new List<string> { "A", "B", "C", "D" }
}
}
}
};
var excelDataResponse = FakeExcelDataResponse();
var rates = FakeRates();
var rateSheets = FakeRateSheets();
var previousRateUploadInfo = FakeRateUploadInfo();
_mockFileOperationsApiService.Setup(x => x.DirectExtractExcelWorkBookData(request.ExcelDataRequest)).ReturnsAsync(excelDataResponse).Verifiable();
_mockRateSheetService.Setup(x => x.GetAsync()).ReturnsAsync(rateSheets);
_mockRateService.Setup(x => x.GetByDateAsync(It.IsAny<DateTime>())).ReturnsAsync(rates);
_mockRateUploadInfoService.Setup(x => x.SaveAsync(It.IsAny<RateUploadInfo>())).Verifiable();
_mockRateUploadInfoService.Setup(x => x.GetLatestVersionOnDate(effectiveDate)).ReturnsAsync(previousRateUploadInfo).Verifiable();
await _rateUploaderService.UploadRates(request);
_mockFileOperationsApiService.Verify(x => x.DirectExtractExcelWorkBookData(It.IsAny<ExcelDataRequest>()), Times.Once);
_mockRateService.Verify(x => x.GetByDateAsync(It.IsAny<DateTime>()), Times.Once);
_mockRateUploadInfoService.Verify(x => x.SaveAsync(It.IsAny<RateUploadInfo>()), Times.Once);
}
[Fact]
public void RateUploader_UploadRates_ExcelDataRequest_FileOperations_ThrowsException()
{
var fileContent = "Test";
var request = new RateUploadExcelDataRequest
{
EffectiveDate = DateTime.Now,
ExcelDataRequest = new ExcelDataRequest
{
FileContent = fileContent,
SheetRequests = new List<SheetRequest>
{
new()
{
SheetName = "Test",
Rows = new List<int> { 10, 11, 12, 13 },
Columns = new List<string> { "A", "B", "C", "D" }
}
}
}
};
var rates = FakeRates();
var ratesToCreate = FakeRatesToCreate();
_mockFileOperationsApiService.Setup(x => x.DirectExtractExcelWorkBookData(request.ExcelDataRequest)).Throws(new Exception("Test")).Verifiable();
_mockRateService.Setup(x => x.GetByDateAsync(It.IsAny<DateTime>())).ReturnsAsync(rates);
_mockRateUploadInfoService.Setup(x => x.SaveAsync( It.Is<RateUploadInfo>(rateUploadInfo => rateUploadInfo.Rates.Count == ratesToCreate.Count)));
Assert.ThrowsAsync<ServiceException>(async () => await _rateUploaderService.UploadRates(request));
_mockFileOperationsApiService.Verify(x => x.DirectExtractExcelWorkBookData(It.IsAny<ExcelDataRequest>()), Times.Once);
_mockRateService.Verify(x => x.GetByDateAsync(It.IsAny<DateTime>()), Times.Never);
_mockRateUploadInfoService.Verify(x => x.SaveAsync(It.IsAny<RateUploadInfo>()), Times.Never);
}
[Fact]
public void RateUploader_UploadRates_ExcelDataRequest_RateServiceGetByDate_ThrowsException()
{
var fileContent = "Test";
var request = new RateUploadExcelDataRequest
{
EffectiveDate = DateTime.Now,
ExcelDataRequest = new ExcelDataRequest
{
FileContent = fileContent,
SheetRequests = new List<SheetRequest>
{
new()
{
SheetName = "Test",
Rows = new List<int> { 10, 11, 12, 13 },
Columns = new List<string> { "A", "B", "C", "D" }
}
}
}
};
var excelDataResponse = FakeExcelDataResponse();
var ratesToCreate = FakeRatesToCreate();
_mockFileOperationsApiService.Setup(x => x.DirectExtractExcelWorkBookData(request.ExcelDataRequest)).ReturnsAsync(excelDataResponse).Verifiable();
_mockRateService.Setup(x => x.GetByDateAsync(It.IsAny<DateTime>())).Throws(new Exception("Test")).Verifiable();
_mockRateUploadInfoService.Setup(x => x.SaveAsync( It.Is<RateUploadInfo>(rateUploadInfo => rateUploadInfo.Rates.Count == ratesToCreate.Count)));
Assert.ThrowsAsync<ServiceException>(async () => await _rateUploaderService.UploadRates(request));
_mockFileOperationsApiService.Verify(x => x.DirectExtractExcelWorkBookData(It.IsAny<ExcelDataRequest>()), Times.Once);
_mockRateService.Verify(x => x.GetByDateAsync(It.IsAny<DateTime>()), Times.Once);
_mockRateUploadInfoService.Verify(x => x.SaveAsync(It.IsAny<RateUploadInfo>()), Times.Never);
}
[Fact]
public void RateUploader_BuildExcelDataRequest_Succcess()
{
var rateExcelContent = "Test";
var rates = FakeRates();
var rateSheets = FakeRateSheets();
var excelDataRequest = _rateUploaderService.BuildExcelDataRequest(rateExcelContent, rates, rateSheets);
Assert.NotNull(excelDataRequest);
Assert.NotNull(excelDataRequest.SheetRequests);
Assert.Single(excelDataRequest.SheetRequests);
var sheetRequest = excelDataRequest.SheetRequests.FirstOrDefault();
Assert.NotNull(sheetRequest);
Assert.NotNull(sheetRequest.Rows);
Assert.Equal(2, sheetRequest.Rows.Count);
Assert.NotNull(sheetRequest.Columns);
Assert.Equal(2, sheetRequest.Columns.Count);
Assert.Equal(rateExcelContent, excelDataRequest.FileContent);
}
[Fact]
public async Task RateUploader_WorkThroughExcelDataResponseAndUpdateRates_Success()
{
var excelDataResponse = FakeExcelDataResponse();
var rates = FakeRates();
var rateSheets = FakeRateSheets();
var ratesToCreate = FakeRatesToCreate();
var rateUploadInfo = FakeRateUploadInfo();
rateUploadInfo.Rates = ratesToCreate;
_mockRateUploadInfoService.Setup(x => x.SaveAsync(It.IsAny<RateUploadInfo>())).Verifiable();
await _rateUploaderService.WorkThroughExcelDataResponseAndUpdateRates(excelDataResponse, rateUploadInfo, rates, rateSheets, DateTime.Now);
_mockRateUploadInfoService.Verify(x => x.SaveAsync(It.IsAny<RateUploadInfo>()), Times.Once);
}
[Fact]
public async Task RateUploader_WorkThroughExcelDataResponseAndUpdateRates_NullWorkbook_Done()
{
var excelDataResponse = new ExcelDataResponse
{
WorkBook = null
};
var rates = FakeRates();
var rateSheets = FakeRateSheets();
var rateUploadInfo = FakeRateUploadInfo();
await _rateUploaderService.WorkThroughExcelDataResponseAndUpdateRates(excelDataResponse, rateUploadInfo, rates, rateSheets, DateTime.Now);
_mockRateUploadInfoService.Verify(x => x.SaveAsync(It.IsAny<RateUploadInfo>()), Times.Never);
_mockRateService.Verify(x => x.UpdateRangeAsync(It.IsAny<List<Rate>>()), Times.Never);
}
[Fact]
public async Task RateUploader_WorkThroughExcelDataResponseAndUpdateRates_NullSheetResponses_Done()
{
var excelDataResponse = new ExcelDataResponse
{
WorkBook = new WorkBook
{
SheetResponses = null
}
};
var rates = FakeRates();
var rateSheets = FakeRateSheets();
var rateUploadInfo = FakeRateUploadInfo();
await _rateUploaderService.WorkThroughExcelDataResponseAndUpdateRates(excelDataResponse, rateUploadInfo, rates, rateSheets, DateTime.Now);
_mockRateUploadInfoService.Verify(x => x.SaveAsync(It.IsAny<RateUploadInfo>()), Times.Never);
_mockRateService.Verify(x => x.UpdateRangeAsync(It.IsAny<List<Rate>>()), Times.Never);
}
[Fact]
public void RateUploader_WorkThroughExcelDataResponseAndUpdateRates_NonDecimalCellValue_ServiceException()
{
var excelDataResponse = new ExcelDataResponse
{
WorkBook = new WorkBook
{
SheetResponses = new List<SheetResponse>
{
new SheetResponse("Test")
{
CellResponses = new List<CellResponse>
{
new CellResponse
{
ColumnName = "A",
Row = 10,
Value = "2.2",
Formula = ""
},
new CellResponse
{
ColumnName = "B",
Row = 11,
Value = "2.3",
Formula = ""
},
new CellResponse
{
ColumnName = "C",
Row = 12,
Value = "TEST",
Formula = ""
},
new CellResponse
{
ColumnName = "D",
Row = 13,
Value = "2.5",
Formula = ""
}
}
}
}
}
};
var rates = FakeRates();
var rateSheets = FakeRateSheets();
var rateUploadInfo = FakeRateUploadInfo();
Assert.ThrowsAsync<ServiceException>(
async () => await _rateUploaderService.WorkThroughExcelDataResponseAndUpdateRates(excelDataResponse, rateUploadInfo, rates, rateSheets, DateTime.Now));
_mockRateUploadInfoService.Verify(x => x.SaveAsync(It.IsAny<RateUploadInfo>()), Times.Never);
_mockRateService.Verify(x => x.UpdateRangeAsync(It.IsAny<List<Rate>>()), Times.Never);
}
[Fact]
public async Task RateUploader_InitiateRatesEvaluations_Success()
{
var rateSheets = FakeRateSheets();
var requests = new List<InitiateRatesEvaluationsRequest>
{
new()
{
SheetName = rateSheets[0].SheetName,
EvaluationDetailId = DateTime.Now.Millisecond,
RowsOrColumns = new List<string> { Guid.NewGuid().ToString() }
},
new()
{
SheetName = rateSheets[1].SheetName,
EvaluationDetailId = DateTime.Now.Millisecond,
RowsOrColumns = new List<string> { Guid.NewGuid().ToString() }
},
new()
{
SheetName = rateSheets[2].SheetName,
EvaluationDetailId = DateTime.Now.Millisecond,
RowsOrColumns = new List<string> { Guid.NewGuid().ToString() }
}
};
var rules = new List<EvaluationDetail>
{
new() { EvaluationDetailId = requests[0].EvaluationDetailId },
new() { EvaluationDetailId = requests[1].EvaluationDetailId },
new() { EvaluationDetailId = requests[2].EvaluationDetailId }
};
var rates = new List<Rate>
{
new()
{
RateSheetId = rateSheets[0].RateSheetId,
Column = requests[0].RowsOrColumns[0],
RateEvaluations = new List<RateEvaluation>()
},
new()
{
RateSheetId = rateSheets[0].RateSheetId,
Column = requests[0].RowsOrColumns[0],
RateEvaluations = new List<RateEvaluation>()
},
new()
{
RateSheetId = rateSheets[0].RateSheetId,
Row = requests[0].RowsOrColumns[0],
RateEvaluations = new List<RateEvaluation>()
},
new()
{
RateSheetId = rateSheets[1].RateSheetId,
Column = requests[1].RowsOrColumns[0],
RateEvaluations = new List<RateEvaluation>()
},
new()
{
RateSheetId = rateSheets[1].RateSheetId,
Column = requests[1].RowsOrColumns[0],
RateEvaluations = new List<RateEvaluation>()
},
new()
{
RateSheetId = rateSheets[2].RateSheetId,
Column = requests[2].RowsOrColumns[0],
RateEvaluations = new List<RateEvaluation>()
}
};
var tab1 = rates.Where(rate => rate.RateSheetId == rateSheets[0].RateSheetId);
var tab2 = rates.Where(rate => rate.RateSheetId == rateSheets[1].RateSheetId);
var tab3 = rates.Where(rate => rate.RateSheetId == rateSheets[2].RateSheetId);
_mockRateSheetService.SetupSequence(x => x.GetRatesByRateTypeAsync(It.IsAny<RateTypes>())).ReturnsAsync(tab1)
.ReturnsAsync(tab2)
.ReturnsAsync(tab3);
_mockEvaluationDetailService.SetupSequence(x => x.GetByIdAsync(It.IsAny<int>())).ReturnsAsync(rules[0])
.ReturnsAsync(rules[1])
.ReturnsAsync(rules[2]);
var result = (await _rateUploaderService.InitiateRatesEvaluations(requests)).ToList();
Assert.NotNull(result);
Assert.NotEmpty(result);
Assert.Equal(3, result.Count(x => x.Success));
_mockRateSheetService.Verify(x => x.GetRatesByRateTypeAsync(It.IsAny<RateTypes>()), Times.Exactly(3));
_mockEvaluationDetailService.Verify(x => x.GetByIdAsync(It.IsAny<int>()), Times.Exactly(3));
_mockRateEvaluationService.Verify(x => x.SaveRangeAsync(It.Is<List<RateEvaluation>>( savedRates => savedRates.Count == 5 )), Times.Once);
}
[Fact]
public async Task RateUploader_InitiateRatesEvaluations_NotFound_Success()
{
var rateSheets = FakeRateSheets();
var requests = new List<InitiateRatesEvaluationsRequest>
{
new()
{
SheetName = rateSheets[0].SheetName,
EvaluationDetailId = DateTime.Now.Millisecond,
RowsOrColumns = new List<string> { Guid.NewGuid().ToString() }
},
new()
{
SheetName = rateSheets[1].SheetName,
EvaluationDetailId = DateTime.Now.Millisecond,
RowsOrColumns = new List<string> { Guid.NewGuid().ToString() }
},
new()
{
SheetName = rateSheets[2].SheetName,
EvaluationDetailId = DateTime.Now.Millisecond,
RowsOrColumns = new List<string> { Guid.NewGuid().ToString() }
}
};
var rules = new List<EvaluationDetail>
{
new() { EvaluationDetailId = requests[0].EvaluationDetailId },
null,
new() { EvaluationDetailId = requests[2].EvaluationDetailId }
};
var rates = new List<Rate>
{
new()
{
RateSheetId = rateSheets[0].RateSheetId,
Column = requests[0].RowsOrColumns[0],
RateEvaluations = new List<RateEvaluation>()
},
new()
{
RateSheetId = rateSheets[0].RateSheetId,
Column = requests[0].RowsOrColumns[0],
RateEvaluations = new List<RateEvaluation>()
},
new()
{
RateSheetId = rateSheets[0].RateSheetId,
Column = requests[0].RowsOrColumns[0],
RateEvaluations = new List<RateEvaluation>()
},
new()
{
RateSheetId = rateSheets[1].RateSheetId,
Column = requests[1].RowsOrColumns[0],
RateEvaluations = new List<RateEvaluation>()
},
new()
{
RateSheetId = rateSheets[1].RateSheetId,
Column = requests[1].RowsOrColumns[0],
RateEvaluations = new List<RateEvaluation>()
},
new()
{
RateSheetId = rateSheets[2].RateSheetId,
Column = requests[2].RowsOrColumns[0],
RateEvaluations = new List<RateEvaluation>()
}
};
var tab1 = rates.Where(rate => rate.RateSheetId == rateSheets[0].RateSheetId);
var tab2 = rates.Where(rate => rate.RateSheetId == rateSheets[1].RateSheetId);
var tab3 = rates.Where(rate => rate.RateSheetId == rateSheets[2].RateSheetId);
_mockRateSheetService.Setup(x => x.GetAsync()).ReturnsAsync(rateSheets);
_mockRateSheetService.SetupSequence(x => x.GetRatesByRateTypeAsync(It.IsAny<RateTypes>())).ReturnsAsync(tab1)
.ReturnsAsync(tab2)
.ReturnsAsync(tab3);
_mockEvaluationDetailService.SetupSequence(x => x.GetByIdAsync(It.IsAny<int>())).ReturnsAsync(rules[0])
.ReturnsAsync(rules[1])
.ReturnsAsync(rules[2]);
var result = (await _rateUploaderService.InitiateRatesEvaluations(requests)).ToList();
Assert.NotNull(result);
Assert.NotEmpty(result);
Assert.Equal(3, result.Count(x => x.Success));
_mockRateSheetService.Verify(x => x.GetRatesByRateTypeAsync(It.IsAny<RateTypes>()), Times.Exactly(3));
_mockEvaluationDetailService.Verify(x => x.GetByIdAsync(It.IsAny<int>()), Times.Exactly(3));
_mockRateEvaluationService.Verify(x => x.SaveRangeAsync(It.Is<List<RateEvaluation>>( savedRates => savedRates.Count == 4 )), Times.Once);
}
[Fact]
public async Task RateUploader_InitiateRatesEvaluations_ThrowsException_Failure()
{
var requests = new List<InitiateRatesEvaluationsRequest>
{
new()
{
SheetName = RateTypes.DirectMotorcycle.GetNameFromValue(),
EvaluationDetailId = DateTime.Now.Millisecond,
RowsOrColumns = new List<string> { Guid.NewGuid().ToString() }
}
};
_mockRateSheetService.Setup(x => x.GetRatesByRateTypeAsync(It.IsAny<RateTypes>())).Throws(new Exception("Test")).Verifiable();
await Assert.ThrowsAsync<ServiceException>(async () => await _rateUploaderService.InitiateRatesEvaluations(requests));
_mockRateSheetService.Verify(x => x.GetRatesByRateTypeAsync(It.IsAny<RateTypes>()), Times.Once);
_mockEvaluationDetailService.Verify(x => x.GetByIdAsync(It.IsAny<int>()), Times.Never);
_mockRateEvaluationService.Verify(x => x.SaveRangeAsync(It.IsAny<List<RateEvaluation>>()), Times.Never);
}
}
@@ -0,0 +1,176 @@
using LCU.API.Internal.LoanRate.Services;
using LCU.API.Internal.LoanRate.Services.LoanRateOperationServices;
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.LcuClassPatterns.CrudTests.Utilities;
using LCU.Library.Internal.LoanRateModels.Entities;
using LCU.Library.Internal.LoanRateModels.Responses.Validation;
using LCU.Library.Internal.LoanRateModels.Responses.Validation.RateSheetValidations;
using LCU.Library.Internal.TypeExtensions.ObjectExtensions;
namespace LCU.API.Internal.LoanRateTests.ServiceTests.LoanRateOperationServicesTests;
public class RateValidationServiceTest
{
private readonly RateValidationService _rateValidationService;
private readonly Mock<IRateService> _mockRateService;
public RateValidationServiceTest()
{
_mockRateService = new Mock<IRateService>();
_rateValidationService = new RateValidationService(_mockRateService.Object);
}
[Fact]
public async Task RateValidation_ValidateAsync_Success_AllPass()
{
var rates = FakeRates();
foreach (var rate in rates)
{
var originalRate = FakeNewRate(rate, decimal.ToInt32(rate.Value - new Random().Next(0, 10)), decimal.ToInt32(rate.Value));
var rateHistory = FakeRateHistory(rate,
originalRate,
decimal.ToInt32(rate.Value - new Random().Next(0, 10)),
decimal.ToInt32(rate.Value + new Random().Next(0, 10)));
_mockRateService.Setup(x => x.GetRateHistory(It.IsAny<Rate>())).ReturnsAsync(rateHistory);
_mockRateService.Setup(x => x.GetByIdAsync(It.IsAny<int>())).ReturnsAsync(originalRate);
}
var result = await _rateValidationService.ValidateAsync(rates);
Assert.NotNull(result);
Assert.True(result.All(x => x.Pass));
Assert.True(result.All(x => x.Validations.Count > 0));
_mockRateService.Verify(x => x.GetRateHistory(It.IsAny<Rate>()), Times.Exactly(rates.Count));
_mockRateService.Verify(x => x.GetByIdAsync(It.IsAny<int>()), Times.Exactly(rates.Count));
}
[Fact]
public async Task RateValidation_ValidateAsync_Success_DoesNotPassRange()
{
var rates = FakeRates();
foreach (var rate in rates)
{
var originalRate = FakeNewRate(rate, decimal.ToInt32(rate.Value - new Random().Next(0, 10)), decimal.ToInt32(rate.Value));
var rateHistory = FakeRateHistory(rate,
originalRate,
decimal.ToInt32(rate.Value - new Random().Next(0, 10)),
decimal.ToInt32(rate.Value + new Random().Next(0, 10)));
originalRate.Value += 100;
rate.Value += 100;
_mockRateService.Setup(x => x.GetRateHistory(It.IsAny<Rate>())).ReturnsAsync(rateHistory);
_mockRateService.Setup(x => x.GetByIdAsync(It.IsAny<int>())).ReturnsAsync(originalRate);
}
var result = await _rateValidationService.ValidateAsync(rates);
Assert.NotNull(result);
Assert.False(result.All(x => x.Pass));
Assert.True(result.All(x => x.Validations.Count > 0));
Assert.True(result.All(x => x.Validations.First(y => y.RateSheetValidationType == RateSheetValidationTypes.IsWithinTrendRange).Pass));
Assert.False(result.All(x => x.Validations.First(y => y.RateSheetValidationType == RateSheetValidationTypes.IsWithinRange).Pass));
_mockRateService.Verify(x => x.GetRateHistory(It.IsAny<Rate>()), Times.Exactly(rates.Count));
_mockRateService.Verify(x => x.GetByIdAsync(It.IsAny<int>()), Times.Exactly(rates.Count));
}
[Fact]
public async Task RateValidation_ValidateAsync_Success_DoesNotPassTrend()
{
var rates = FakeRates();
foreach (var rate in rates)
{
var originalRate = FakeNewRate(rate, decimal.ToInt32(rate.Value - new Random().Next(0, 10)), decimal.ToInt32(rate.Value));
var rateHistory = FakeRateHistory(rate,
originalRate,
decimal.ToInt32(rate.Value - new Random().Next(0, 10)),
decimal.ToInt32(rate.Value + new Random().Next(0, 10)));
rateHistory.First().Value += 100;
_mockRateService.Setup(x => x.GetRateHistory(It.IsAny<Rate>())).ReturnsAsync(rateHistory);
_mockRateService.Setup(x => x.GetByIdAsync(It.IsAny<int>())).ReturnsAsync(originalRate);
}
var result = await _rateValidationService.ValidateAsync(rates);
Assert.NotNull(result);
Assert.False(result.All(x => x.Pass));
Assert.True(result.All(x => x.Validations.Count > 0));
Assert.False(result.All(x => x.Validations.First(y => y.RateSheetValidationType == RateSheetValidationTypes.IsWithinTrendRange).Pass));
Assert.True(result.All(x => x.Validations.First(y => y.RateSheetValidationType == RateSheetValidationTypes.IsWithinRange).Pass));
_mockRateService.Verify(x => x.GetRateHistory(It.IsAny<Rate>()), Times.Exactly(rates.Count));
_mockRateService.Verify(x => x.GetByIdAsync(It.IsAny<int>()), Times.Exactly(rates.Count));
}
[Fact]
public async Task RateValidation_ValidateAsync_ThrowsException()
{
var rates = FakeRates();
_mockRateService.Setup(x => x.GetRateHistory(rates[0])).Throws(new Exception("Test")).Verifiable();
await Assert.ThrowsAsync<ServiceException>(async () => await _rateValidationService.ValidateAsync(rates));
_mockRateService.Verify(x => x.GetRateHistory(It.IsAny<Rate>()), Times.Once);
_mockRateService.Verify(x => x.GetByIdAsync(It.IsAny<int>()), Times.Never);
}
private List<Rate> FakeRates(int count = 3)
{
var rates = new List<Rate>();
for (var i = 0; i < count; i++)
{
var startDate = (DateTime)typeof(DateTime).GetRandomValue();
rates.Add(new Rate
{
RateId = (int)typeof(int).GetRandomValue(),
Value = new Random().Next(20, 30),
Row = (string)typeof(string).GetRandomValue(),
Column = (string)typeof(string).GetRandomValue(),
RateStartDate = startDate,
RateEndDate = startDate.AddDays(10),
RateSheetId = (int)typeof(int).GetRandomValue()
});
}
return rates;
}
private Rate FakeNewRate(Rate rate, int minValue = int.MinValue, int maxValue = int.MaxValue)
{
var newRate = rate.DeepCopy();
newRate.RateId = (int)typeof(int).GetRandomValue();
newRate.Value = new Random().Next(minValue, maxValue);
return newRate;
}
private List<Rate> FakeRateHistory(Rate rate, Rate originalRate, int minValue = int.MinValue, int maxValue = int.MaxValue)
{
var rates = new List<Rate>
{
FakeNewRate(rate, minValue, decimal.ToInt32(rate.Value)),
FakeNewRate(rate, minValue, maxValue),
FakeNewRate(rate, decimal.ToInt32(rate.Value), maxValue)
};
var trend = Math.Round(rate.Value / originalRate.Value, 2);
rates[0].RateStartDate = rate.RateStartDate.AddDays(-30);
rates[0].RateEndDate = rate.RateStartDate.AddDays(-20);
rates[1].RateStartDate = rate.RateStartDate.AddDays(-20);
rates[1].RateEndDate = rate.RateStartDate.AddDays(-10);
rates[1].Value = Math.Round(rates[0].Value * (trend + 1), 2);
rates[2].RateStartDate = rate.RateStartDate.AddDays(-10);
rates[2].RateEndDate = rate.RateStartDate;
rates[2].Value = Math.Round(rates[1].Value * (trend - 1), 2);
return rates;
}
}
@@ -0,0 +1,511 @@
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.LoanRateModels.Entities;
using LCU.API.Internal.LoanRateLib.Repositories;
using LCU.API.Internal.LoanRate.Services;
namespace LCU.API.Internal.LoanRateTests.ServiceTests;
public class RateEvaluationServiceTest
{
private readonly Mock<IUnitOfWork> _mockUnitOfWork;
private readonly Mock<IRateEvaluationRepository> _mockRateEvaluationRepository;
private readonly Mock<IRateService> _mockRateService;
private readonly IRateEvaluationService _service;
public RateEvaluationServiceTest()
{
_mockRateEvaluationRepository = new Mock<IRateEvaluationRepository>();
_mockUnitOfWork = new Mock<IUnitOfWork>();
_mockRateService = new Mock<IRateService>();
_service = new RateEvaluationService(_mockUnitOfWork.Object,
_mockRateEvaluationRepository.Object,
_mockRateService.Object);
}
[Fact]
public async void RateEvaluation_GetAsync_Success()
{
var rateEvaluations = new List<RateEvaluation>
{
new() { RateEvaluationId = 1 },
new() { RateEvaluationId = 2 },
new() { RateEvaluationId = 3 }
};
_mockRateEvaluationRepository.Setup(x => x.FindAsync())
.ReturnsAsync(rateEvaluations).Verifiable();
var result = (await _service.GetAsync()).ToList();
Assert.NotNull(result);
Assert.Equal(rateEvaluations.First().RateEvaluationId, result.First().RateEvaluationId);
Assert.Equal(rateEvaluations.Count, result.Count);
_mockRateEvaluationRepository.Verify();
}
[Fact]
public async void RateEvaluation_GetAsync_Success_NotFound()
{
List<RateEvaluation>? rateEvaluations = null;
_mockRateEvaluationRepository.Setup(x => x.FindAsync())
.ReturnsAsync(rateEvaluations).Verifiable();
var result = await _service.GetAsync();
Assert.NotNull(result);
Assert.Empty(result);
_mockRateEvaluationRepository.Verify();
}
[Fact]
public void RateEvaluation_GetAsync_Failure_Exception()
{
_mockRateEvaluationRepository.Setup(x => x.FindAsync())
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.GetAsync());
_mockRateEvaluationRepository.Verify(x => x.FindAsync(), Times.Once);
}
[Fact]
public async void RateEvaluation_GetByIdAsync_Success()
{
var rateEvaluationId = 1;
var rateEvaluation = new RateEvaluation
{
RateEvaluationId = rateEvaluationId
};
_mockRateEvaluationRepository.Setup(x => x.FindByIdAsync(rateEvaluationId))
.ReturnsAsync(rateEvaluation).Verifiable();
var result = await _service.GetByIdAsync(rateEvaluationId);
Assert.NotNull(result);
Assert.Equal(rateEvaluation.RateEvaluationId, result.RateEvaluationId);
_mockRateEvaluationRepository.Verify();
}
[Fact]
public async void RateEvaluation_GetByIdAsync_Success_NotFound()
{
var rateEvaluationId = 1;
RateEvaluation? rateEvaluation = null;
_mockRateEvaluationRepository.Setup(x => x.FindByIdAsync(rateEvaluationId))
.ReturnsAsync(rateEvaluation).Verifiable();
var result = await _service.GetByIdAsync(rateEvaluationId);
Assert.Null(result);
_mockRateEvaluationRepository.Verify();
}
[Fact]
public void RateEvaluation_GetByIdAsync_Failure_Exception()
{
_mockRateEvaluationRepository.Setup(x => x.FindByIdAsync(It.IsAny<int>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.GetByIdAsync(It.IsAny<int>()));
_mockRateEvaluationRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once);
}
[Fact]
public async void RateEvaluation_GetRangeByIdAsync_Success()
{
var rateEvaluations = new List<RateEvaluation>
{
new() { RateEvaluationId = 1 },
new() { RateEvaluationId = 2 },
new() { RateEvaluationId = 3 }
};
var ids = rateEvaluations.Select(x => x.RateEvaluationId).ToList();
_mockRateEvaluationRepository.Setup(x => x.FindRangeByIdAsync(ids))
.ReturnsAsync(rateEvaluations).Verifiable();
var result = (await _service.GetRangeByIdAsync(ids)).ToList();
Assert.NotNull(result);
Assert.Equal(rateEvaluations.First().RateEvaluationId, result.First().RateEvaluationId);
Assert.Equal(rateEvaluations.Count, result.Count);
_mockRateEvaluationRepository.Verify();
}
[Fact]
public async void RateEvaluation_GetRangeByIdAsync_Success_NotFound()
{
List<RateEvaluation>? rateEvaluations = null;
var ids = new List<int>
{
1,2,3
};
_mockRateEvaluationRepository.Setup(x => x.FindRangeByIdAsync(ids))
.ReturnsAsync(rateEvaluations).Verifiable();
var result = await _service.GetRangeByIdAsync(ids);
Assert.NotNull(result);
Assert.Empty(result);
_mockRateEvaluationRepository.Verify();
}
[Fact]
public void RateEvaluation_GetRangeByIdAsync_Failure_Exception()
{
_mockRateEvaluationRepository.Setup(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.GetRangeByIdAsync(It.IsAny<List<int>>()));
_mockRateEvaluationRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()), Times.Once);
}
[Fact]
public async void RateEvaluation_SaveAsync_Success()
{
var rateEvaluation = new RateEvaluation
{
RateId = 1,
};
var rateEvaluationReturned = new RateEvaluation
{
RateEvaluationId = 1,
RateId = 2
};
_mockRateEvaluationRepository.Setup(x => x.AddAsync(rateEvaluation))
.ReturnsAsync(rateEvaluationReturned).Verifiable();
var result = await _service.SaveAsync(rateEvaluation);
Assert.NotNull(result);
Assert.Equal(rateEvaluationReturned.RateEvaluationId, result.RateEvaluationId);
Assert.Equal(rateEvaluationReturned.RateId, result.RateId);
_mockRateEvaluationRepository.Verify(x => x.AddAsync(It.IsAny<RateEvaluation>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
_mockRateService.Verify(x => x.ClearCache(), Times.Once);
}
[Fact]
public void RateEvaluation_SaveAsync_Failure_ReturnedNull()
{
var rateEvaluation = new RateEvaluation
{
RateId = 1
};
RateEvaluation? rateEvaluationReturned = null;
_mockRateEvaluationRepository.Setup(x => x.AddAsync(rateEvaluation))
.ReturnsAsync(rateEvaluationReturned).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.SaveAsync(rateEvaluation));
_mockRateEvaluationRepository.Verify(x => x.AddAsync(It.IsAny<RateEvaluation>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
_mockRateService.Verify(x => x.ClearCache(), Times.Never);
}
[Fact]
public void RateEvaluation_SaveAsync_Failure_Exception()
{
_mockRateEvaluationRepository.Setup(x => x.AddAsync(It.IsAny<RateEvaluation>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.SaveAsync(It.IsAny<RateEvaluation>()));
_mockRateEvaluationRepository.Verify(x => x.AddAsync(It.IsAny<RateEvaluation>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
_mockRateService.Verify(x => x.ClearCache(), Times.Never);
}
[Fact]
public async void RateEvaluation_SaveRangeAsync_Success()
{
var rateEvaluations = new List<RateEvaluation>
{
new() { RateId = 1 },
new() { RateId = 2 },
new() { RateId = 3 }
};
_mockRateEvaluationRepository.Setup(x => x.AddRangeAsync(rateEvaluations)).Verifiable();
await _service.SaveRangeAsync(rateEvaluations);
_mockRateEvaluationRepository.Verify(x =>
x.AddRangeAsync(It.IsAny<IEnumerable<RateEvaluation>>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
_mockRateService.Verify(x => x.ClearCache(), Times.Once);
}
[Fact]
public void RateEvaluation_SaveRangeAsync_Failure_Exception()
{
_mockRateEvaluationRepository.Setup(x => x.AddRangeAsync(It.IsAny<IEnumerable<RateEvaluation>>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.SaveRangeAsync(It.IsAny<IEnumerable<RateEvaluation>>()));
_mockRateEvaluationRepository.Verify(x =>
x.AddRangeAsync(It.IsAny<IEnumerable<RateEvaluation>>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
_mockRateService.Verify(x => x.ClearCache(), Times.Never);
}
[Fact]
public async void RateEvaluation_UpdateAsync_Success()
{
var rateEvaluation = new RateEvaluation
{
RateEvaluationId = 1,
RateId = 1
};
_mockRateEvaluationRepository.Setup(x => x.FindByIdAsync(rateEvaluation.RateEvaluationId))
.ReturnsAsync(rateEvaluation).Verifiable();
var result = await _service.UpdateAsync(rateEvaluation);
Assert.NotNull(result);
Assert.Equal(rateEvaluation.RateEvaluationId, result.RateEvaluationId);
Assert.Equal(rateEvaluation.RateId, result.RateId);
_mockRateEvaluationRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once());
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
_mockRateService.Verify(x => x.ClearCache(), Times.Once);
}
[Fact]
public void RateEvaluation_UpdateAsync_Failure_ReturnedNull()
{
var rateEvaluation = new RateEvaluation
{
RateId = 1
};
RateEvaluation? rateEvaluationReturned = null;
_mockRateEvaluationRepository.Setup(x => x.FindByIdAsync(rateEvaluation.RateEvaluationId))
.ReturnsAsync(rateEvaluationReturned).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.UpdateAsync(rateEvaluation));
_mockRateEvaluationRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
_mockRateService.Verify(x => x.ClearCache(), Times.Never);
}
[Fact]
public void RateEvaluation_UpdateAsync_Failure_Exception()
{
_mockRateEvaluationRepository.Setup(x => x.FindByIdAsync(It.IsAny<int>()))
.ThrowsAsync(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.UpdateAsync(It.IsAny<RateEvaluation>()));
_mockRateEvaluationRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
_mockRateService.Verify(x => x.ClearCache(), Times.Never);
}
[Fact]
public async void RateEvaluation_UpdateRangeAsync_Success()
{
var rateEvaluations = new List<RateEvaluation>
{
new()
{
RateEvaluationId = 1,
RateId = 1
},
new()
{
RateEvaluationId = 2,
RateId = 2
},
new()
{
RateEvaluationId = 3,
RateId = 3
}
};
_mockRateEvaluationRepository.Setup(x => x.UpdateRange(rateEvaluations)).Verifiable();
await _service.UpdateRangeAsync(rateEvaluations);
_mockRateEvaluationRepository.Verify(x => x.UpdateRange(It.IsAny<List<RateEvaluation>>()), Times.Once());
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
_mockRateService.Verify(x => x.ClearCache(), Times.Once);
}
[Fact]
public void RateEvaluation_UpdateRangeAsync_Failure_Exception()
{
_mockRateEvaluationRepository.Setup(x => x.UpdateRange(It.IsAny<List<RateEvaluation>>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.UpdateRangeAsync(It.IsAny<List<RateEvaluation>>()));
_mockRateEvaluationRepository.Verify(x => x.UpdateRange(It.IsAny<List<RateEvaluation>>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
_mockRateService.Verify(x => x.ClearCache(), Times.Never);
}
[Fact]
public async void RateEvaluation_DeleteAsync_Success()
{
var rateEvaluationId = 1;
var rateEvaluation = new RateEvaluation
{
RateEvaluationId = rateEvaluationId,
RateId = 1
};
_mockRateEvaluationRepository.Setup(x => x.FindByIdAsync(rateEvaluationId))
.ReturnsAsync(rateEvaluation).Verifiable();
_mockRateEvaluationRepository.Setup(x => x.Remove(rateEvaluation)).Verifiable();
await _service.DeleteAsync(rateEvaluationId);
_mockRateEvaluationRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once());
_mockRateEvaluationRepository.Verify(x => x.Remove(It.IsAny<RateEvaluation>()), Times.Once());
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
_mockRateService.Verify(x => x.ClearCache(), Times.Once);
}
[Fact]
public void RateEvaluation_DeleteAsync_Failure_ReturnedNull()
{
var rateEvaluationId = 1;
RateEvaluation? rateEvaluation = null;
_mockRateEvaluationRepository.Setup(x => x.FindByIdAsync(rateEvaluationId))
.ReturnsAsync(rateEvaluation).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.DeleteAsync(rateEvaluationId));
_mockRateEvaluationRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once());
_mockRateEvaluationRepository.Verify(x => x.Remove(It.IsAny<RateEvaluation>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
_mockRateService.Verify(x => x.ClearCache(), Times.Never);
}
[Fact]
public void RateEvaluation_DeleteAsync_Failure_Exception()
{
_mockRateEvaluationRepository.Setup(x => x.FindByIdAsync(It.IsAny<int>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.DeleteAsync(It.IsAny<int>()));
_mockRateEvaluationRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once);
_mockRateEvaluationRepository.Verify(x => x.Remove(It.IsAny<RateEvaluation>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
_mockRateService.Verify(x => x.ClearCache(), Times.Never);
}
[Fact]
public async void RateEvaluation_DeleteRangeAsync_Success()
{
var rateEvaluationIds = new List<int>
{
1,
2,
3
};
var rateEvaluations = new List<RateEvaluation>
{
new()
{
RateEvaluationId = rateEvaluationIds[0],
RateId = 1
},
new()
{
RateEvaluationId = rateEvaluationIds[1],
RateId = 2
},
new()
{
RateEvaluationId = rateEvaluationIds[2],
RateId = 3
}
};
_mockRateEvaluationRepository.Setup(x => x.FindRangeByIdAsync(rateEvaluationIds)).ReturnsAsync(rateEvaluations).Verifiable();
_mockRateEvaluationRepository.Setup(x => x.RemoveRange(rateEvaluations)).Verifiable();
await _service.DeleteRangeAsync(rateEvaluationIds);
_mockRateEvaluationRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()), Times.Once());
_mockRateEvaluationRepository.Verify(x => x.RemoveRange(It.IsAny<List<RateEvaluation>>()), Times.Once());
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
_mockRateService.Verify(x => x.ClearCache(), Times.Once);
}
[Fact]
public void RateEvaluation_DeleteRangeAsync_Failure_ReturnedNull()
{
var rateEvaluationIds = new List<int>
{
1,
2,
3
};
List<RateEvaluation>? rateEvaluations = null;
_mockRateEvaluationRepository.Setup(x => x.FindRangeByIdAsync(rateEvaluationIds))
.ReturnsAsync(rateEvaluations).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.DeleteRangeAsync(rateEvaluationIds));
_mockRateEvaluationRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()), Times.Once());
_mockRateEvaluationRepository.Verify(x => x.RemoveRange(It.IsAny<List<RateEvaluation>>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
_mockRateService.Verify(x => x.ClearCache(), Times.Never);
}
[Fact]
public void RateEvaluation_DeleteRangeAsync_Failure_Exception()
{
_mockRateEvaluationRepository.Setup(x => x.RemoveRange(It.IsAny<List<RateEvaluation>>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.DeleteRangeAsync(It.IsAny<List<int>>()));
_mockRateEvaluationRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()), Times.Once());
_mockRateEvaluationRepository.Verify(x => x.RemoveRange(It.IsAny<List<RateEvaluation>>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
_mockRateService.Verify(x => x.ClearCache(), Times.Never);
}
[Fact]
public async void RateEvaluation_CountByEvaluationDetailIdAsync_Success()
{
var evaluationDetailId = DateTime.Now.Millisecond;
var count = DateTime.Now.Minute;
_mockRateEvaluationRepository.Setup(x => x.CountByEvaluationDetailIdAsync(evaluationDetailId)).ReturnsAsync(count).Verifiable();
await _service.CountByEvaluationDetailIdAsync(evaluationDetailId);
_mockRateEvaluationRepository.Verify(x => x.CountByEvaluationDetailIdAsync(It.IsAny<int>()), Times.Once());
}
[Fact]
public void RateEvaluation_CountByEvaluationDetailIdAsync_Failure_Exception()
{
_mockRateEvaluationRepository.Setup(x => x.CountByEvaluationDetailIdAsync(It.IsAny<int>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.CountByEvaluationDetailIdAsync(It.IsAny<int>()));
_mockRateEvaluationRepository.Verify(x => x.CountByEvaluationDetailIdAsync(It.IsAny<int>()), Times.Once());
}
}
@@ -0,0 +1,649 @@
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.LoanRateModels.Entities;
using LCU.API.Internal.LoanRateLib.Repositories;
using LCU.API.Internal.LoanRate.Services;
using LCU.Library.Internal.LcuEvaluationModels.Enums;
namespace LCU.API.Internal.LoanRateTests.ServiceTests;
public class RateServiceTest
{
private readonly Mock<IRateRepository> _mockRateRepository;
private readonly Mock<IRateSheetService> _mockRateSheetService;
private readonly Mock<ILoadTestRunInfoService> _mockLoadTestRunInfoService;
private readonly Mock<IUnitOfWork> _mockUnitOfWork;
private readonly IRateService _service;
public RateServiceTest()
{
_mockRateRepository = new Mock<IRateRepository>();
_mockRateSheetService = new Mock<IRateSheetService>();
_mockLoadTestRunInfoService = new Mock<ILoadTestRunInfoService>();
_mockUnitOfWork = new Mock<IUnitOfWork>();
_service = new RateService(_mockUnitOfWork.Object,
_mockRateRepository.Object,
_mockRateSheetService.Object,
_mockLoadTestRunInfoService.Object);
}
[Fact]
public async void Rate_GetAsync_Success()
{
var rates = new List<Rate>
{
new() { RateId = 1 },
new() { RateId = 2 },
new() { RateId = 3 }
};
_mockRateRepository.Setup(x => x.FindAsync())
.ReturnsAsync(rates).Verifiable();
var result = (await _service.GetAsync()).ToList();
Assert.NotNull(result);
Assert.Equal(rates.First().RateId, result.First().RateId);
Assert.Equal(rates.Count, result.Count);
_mockRateRepository.Verify();
}
[Fact]
public async void Rate_GetAsync_Success_NotFound()
{
List<Rate>? rates = null;
_mockRateRepository.Setup(x => x.FindAsync())
.ReturnsAsync(rates).Verifiable();
var result = await _service.GetAsync();
Assert.NotNull(result);
Assert.Empty(result);
_mockRateRepository.Verify();
}
[Fact]
public void Rate_GetAsync_Failure_Exception()
{
_mockRateRepository.Setup(x => x.FindAsync())
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.GetAsync());
_mockRateRepository.Verify(x => x.FindAsync(), Times.Once);
}
[Fact]
public async void Rate_GetByIdAsync_Success()
{
var rateId = 1;
var rate = new Rate
{
RateId = rateId
};
_mockRateRepository.Setup(x => x.FindByIdAsync(rateId))
.ReturnsAsync(rate).Verifiable();
var result = await _service.GetByIdAsync(rateId);
Assert.NotNull(result);
Assert.Equal(rate.RateId, result.RateId);
_mockRateRepository.Verify();
}
[Fact]
public async void Rate_GetByIdAsync_Success_NotFound()
{
var rateId = 1;
Rate? rate = null;
_mockRateRepository.Setup(x => x.FindByIdAsync(rateId))
.ReturnsAsync(rate).Verifiable();
var result = await _service.GetByIdAsync(rateId);
Assert.Null(result);
_mockRateRepository.Verify();
}
[Fact]
public void Rate_GetByIdAsync_Failure_Exception()
{
_mockRateRepository.Setup(x => x.FindByIdAsync(It.IsAny<int>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.GetByIdAsync(It.IsAny<int>()));
_mockRateRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once);
}
[Fact]
public async void Rate_GetByDateAsync_Success()
{
var rateId = 1;
var rates = new List<Rate>{
new Rate
{
RateId = rateId
}
};
var date = Convert.ToDateTime("1/1/2023");
_mockRateRepository.Setup(x => x.FindByDateAsync(date))
.ReturnsAsync(rates).Verifiable();
var results = await _service.GetByDateAsync(date);
Assert.NotNull(results);
Assert.NotEmpty(results);
var result = results.FirstOrDefault();
Assert.NotNull(result);
Assert.Equal(rateId, result.RateId);
_mockRateRepository.Verify();
}
[Fact]
public async void Rate_GetByDateAsync_Success_NotFound()
{
List<Rate>? rate = null;
var date = Convert.ToDateTime("1/1/2023");
_mockRateRepository.Setup(x => x.FindByDateAsync(date))
.ReturnsAsync(rate).Verifiable();
var results = await _service.GetByDateAsync(date);
Assert.NotNull(results);
Assert.Empty(results);
_mockRateRepository.Verify();
}
[Fact]
public void Rate_GetByDateAsync_Failure_Exception()
{
_mockRateRepository.Setup(x => x.FindByDateAsync(It.IsAny<DateTime>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.GetByDateAsync(It.IsAny<DateTime>()));
_mockRateRepository.Verify(x => x.FindByDateAsync(It.IsAny<DateTime>()), Times.Once);
}
[Fact]
public async void Rate_GetRateHistoryAsync_Success()
{
var rate = new Rate
{
RateId = 1,
Column = "A",
Row = "2",
RateSheetId = 1
};
var rateHistory = new List<Rate>
{
new()
{
Column = rate.Column,
Row = rate.Row,
RateSheetId = rate.RateSheetId
},
new()
{
Column = rate.Column,
Row = rate.Row,
RateSheetId = rate.RateSheetId
},
new()
{
Column = rate.Column,
Row = rate.Row,
RateSheetId = rate.RateSheetId
}
};
_mockRateRepository.Setup(x => x.FindRateHistoryAsync(rate))
.ReturnsAsync(rateHistory).Verifiable();
var results = (await _service.GetRateHistory(rate))?.ToList();
Assert.NotNull(results);
Assert.NotEmpty(results);
var result = results.FirstOrDefault();
Assert.NotNull(result);
Assert.Equal(rate.RateSheetId, result.RateSheetId);
_mockRateRepository.Verify();
}
[Fact]
public async void Rate_GetRateHistoryAsync_Success_NotFound()
{
Rate? rate = null;
List<Rate>? rateHistory = null;
_mockRateRepository.Setup(x => x.FindRateHistoryAsync(rate))
.ReturnsAsync(rateHistory).Verifiable();
var results = await _service.GetRateHistory(rate);
Assert.NotNull(results);
Assert.Empty(results);
_mockRateRepository.Verify();
}
[Fact]
public void Rate_GetRateHistoryAsync_Failure_Exception()
{
_mockRateRepository.Setup(x => x.FindRateHistoryAsync(It.IsAny<Rate>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.GetRateHistory(It.IsAny<Rate>()));
_mockRateRepository.Verify(x => x.FindRateHistoryAsync(It.IsAny<Rate>()), Times.Once);
}
[Fact]
public async void Rate_GetRangeByIdAsync_Success()
{
var rates = new List<Rate>
{
new() { RateId = 1 },
new() { RateId = 2 },
new() { RateId = 3 }
};
var ids = rates.Select(x => x.RateId).ToList();
_mockRateRepository.Setup(x => x.FindRangeByIdAsync(ids))
.ReturnsAsync(rates).Verifiable();
var results = (await _service.GetRangeByIdAsync(ids)).ToList();
Assert.NotNull(results);
Assert.Equal(rates.First().RateId, results.First().RateId);
Assert.Equal(rates.Count, results.Count);
_mockRateRepository.Verify();
}
[Fact]
public async void Rate_GetRangeByIdAsync_Success_NotFound()
{
List<Rate>? rates = null;
var ids = new List<int>
{
1,2,3
};
_mockRateRepository.Setup(x => x.FindRangeByIdAsync(ids))
.ReturnsAsync(rates).Verifiable();
var result = await _service.GetRangeByIdAsync(ids);
Assert.NotNull(result);
Assert.Empty(result);
_mockRateRepository.Verify();
}
[Fact]
public void Rate_GetRangeByIdAsync_Failure_Exception()
{
_mockRateRepository.Setup(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.GetRangeByIdAsync(It.IsAny<List<int>>()));
_mockRateRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()), Times.Once);
}
[Fact]
public async void Rate_GetByDateEvaluationIdAndEvaluationTypeAsync_Success()
{
var rateId = 1;
var rateSheetId = 1;
var date = Convert.ToDateTime("1/1/2023");
var rates = new List<Rate>{
new Rate
{
RateId = rateId,
RateSheetId = rateSheetId,
RateStartDate = date
}
};
var evaluationIds = new List<int> { 10 };
var evaluationType = EvaluationTypes.Rule;
_mockRateRepository.Setup(x => x.FindByDateEvaluationIdsAndEvaluationTypeAsync(date, evaluationIds, evaluationType))
.ReturnsAsync(rates).Verifiable();
var results = await _service.GetByDateEvaluationIdAndEvaluationTypeAsync(date, evaluationIds, evaluationType);
Assert.NotNull(results);
Assert.NotEmpty(results);
var result = results.FirstOrDefault();
Assert.NotNull(result);
Assert.Equal(rateId, result.RateId);
_mockRateRepository.Verify();
}
[Fact]
public async void Rate_GetByDateEvaluationIdAndEvaluationTypeAsync_Success_NotFound()
{
var date = Convert.ToDateTime("1/1/2023");
List<Rate>? rates = null;
var evaluationIds = new List<int> { 10 };
var evaluationType = EvaluationTypes.Rule;
_mockRateRepository.Setup(x => x.FindByDateEvaluationIdsAndEvaluationTypeAsync(date, evaluationIds, evaluationType))
.ReturnsAsync(rates).Verifiable();
var result = await _service.GetByDateEvaluationIdAndEvaluationTypeAsync(date, evaluationIds, evaluationType);
Assert.NotNull(result);
Assert.Empty(result);
_mockRateRepository.Verify();
}
[Fact]
public void Rate_GetByDateEvaluationIdAndEvaluationTypeAsync_Failure_Exception()
{
_mockRateRepository.Setup(x => x.FindByDateEvaluationIdsAndEvaluationTypeAsync(It.IsAny<DateTime>(), It.IsAny<List<int>>(), It.IsAny<EvaluationTypes>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.GetByDateEvaluationIdAndEvaluationTypeAsync(It.IsAny<DateTime>(), It.IsAny<List<int>>(), It.IsAny<EvaluationTypes>()));
_mockRateRepository.Verify(x => x.FindByDateEvaluationIdsAndEvaluationTypeAsync(It.IsAny<DateTime>(), It.IsAny<List<int>>(), It.IsAny<EvaluationTypes>()), Times.Once);
}
[Fact]
public async void Rate_SaveAsync_Success()
{
var rate = new Rate
{
Value = 4.59m
};
var RateReturned = new Rate
{
RateId = 1,
Value = 4.9m
};
_mockRateRepository.Setup(x => x.AddAsync(rate))
.ReturnsAsync(RateReturned).Verifiable();
var result = await _service.SaveAsync(rate);
Assert.NotNull(result);
Assert.Equal(RateReturned.RateId, result.RateId);
Assert.Equal(RateReturned.Value, result.Value);
_mockRateRepository.Verify(x => x.AddAsync(It.IsAny<Rate>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
}
[Fact]
public void Rate_SaveAsync_Failure_ReturnedNull()
{
var rate = new Rate
{
Value = 4.59m
};
Rate? rateReturned = null;
_mockRateRepository.Setup(x => x.AddAsync(rate))
.ReturnsAsync(rateReturned).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.SaveAsync(rate));
_mockRateRepository.Verify(x => x.AddAsync(It.IsAny<Rate>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public void Rate_SaveAsync_Failure_Exception()
{
_mockRateRepository.Setup(x => x.AddAsync(It.IsAny<Rate>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.SaveAsync(It.IsAny<Rate>()));
_mockRateRepository.Verify(x => x.AddAsync(It.IsAny<Rate>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public async void Rate_SaveRangeAsync_Success()
{
var rates = new List<Rate>
{
new() { Value = 4.59m },
new() { Value = 4.9m },
new() { Value = 4m }
};
_mockRateRepository.Setup(x => x.AddRangeAsync(rates)).Verifiable();
await _service.SaveRangeAsync(rates);
_mockRateRepository.Verify(x =>
x.AddRangeAsync(It.IsAny<IEnumerable<Rate>>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
}
[Fact]
public void Rate_SaveRangeAsync_Failure_Exception()
{
_mockRateRepository.Setup(x => x.AddRangeAsync(It.IsAny<IEnumerable<Rate>>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.SaveRangeAsync(It.IsAny<IEnumerable<Rate>>()));
_mockRateRepository.Verify(x =>
x.AddRangeAsync(It.IsAny<IEnumerable<Rate>>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public async void Rate_UpdateAsync_Success()
{
var rate = new Rate
{
RateId = 1,
Value = 4.59m
};
_mockRateRepository.Setup(x => x.FindByIdAsync(rate.RateId))
.ReturnsAsync(rate).Verifiable();
var result = await _service.UpdateAsync(rate);
Assert.NotNull(result);
Assert.Equal(rate.RateId, result.RateId);
Assert.Equal(rate.Value, result.Value);
_mockRateRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once());
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
}
[Fact]
public void Rate_UpdateAsync_Failure_ReturnedNull()
{
var rate = new Rate
{
Value = 4.59m
};
Rate? rateReturned = null;
_mockRateRepository.Setup(x => x.FindByIdAsync(rate.RateId))
.ReturnsAsync(rateReturned).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.UpdateAsync(rate));
_mockRateRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public void Rate_UpdateAsync_Failure_Exception()
{
_mockRateRepository.Setup(x => x.FindByIdAsync(It.IsAny<int>()))
.ThrowsAsync(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.UpdateAsync(It.IsAny<Rate>()));
_mockRateRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public async void Rate_UpdateRangeAsync_Success()
{
var rates = new List<Rate>
{
new()
{
RateId = 1,
Value = 4.59m
},
new()
{
RateId = 2,
Value = 4.9m
},
new()
{
RateId = 3,
Value = 4m
}
};
_mockRateRepository.Setup(x => x.UpdateRange(rates)).Verifiable();
await _service.UpdateRangeAsync(rates);
_mockRateRepository.Verify(x => x.UpdateRange(It.IsAny<List<Rate>>()), Times.Once());
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
}
[Fact]
public void Rate_UpdateRangeAsync_Failure_Exception()
{
_mockRateRepository.Setup(x => x.UpdateRange(It.IsAny<List<Rate>>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.UpdateRangeAsync(It.IsAny<List<Rate>>()));
_mockRateRepository.Verify(x => x.UpdateRange(It.IsAny<List<Rate>>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public async void Rate_DeleteAsync_Success()
{
var rateId = 1;
var rate = new Rate
{
RateId = rateId,
Value = 4.59m
};
_mockRateRepository.Setup(x => x.FindByIdAsync(rateId))
.ReturnsAsync(rate).Verifiable();
_mockRateRepository.Setup(x => x.Remove(rate)).Verifiable();
await _service.DeleteAsync(rateId);
_mockRateRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once());
_mockRateRepository.Verify(x => x.Remove(It.IsAny<Rate>()), Times.Once());
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
}
[Fact]
public void Rate_DeleteAsync_Failure_ReturnedNull()
{
var rateId = 1;
Rate? rate = null;
_mockRateRepository.Setup(x => x.FindByIdAsync(rateId))
.ReturnsAsync(rate).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.DeleteAsync(rateId));
_mockRateRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once());
_mockRateRepository.Verify(x => x.Remove(It.IsAny<Rate>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public void Rate_DeleteAsync_Failure_Exception()
{
_mockRateRepository.Setup(x => x.FindByIdAsync(It.IsAny<int>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.DeleteAsync(It.IsAny<int>()));
_mockRateRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Once);
_mockRateRepository.Verify(x => x.Remove(It.IsAny<Rate>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public async void Rate_DeleteRangeAsync_Success()
{
var rateIds = new List<int>
{
1,
2,
3
};
var rates = new List<Rate>
{
new()
{
RateId = rateIds[0],
Value = 4.59m
},
new()
{
RateId = rateIds[1],
Value = 4.9m
},
new()
{
RateId = rateIds[2],
Value = 4m
}
};
_mockRateRepository.Setup(x => x.FindRangeByIdAsync(rateIds)).ReturnsAsync(rates).Verifiable();
_mockRateRepository.Setup(x => x.RemoveRange(rates)).Verifiable();
await _service.DeleteRangeAsync(rateIds);
_mockRateRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()), Times.Once());
_mockRateRepository.Verify(x => x.RemoveRange(It.IsAny<List<Rate>>()), Times.Once());
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once);
}
[Fact]
public void Rate_DeleteRangeAsync_Failure_ReturnedNull()
{
var rateIds = new List<int>
{
1,
2,
3
};
List<Rate>? rates = null;
_mockRateRepository.Setup(x => x.FindRangeByIdAsync(rateIds))
.ReturnsAsync(rates).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.DeleteRangeAsync(rateIds));
_mockRateRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()), Times.Once());
_mockRateRepository.Verify(x => x.RemoveRange(It.IsAny<List<Rate>>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
[Fact]
public void Rate_DeleteRangeAsync_Failure_Exception()
{
_mockRateRepository.Setup(x => x.RemoveRange(It.IsAny<List<Rate>>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () =>
await _service.DeleteRangeAsync(It.IsAny<List<int>>()));
_mockRateRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny<List<int>>()), Times.Once());
_mockRateRepository.Verify(x => x.RemoveRange(It.IsAny<List<Rate>>()), Times.Never);
_mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never);
}
}
@@ -0,0 +1,19 @@
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.LoanRateModels.Entities;
using LCU.API.Internal.LoanRateLib.Repositories;
using LCU.API.Internal.LoanRate.Services;
using LCU.Library.Internal.LcuClassPatterns.CrudTests.Tests;
namespace LCU.API.Internal.LoanRateTests.ServiceTests;
public class RateSheetCellServiceTest : CrudServiceTest<RateSheetCell>
{
private readonly IRateSheetCellService _service;
private readonly Mock<IRateSheetCellRepository> _mockRateSheetCellRepository;
public RateSheetCellServiceTest()
{
_mockRateSheetCellRepository = new Mock<IRateSheetCellRepository>();
_service = new RateSheetCellService(_mockRateSheetCellRepository.Object);
}
}
@@ -0,0 +1,190 @@
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.LoanRateModels.Entities;
using LCU.API.Internal.LoanRateLib.Repositories;
using LCU.API.Internal.LoanRate.Services;
using LCU.Library.Internal.LcuClassPatterns.CrudTests.Tests;
using LCU.Library.Internal.LcuClassPatterns.CrudTests.Utilities;
using LCU.Library.Internal.LoanRateModels.Enums;
namespace LCU.API.Internal.LoanRateTests.ServiceTests;
public class RateSheetServiceTest : CrudServiceTest<RateSheet>
{
private readonly IRateSheetService _service;
private readonly Mock<IRateSheetRepository> _mockRateSheetRepository;
public RateSheetServiceTest()
{
_mockRateSheetRepository = new Mock<IRateSheetRepository>();
_service = new RateSheetService(_mockRateSheetRepository.Object);
}
[Fact]
public async void RateSheet_GetIncludeAllAsync_Success()
{
var rateSheets = new List<RateSheet>
{
new ()
{
RateSheetId = (int)typeof(int).GetRandomValue(),
RateType = (RateTypes)typeof(RateTypes).GetRandomValue(),
Rates = new List<Rate>
{
new() { RateId = (int)typeof(int).GetRandomValue() },
new() { RateId = (int)typeof(int).GetRandomValue() },
new() { RateId = (int)typeof(int).GetRandomValue() }
}
}
};
_mockRateSheetRepository.Setup(x => x.FindIncludeAllAsync())
.ReturnsAsync(rateSheets).Verifiable();
var result = (await _service.GetIncludeAllAsync())?.ToList();
Assert.NotNull(result);
Assert.Equal(rateSheets.First().RateSheetId, result.First().RateSheetId);
Assert.Equal(rateSheets.Count, result.Count);
_mockRateSheetRepository.Verify();
}
[Fact]
public async void RateSheet_GetIncludeAllAsync_Success_NotFound()
{
List<RateSheet>? rateSheets = null;
_mockRateSheetRepository.Setup(x => x.FindIncludeAllAsync())
.ReturnsAsync(rateSheets).Verifiable();
var result = await _service.GetIncludeAllAsync();
Assert.NotNull(result);
Assert.Empty(result);
_mockRateSheetRepository.Verify();
}
[Fact]
public void Rate_GetAsync_Failure_Exception()
{
_mockRateSheetRepository.Setup(x => x.FindAsync())
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.GetAsync());
_mockRateSheetRepository.Verify(x => x.FindAsync(), Times.Once);
}
[Fact]
public async void RateSheet_GetRatesByRateTypeAsync_Success()
{
var rateType = (RateTypes)typeof(RateTypes).GetRandomValue();
var rateSheet = new RateSheet
{
RateSheetId = (int)typeof(int).GetRandomValue(),
RateType = (RateTypes)typeof(RateTypes).GetRandomValue(),
Rates = new List<Rate>
{
new() { RateId = (int)typeof(int).GetRandomValue() },
new() { RateId = (int)typeof(int).GetRandomValue() },
new() { RateId = (int)typeof(int).GetRandomValue() }
}
};
_mockRateSheetRepository.Setup(x => x.FindRatesByRateType(rateType))
.ReturnsAsync(rateSheet.Rates).Verifiable();
var result = (await _service.GetRatesByRateTypeAsync(rateType))?.ToList();
Assert.NotNull(result);
Assert.Equal(rateSheet.Rates.First().RateId, result.First().RateId);
Assert.Equal(rateSheet.Rates.Count, result.Count);
_mockRateSheetRepository.Verify();
}
[Fact]
public async void RateSheet_GetRatesByRateTypeAsync_Success_NotFound()
{
List<Rate>? rates = null;
_mockRateSheetRepository.Setup(x => x.FindRatesByRateType(It.IsAny<RateTypes>()))
.ReturnsAsync(rates).Verifiable();
var result = await _service.GetRatesByRateTypeAsync(It.IsAny<RateTypes>());
Assert.NotNull(result);
Assert.Empty(result);
_mockRateSheetRepository.Verify();
}
[Fact]
public void RateSheet_GetRatesByRateTypeAsync_Failure_Exception()
{
_mockRateSheetRepository.Setup(x => x.FindRatesByRateType(It.IsAny<RateTypes>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.GetRatesByRateTypeAsync(It.IsAny<RateTypes>()));
_mockRateSheetRepository.Verify(x => x.FindRatesByRateType(It.IsAny<RateTypes>()), Times.Once);
}
[Fact]
public async void RateSheet_GetRatesByDateAndRateTypeAsync_Success()
{
var effectiveDate = (DateTime)typeof(DateTime).GetRandomValue();
var rateType = (RateTypes)typeof(RateTypes).GetRandomValue();
var rateSheet = new RateSheet
{
RateSheetId = (int)typeof(int).GetRandomValue(),
RateType = (RateTypes)typeof(RateTypes).GetRandomValue(),
Rates = new List<Rate>
{
new()
{
RateId = (int)typeof(int).GetRandomValue(),
RateStartDate = effectiveDate.AddDays(-2),
RateEndDate = effectiveDate.AddDays(2)
},
new()
{
RateId = (int)typeof(int).GetRandomValue(),
RateStartDate = effectiveDate.AddDays(-1),
RateEndDate = effectiveDate.AddDays(3)
},
new()
{
RateId = (int)typeof(int).GetRandomValue(),
RateStartDate = effectiveDate.AddDays(-5),
RateEndDate = effectiveDate.AddDays(2)
}
}
};
_mockRateSheetRepository.Setup(x => x.FindRatesByDateAndRateType(effectiveDate, rateType))
.ReturnsAsync(rateSheet.Rates).Verifiable();
var result = (await _service.GetRatesByDateAndRateTypeAsync(effectiveDate, rateType))?.ToList();
Assert.NotNull(result);
Assert.Equal(rateSheet.Rates.First().RateId, result.First().RateId);
Assert.Equal(rateSheet.Rates.Count, result.Count);
_mockRateSheetRepository.Verify();
}
[Fact]
public async void RateSheet_GetRatesByDateAndRateTypeAsync_Success_NotFound()
{
List<Rate>? rates = null;
_mockRateSheetRepository.Setup(x => x.FindRatesByDateAndRateType(It.IsAny<DateTime>(), It.IsAny<RateTypes>()))
.ReturnsAsync(rates).Verifiable();
var result = await _service.GetRatesByDateAndRateTypeAsync(It.IsAny<DateTime>(), It.IsAny<RateTypes>());
Assert.NotNull(result);
Assert.Empty(result);
_mockRateSheetRepository.Verify();
}
[Fact]
public void RateSheet_GetRatesByDateAndRateTypeAsync_Failure_Exception()
{
_mockRateSheetRepository.Setup(x => x.FindRatesByDateAndRateType(It.IsAny<DateTime>(), It.IsAny<RateTypes>()))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.GetRatesByDateAndRateTypeAsync(It.IsAny<DateTime>(), It.IsAny<RateTypes>()));
_mockRateSheetRepository.Verify(x => x.FindRatesByDateAndRateType(It.IsAny<DateTime>(), It.IsAny<RateTypes>()), Times.Once);
}
}
@@ -0,0 +1,317 @@
using LCU.Library.Internal.LoanRateModels.Entities;
using LCU.API.Internal.LoanRateLib.Repositories;
using LCU.API.Internal.LoanRate.Services;
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.LcuClassPatterns.CrudTests.Tests;
using LCU.Library.Internal.LcuClassPatterns.CrudTests.Utilities;
using LCU.Library.Internal.LoanRateModels.Requests;
using LCU.Library.Internal.TypeExtensions.ObjectExtensions;
namespace LCU.API.Internal.LoanRateTests.ServiceTests;
public class RateUploadInfoServiceTest : CrudServiceTest<RateUploadInfo>
{
private readonly Mock<IRateUploadInfoRepository> _mockRateUploadInfoRepository = new();
private readonly Mock<IRateService> _mockRateService = new();
private readonly IRateUploadInfoService _service;
public RateUploadInfoServiceTest()
{
_service = new RateUploadInfoService(_mockRateUploadInfoRepository.Object, _mockRateService.Object);
}
[Fact]
public async void RateUploadInfo_GetLatest_Success()
{
var version = (int)typeof(int).GetRandomValue();
var dateNow = DateTime.Now;
var rateUploadInfo = new RateUploadInfo
{
RateUploadInfoId = (int)typeof(int).GetRandomValue(),
EffectiveDate = dateNow,
Version = version
};
_mockRateUploadInfoRepository.Setup(x => x.FindLatestAsync()).ReturnsAsync(rateUploadInfo).Verifiable();
var result = await _service.GetLatestAsync();
Assert.NotNull(result);
Assert.Equal(rateUploadInfo.Version, result.Version);
_mockRateUploadInfoRepository.Verify(x => x.FindLatestAsync(), Times.Once);
}
[Fact]
public async void RateUploadInfo_GetLatest_Success_NotFound()
{
RateUploadInfo? previousRateUploadInfo = null;
_mockRateUploadInfoRepository.Setup(x => x.FindLatestAsync())
.ReturnsAsync(previousRateUploadInfo).Verifiable();
var result = await _service.GetLatestAsync();
Assert.Null(result);
_mockRateUploadInfoRepository.Verify(x => x.FindLatestAsync(), Times.Once);
}
[Fact]
public void RateUploadInfo_GetLatest_Failure_Exception()
{
_mockRateUploadInfoRepository.Setup(x => x.FindLatestAsync())
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.GetLatestAsync());
_mockRateUploadInfoRepository.Verify(x => x.FindAsync(), Times.Never);
}
[Fact]
public async void RateUploadInfo_GetByVersion_Success()
{
var version = (int)typeof(int).GetRandomValue();
var effectiveDate = (DateTime)typeof(DateTime).GetRandomValue();
var rateUploadInfo = new RateUploadInfo
{
RateUploadInfoId = (int)typeof(int).GetRandomValue(),
Version = version
};
_mockRateUploadInfoRepository.Setup(x => x.FindByVersionAsync(version, effectiveDate))
.ReturnsAsync(rateUploadInfo).Verifiable();
var result = await _service.GetByVersionAsync(version, effectiveDate);
Assert.NotNull(result);
Assert.Equal(rateUploadInfo.RateUploadInfoId, result.RateUploadInfoId);
Assert.Equal(rateUploadInfo.Version, result.Version);
_mockRateUploadInfoRepository.Verify(x => x.FindByVersionAsync(version, effectiveDate), Times.Once);
}
[Fact]
public async void RateUploadInfo_GetByVersion_Success_NotFound()
{
var version = (int)typeof(int).GetRandomValue();
var effectiveDate = (DateTime)typeof(DateTime).GetRandomValue();
RateUploadInfo rateUploadInfo = null;
_mockRateUploadInfoRepository.Setup(x => x.FindByVersionAsync(version, effectiveDate))
.ReturnsAsync(rateUploadInfo).Verifiable();
var result = await _service.GetByVersionAsync(version, effectiveDate);
Assert.Null(result);
_mockRateUploadInfoRepository.Verify(x => x.FindByVersionAsync(version, effectiveDate), Times.Once);
}
[Fact]
public void RateUploadInfo_GetByVersion_Failure_Exception()
{
var version = (int)typeof(int).GetRandomValue();
var effectiveDate = (DateTime)typeof(DateTime).GetRandomValue();
RateUploadInfo rateUploadInfo = null;
_mockRateUploadInfoRepository.Setup(x => x.FindByVersionAsync(version, effectiveDate))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.GetByVersionAsync(version, effectiveDate));
_mockRateUploadInfoRepository.Verify(x => x.FindAsync(), Times.Never);
}
[Fact]
public async void RateUploadInfo_GetLatestVersionByDate_Success()
{
var version = (int)typeof(int).GetRandomValue();
var dateNow = DateTime.Now;
var rateUploadInfo = new RateUploadInfo
{
RateUploadInfoId = (int)typeof(int).GetRandomValue(),
EffectiveDate = dateNow,
Version = version
};
_mockRateUploadInfoRepository.Setup(x => x.FindLatestVersionOnDate(dateNow)).ReturnsAsync(rateUploadInfo).Verifiable();
var result = await _service.GetLatestVersionOnDate(dateNow);
Assert.NotNull(result);
Assert.Equal(rateUploadInfo.Version, result.Version);
_mockRateUploadInfoRepository.Verify(x => x.FindLatestVersionOnDate(dateNow), Times.Once);
}
[Fact]
public async void RateUploadInfo_GetLatestVersionByDate_Success_NotFound()
{
RateUploadInfo? previousRateUploadInfo = null;
var dateNow = DateTime.Now;
_mockRateUploadInfoRepository.Setup(x => x.FindLatestVersionOnDate(dateNow))
.ReturnsAsync(previousRateUploadInfo).Verifiable();
var result = await _service.GetLatestVersionOnDate(dateNow);
Assert.Null(result);
_mockRateUploadInfoRepository.Verify(x => x.FindLatestVersionOnDate(dateNow), Times.Once);
}
[Fact]
public void RateUploadInfo_GetLatestVersionByDate_Failure_Exception()
{
var dateNow = DateTime.Now;
_mockRateUploadInfoRepository.Setup(x => x.FindLatestVersionOnDate(dateNow))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.GetLatestVersionOnDate(dateNow));
_mockRateUploadInfoRepository.Verify(x => x.FindAsync(), Times.Never);
}
[Fact]
public async void RateUploadInfo_ComplexSave_Success()
{
var effectiveDate = (DateTime)typeof(DateTime).GetRandomValue();
var version = (int)typeof(int).GetRandomValue();
var rates = new List<Rate>
{
new() { RateId = (int)typeof(int).GetRandomValue() },
new() { RateId = (int)typeof(int).GetRandomValue() },
new() { RateId = (int)typeof(int).GetRandomValue() }
};
var request = new RateUploadInfoRequest
{
EffectiveDate = effectiveDate,
Rates = rates
};
var originalRateUploadInfo = new RateUploadInfo
{
RateUploadInfoId = (int)typeof(int).GetRandomValue(),
Version = version,
EffectiveDate = effectiveDate.AddDays(-25)
};
var rateUploadInfo = new RateUploadInfo
{
RateUploadInfoId = (int)typeof(int).GetRandomValue(),
Version = version + 1,
EffectiveDate = effectiveDate,
Filename = "Complex Save Test",
ClosedRates = rates,
Rates = rates.DeepCopy()
};
_mockRateUploadInfoRepository.Setup(x => x.FindLatestVersionOnDate(effectiveDate))
.ReturnsAsync(originalRateUploadInfo).Verifiable();
_mockRateUploadInfoRepository.Setup(x => x.AddAsync(It.IsAny<RateUploadInfo>()))
.ReturnsAsync(rateUploadInfo).Verifiable();
var result = await _service.ComplexSave(request);
Assert.NotNull(result);
Assert.Equal(rateUploadInfo.RateUploadInfoId, result.RateUploadInfoId);
Assert.Equal(rateUploadInfo.Version, result.Version);
Assert.Equal(rateUploadInfo.Rates.Count, result.ClosedRates?.Count);
_mockRateUploadInfoRepository.Verify(x => x.FindLatestVersionOnDate(effectiveDate), Times.Once);
_mockRateUploadInfoRepository.Verify(x => x.AddAsync(It.IsAny<RateUploadInfo>()), Times.Once);
}
[Fact]
public void RateUploadInfo_ComplexSave_Failure_Exception()
{
var effectiveDate = (DateTime)typeof(DateTime).GetRandomValue();
RateUploadInfoRequest request = null;
_mockRateUploadInfoRepository.Setup(x => x.FindLatestVersionOnDate(effectiveDate))
.Throws(new Exception("Test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(async () => await _service.ComplexSave(request));
_mockRateUploadInfoRepository.Verify(x => x.AddAsync(It.IsAny<RateUploadInfo>()), Times.Never);
}
[Fact]
public async void RateUploadInfo_ComplexDelete_Success()
{
var closedRates = new List<Rate>
{
new () { RateId = (int)typeof(int).GetRandomValue() },
new () { RateId = (int)typeof(int).GetRandomValue() },
new() { RateId = (int)typeof(int).GetRandomValue() }
};
var rateUploadInfo = new RateUploadInfo
{
RateUploadInfoId = (int)typeof(int).GetRandomValue(),
Rates = new List<Rate>
{
new () { RateId = (int)typeof(int).GetRandomValue() },
new () { RateId = (int)typeof(int).GetRandomValue() },
new() { RateId = (int)typeof(int).GetRandomValue() }
}
};
_mockRateUploadInfoRepository.Setup(x => x.FindLatestAsync())
.ReturnsAsync(rateUploadInfo).Verifiable();
_mockRateService.Setup(x => x.GetByClosingRateUploadInfoIdAsync(rateUploadInfo.RateUploadInfoId))
.ReturnsAsync(closedRates).Verifiable();
_mockRateUploadInfoRepository.Setup(x => x.FindByIdAsync(rateUploadInfo.RateUploadInfoId))
.ReturnsAsync(rateUploadInfo).Verifiable();
await _service.ComplexDelete(rateUploadInfo.RateUploadInfoId);
_mockRateUploadInfoRepository.Verify(x => x.FindLatestAsync(), Times.Once);
_mockRateService.Verify(x => x.GetByClosingRateUploadInfoIdAsync(rateUploadInfo.RateUploadInfoId), Times.Once);
_mockRateService.Verify(x => x.UpdateRangeAsync(It.IsAny<List<Rate>>()), Times.Once);
_mockRateUploadInfoRepository.Verify(x => x.FindByIdAsync(rateUploadInfo.RateUploadInfoId), Times.Once);
_mockRateUploadInfoRepository.Verify(x => x.RemoveAsync(rateUploadInfo), Times.Once);
}
[Fact]
public async void RateUploadInfo_ComplexDelete_Success_NoClosedRates()
{
var closedRates = new List<Rate>();
var rateUploadInfo = new RateUploadInfo
{
RateUploadInfoId = (int)typeof(int).GetRandomValue(),
Rates = new List<Rate>
{
new () { RateId = (int)typeof(int).GetRandomValue() },
new () { RateId = (int)typeof(int).GetRandomValue() },
new() { RateId = (int)typeof(int).GetRandomValue() }
}
};
_mockRateUploadInfoRepository.Setup(x => x.FindLatestAsync())
.ReturnsAsync(rateUploadInfo).Verifiable();
_mockRateService.Setup(x => x.GetByClosingRateUploadInfoIdAsync(rateUploadInfo.RateUploadInfoId))
.ReturnsAsync(closedRates).Verifiable();
_mockRateUploadInfoRepository.Setup(x => x.FindByIdAsync(rateUploadInfo.RateUploadInfoId))
.ReturnsAsync(rateUploadInfo).Verifiable();
await _service.ComplexDelete(rateUploadInfo.RateUploadInfoId);
_mockRateUploadInfoRepository.Verify(x => x.FindLatestAsync(), Times.Once);
_mockRateService.Verify(x => x.GetByClosingRateUploadInfoIdAsync(rateUploadInfo.RateUploadInfoId), Times.Once);
_mockRateService.Verify(x => x.UpdateRangeAsync(It.IsAny<List<Rate>>()), Times.Never);
_mockRateUploadInfoRepository.Verify(x => x.FindByIdAsync(rateUploadInfo.RateUploadInfoId), Times.Once);
_mockRateUploadInfoRepository.Verify(x => x.RemoveAsync(rateUploadInfo), Times.Once);
}
[Fact]
public async void RateUploadInfo_ComplexDelete_Failure_Exception()
{
var rateUploadInfoId = (int)typeof(int).GetRandomValue();
_mockRateUploadInfoRepository.Setup(x => x.FindLatestAsync())
.Throws(new Exception("Test")).Verifiable();
await Assert.ThrowsAsync<ServiceException>(async () => await _service.ComplexDelete(rateUploadInfoId));
_mockRateUploadInfoRepository.Verify(x => x.FindLatestAsync(), Times.Once);
_mockRateUploadInfoRepository.Verify(x => x.FindPreviousVersion(It.IsAny<RateUploadInfo>()), Times.Never);
_mockRateUploadInfoRepository.Verify(x => x.FindByIdAsync(It.IsAny<int>()), Times.Never);
_mockRateUploadInfoRepository.Verify(x => x.RemoveAsync(It.IsAny<RateUploadInfo>()), Times.Never);
}
}
@@ -0,0 +1,431 @@
using LCU.API.Internal.LoanRate.Services;
using LCU.API.Internal.LoanRate.Services.LoanRateOperationServices;
using LCU.API.Internal.LoanRate.Services.ValidateLoanRateServices;
using LCU.Library.Internal.LcuEvaluationModels.Entities;
using LCU.Library.Internal.LcuEvaluationModels.Enums;
using LCU.Library.Internal.LcuEvaluation.Services;
using LCU.Library.Internal.LoanRateModels.Entities;
using LCU.Library.Internal.LoanRateModels.Requests;
using LCU.Library.Internal.LcuEvaluation.Services.EvaluationServices;
namespace LCU.API.Internal.LoanRateTests.ServiceTests.ValidateLoanRateServicesTests;
public class ValidateRateEvaluationsServiceTest
{
private readonly ValidateRateEvaluationsService _validateRateEvaluationsService;
private readonly Mock<IEvaluationDetailService> _mockEvaluationDetailService;
private readonly Mock<IRateService> _mockRateService;
private readonly Mock<IRunRuleService> _mockRunEvaluationService;
private readonly Mock<IRateFinderService> _mockRateFinderService;
public ValidateRateEvaluationsServiceTest()
{
_mockEvaluationDetailService = new Mock<IEvaluationDetailService>();
_mockRateService = new Mock<IRateService>();
_mockRunEvaluationService = new Mock<IRunRuleService>();
_mockRateFinderService = new Mock<IRateFinderService>();
_validateRateEvaluationsService = new ValidateRateEvaluationsService(_mockEvaluationDetailService.Object,
_mockRateService.Object,
_mockRunEvaluationService.Object,
_mockRateFinderService.Object);
}
[Fact]
public async Task ValidateRatePassesEvaluation_True()
{
var rateRequest = new RateRequest();
var evaluationBuilder1 = new EvaluationDetail()
{
EvaluationDetailId = 1,
Description = "CreditScore Greater Than Or Equal 740.",
EvaluationParameters = new List<EvaluationParameter>()
{
new (0, ParameterTypes.Variable, "RateRequest.CreditScore"),
new (1, ParameterTypes.GreaterThanOrEqual, ""),
new (2, ParameterTypes.TextInput, "740")
}
};
_mockEvaluationDetailService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(evaluationBuilder1).Verifiable();
var evaluationsReturned = new List<EvaluationDetail>
{
new EvaluationDetail
{
EvaluationDetailId = 1
},
new EvaluationDetail
{
EvaluationDetailId = 2
}
};
_mockRunEvaluationService.Setup(x => x.ValidateRequestRules(rateRequest, It.IsAny<List<EvaluationDetail>>())).Returns(evaluationsReturned).Verifiable();
var rate1 = new Rate()
{
RateId = 1,
Value = 5.49M,
RateEvaluations = new List<RateEvaluation>()
{
new RateEvaluation()
{
RateEvaluationId = 1,
RateId = 1,
EvaluationDetailId = 1,
},
new RateEvaluation()
{
RateEvaluationId = 2,
RateId = 1,
EvaluationDetailId = 2,
}
}
};
_mockRateService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(rate1).Verifiable();
var result = await _validateRateEvaluationsService.ValidateRatePassesEvaluation(rateRequest, 1, 1);
Assert.True(result);
_mockEvaluationDetailService.Verify(x => x.GetByIdAsync(1), Times.Once);
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
_mockRateService.Verify(x => x.GetByIdAsync(1), Times.Once);
}
[Fact]
public async Task ValidateRatePassesEvaluation_False()
{
var rateRequest = new RateRequest();
var evaluationBuilder1 = new EvaluationDetail()
{
EvaluationDetailId = 1,
Description = "CreditScore Greater Than Or Equal 740.",
EvaluationParameters = new List<EvaluationParameter>()
{
new EvaluationParameter(0, ParameterTypes.Variable, "RateRequest.CreditScore"),
new EvaluationParameter(1, ParameterTypes.GreaterThanOrEqual, ""),
new EvaluationParameter(2, ParameterTypes.TextInput, "740")
}
};
_mockEvaluationDetailService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(evaluationBuilder1).Verifiable();
var evaluationsReturned = new List<EvaluationDetail>();
_mockRunEvaluationService.Setup(x => x.ValidateRequestRules(rateRequest, It.IsAny<List<EvaluationDetail>>())).Returns(evaluationsReturned).Verifiable();
var rate1 = new Rate()
{
RateId = 3,
Value = 5.49M,
RateEvaluations = new List<RateEvaluation>()
{
new RateEvaluation()
{
RateEvaluationId = 1,
RateId = 1,
EvaluationDetailId = 1,
},
new RateEvaluation()
{
RateEvaluationId = 2,
RateId = 1,
EvaluationDetailId = 3,
}
}
};
_mockRateService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(rate1).Verifiable();
var result = await _validateRateEvaluationsService.ValidateRatePassesEvaluation(rateRequest, 1, 1);
Assert.False(result);
_mockEvaluationDetailService.Verify(x => x.GetByIdAsync(1), Times.Once);
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
_mockRateService.Verify(x => x.GetByIdAsync(1), Times.Once);
}
[Fact]
public async Task ValidateRatePassesEvaluations_True()
{
var rate1 = new Rate()
{
RateId = 3,
Value = 5.49M,
RateEvaluations = new List<RateEvaluation>()
{
new RateEvaluation()
{
RateEvaluationId = 1,
RateId = 1,
EvaluationDetailId = 3,
},
new RateEvaluation()
{
RateEvaluationId = 2,
RateId = 1,
EvaluationDetailId = 4,
}
}
};
var applicationDate = DateTime.Now;
_mockRateService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(rate1).Verifiable();
var evaluationIds = rate1.RateEvaluations.Select(rateEvaluation => rateEvaluation.EvaluationDetailId).ToList();
_mockEvaluationDetailService.Setup(x => x.GetActiveByEvaluationTypeAndIdsAsync(applicationDate, EvaluationTypes.Rule, evaluationIds)).ReturnsAsync(GetFakeEvaluations()).Verifiable();
var evaluationsReturned = new List<EvaluationDetail>
{
new EvaluationDetail
{
EvaluationDetailId = 1
},
new EvaluationDetail
{
EvaluationDetailId = 2
}
};
var rateRequest = new RateRequest { ApplicationDate = applicationDate };
_mockRunEvaluationService.Setup(x => x.ValidateRequestRules(rateRequest, It.IsAny<List<EvaluationDetail>>())).Returns(evaluationsReturned).Verifiable();
var rateReturn = ( new Rate { RateId = 1 }, string.Empty );
_mockRateFinderService.Setup(x => x.DetermineRate(applicationDate, evaluationsReturned)).ReturnsAsync(rateReturn).Verifiable();
var result = await _validateRateEvaluationsService.ValidateRatePassesEvaluations(rateRequest, 1);
Assert.True(result);
_mockRateService.Verify(x => x.GetByIdAsync(1), Times.Once);
_mockEvaluationDetailService.Verify(x => x.GetActiveByEvaluationTypeAndIdsAsync(It.IsAny<DateTime>(), It.IsAny<EvaluationTypes>(), It.IsAny<List<int>>()), Times.Once);
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
_mockRateFinderService.Verify(x => x.DetermineRate(It.IsAny<DateTime>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
}
[Fact]
public async Task ValidateRatePassesEvaluations_False()
{
var applicationDate = DateTime.Now;
var rateRequest = new RateRequest() { ApplicationDate = applicationDate };
var rate1 = new Rate()
{
RateId = 3,
Value = 5.49M,
RateStartDate = applicationDate.AddDays(-50),
RateEvaluations = new List<RateEvaluation>()
{
new RateEvaluation()
{
RateEvaluationId = 1,
RateId = 1,
EvaluationDetailId = 3,
},
new RateEvaluation()
{
RateEvaluationId = 2,
RateId = 1,
EvaluationDetailId = 4,
}
}
};
_mockRateService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(rate1).Verifiable();
var evaluationIds = rate1.RateEvaluations.Select(rateEvaluation => rateEvaluation.EvaluationDetailId).ToList();
_mockEvaluationDetailService.Setup(x => x.GetActiveByEvaluationTypeAndIdsAsync(rateRequest.ApplicationDate, EvaluationTypes.Rule, evaluationIds)).ReturnsAsync(GetFakeEvaluations()).Verifiable();
var evaluationsReturned = new List<EvaluationDetail>
{
new EvaluationDetail
{
EvaluationDetailId = 1,
StartDate = applicationDate.AddDays(-10)
},
new EvaluationDetail
{
EvaluationDetailId = 2,
StartDate = applicationDate.AddDays(-10)
}
};
_mockRunEvaluationService.Setup(x => x.ValidateRequestRules(rateRequest, It.IsAny<List<EvaluationDetail>>())).Returns(evaluationsReturned).Verifiable();
var rateReturn = ( new Rate { RateId = 100 }, string.Empty );
_mockRateFinderService.Setup(x => x.DetermineRate(applicationDate, evaluationsReturned)).ReturnsAsync(rateReturn).Verifiable();
var result = await _validateRateEvaluationsService.ValidateRatePassesEvaluations(rateRequest, 1);
Assert.False(result);
_mockRateService.Verify(x => x.GetByIdAsync(1), Times.Once);
_mockEvaluationDetailService.Verify(x => x.GetActiveByEvaluationTypeAndIdsAsync(It.IsAny<DateTime>(), It.IsAny<EvaluationTypes>(), It.IsAny<List<int>>()), Times.Once);
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
_mockRateFinderService.Verify(x => x.DetermineRate(It.IsAny<DateTime>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
}
[Fact]
public async Task ValidateRatePassesEvaluations_False_NoEvaluations()
{
var rate1 = new Rate()
{
RateId = 3,
Value = 5.49M,
RateEvaluations = new List<RateEvaluation>()
{
new RateEvaluation()
{
RateEvaluationId = 1,
RateId = 1,
EvaluationDetailId = 3,
},
new RateEvaluation()
{
RateEvaluationId = 2,
RateId = 1,
EvaluationDetailId = 4,
}
}
};
_mockRateService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(rate1).Verifiable();
_mockEvaluationDetailService.Setup(x => x.GetActiveByEvaluationTypeAndIdsAsync(It.IsAny<DateTime>(), EvaluationTypes.Rule, It.IsAny<List<int>>())).ReturnsAsync(new List<EvaluationDetail>()).Verifiable();
var rateRequest = new RateRequest();
var result = await _validateRateEvaluationsService.ValidateRatePassesEvaluations(rateRequest, 1);
Assert.False(result);
_mockRateService.Verify(x => x.GetByIdAsync(1), Times.Once);
_mockEvaluationDetailService.Verify(x => x.GetActiveByEvaluationTypeAndIdsAsync(It.IsAny<DateTime>(), It.IsAny<EvaluationTypes>(), It.IsAny<List<int>>()), Times.Once);
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Never);
_mockRateFinderService.Verify(x => x.DetermineRate(It.IsAny<DateTime>(), It.IsAny<List<EvaluationDetail>>()), Times.Never);
}
public static List<EvaluationDetail> GetFakeEvaluations()
{
var date = DateTime.Now;
var evaluationBuilder1 = new EvaluationDetail()
{
EvaluationDetailId = 1,
Description = "CreditScore Greater Than Or Equal 740.",
StartDate = DateTime.Now.AddDays(-10),
EvaluationParameters = new List<EvaluationParameter>()
{
new EvaluationParameter(0, ParameterTypes.Variable, "RateRequest.CreditScore"),
new EvaluationParameter(1, ParameterTypes.GreaterThanOrEqual, ""),
new EvaluationParameter(2, ParameterTypes.TextInput, "740")
}
};
var evaluationBuilder2 = new EvaluationDetail()
{
EvaluationDetailId = 2,
Description = "Model Year Greater than or Equal 2022.",
StartDate = DateTime.Now.AddDays(-20),
EvaluationParameters = new List<EvaluationParameter>()
{
new EvaluationParameter(0, ParameterTypes.Variable, "RateRequest.ModelYear"),
new EvaluationParameter(1, ParameterTypes.GreaterThanOrEqual, ""),
new EvaluationParameter(2, ParameterTypes.TextInput, "2022")
}
};
var evaluationBuilder3 = new EvaluationDetail()
{
EvaluationDetailId = 3,
Description = "Model Year Equal 2021.",
StartDate = DateTime.Now.AddDays(-10),
EvaluationParameters = new List<EvaluationParameter>()
{
new EvaluationParameter(0, ParameterTypes.Variable, "RateRequest.ModelYear"),
new EvaluationParameter(1, ParameterTypes.Equal, ""),
new EvaluationParameter(2, ParameterTypes.TextInput, "2021")
}
};
var evaluationBuilder4 = new EvaluationDetail()
{
EvaluationDetailId = 4,
StartDate = DateTime.Now.AddDays(-15),
Description = "CreditScore Greater Than Or Equal 700 AND Less Than Or Equal 739.",
EvaluationParameters = new List<EvaluationParameter>()
{
new EvaluationParameter(0, ParameterTypes.ParenthesesStart, ""),
new EvaluationParameter(1, ParameterTypes.Variable, "RateRequest.CreditScore"),
new EvaluationParameter(2, ParameterTypes.GreaterThanOrEqual, ""),
new EvaluationParameter(3, ParameterTypes.TextInput, "700"),
new EvaluationParameter(4, ParameterTypes.ParenthesesEnd, ""),
new EvaluationParameter(5, ParameterTypes.And, ""),
new EvaluationParameter(6, ParameterTypes.ParenthesesStart, ""),
new EvaluationParameter(7, ParameterTypes.Variable, "RateRequest.CreditScore"),
new EvaluationParameter(8, ParameterTypes.LessThanOrEqual, ""),
new EvaluationParameter(9, ParameterTypes.TextInput, "739"),
new EvaluationParameter(10, ParameterTypes.ParenthesesEnd, "")
}
};
var evaluations = new List<EvaluationDetail>() { evaluationBuilder1, evaluationBuilder2, evaluationBuilder3, evaluationBuilder4 };
return evaluations;
}
public static List<Rate> GetFakeRates()
{
var rate1 = new Rate()
{
RateId = 1,
Value = 5.49M,
RateEvaluations = new List<RateEvaluation>()
{
new RateEvaluation()
{
RateEvaluationId = 1,
RateId = 1,
EvaluationDetailId = 1,
},
new RateEvaluation()
{
RateEvaluationId = 2,
RateId = 1,
EvaluationDetailId = 2,
}
}
};
var rate2 = new Rate()
{
RateId = 2,
Value = 5.50M,
RateEvaluations = new List<RateEvaluation>()
{
new RateEvaluation()
{
RateEvaluationId = 3,
RateId = 2,
EvaluationDetailId = 1,
},
new RateEvaluation()
{
RateEvaluationId = 4,
RateId = 2,
EvaluationDetailId = 3,
}
}
};
var rate3 = new Rate()
{
RateId = 3,
Value = 5.51M,
RateEvaluations = new List<RateEvaluation>()
{
new RateEvaluation()
{
RateEvaluationId = 5,
RateId = 3,
EvaluationDetailId = 4,
}
}
};
var rates = new List<Rate>() { rate1, rate2, rate3 };
return rates;
}
}