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 _mockRateEvaluationService; private readonly Mock _mockEvaluationDetailService; private readonly IComplexEvaluationDetailService _service; public ComplexEvaluationDetailServiceTest() { _mockRateEvaluationService = new Mock(); _mockEvaluationDetailService = new Mock(); _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())) .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()), Times.Once); } [Fact] public async void ComplexEvaluationDetail_UpdateComplexAsync_Success_NotFound() { EvaluationDetail? evaluationDetail = null; _mockEvaluationDetailService.Setup(x => x.UpdateComplexAsync(It.IsAny())) .ReturnsAsync(evaluationDetail).Verifiable(); var result = await _service.UpdateComplexAsync(evaluationDetail); Assert.Null(result); _mockEvaluationDetailService.Verify(x => x.UpdateComplexAsync(It.IsAny()), Times.Once); } [Fact] public void ComplexEvaluationDetail_UpdateComplexAsync_Failure_Exception() { var evaluationDetail = new EvaluationDetail(); _mockEvaluationDetailService.Setup(x => x.UpdateComplexAsync(It.IsAny())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.UpdateComplexAsync(evaluationDetail)); _mockEvaluationDetailService.Verify(x => x.UpdateComplexAsync(It.IsAny()), 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())) .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()), 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 { 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())) .ReturnsAsync(newEvaluationDetail).Verifiable(); _mockRateEvaluationService.Setup(x => x.GetRangeByEvaluationDetailIdAsync(It.IsAny())) .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()), Times.Once); _mockRateEvaluationService.Verify(x => x.GetRangeByEvaluationDetailIdAsync(It.IsAny()), Times.Once); _mockRateEvaluationService.Verify(x => x.SaveRangeAsync(It.IsAny>()), Times.Once); } [Fact] public async void ComplexEvaluationDetail_SaveComplexAsync_Success_NotFound() { var request = new EvaluationDetailRequest(); EvaluationDetail? evaluationDetail = null; _mockEvaluationDetailService.Setup(x => x.SaveComplexAsync(It.IsAny())) .ReturnsAsync(evaluationDetail).Verifiable(); var result = await _service.SaveComplexAsync(request); Assert.Null(result); _mockEvaluationDetailService.Verify(x => x.SaveComplexAsync(It.IsAny()), Times.Once); } [Fact] public void ComplexEvaluationDetail_SaveComplexAsync_Failure_Exception() { var request = new EvaluationDetailRequest(); _mockEvaluationDetailService.Setup(x => x.SaveComplexAsync(It.IsAny())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.SaveComplexAsync(request)); _mockEvaluationDetailService.Verify(x => x.SaveComplexAsync(It.IsAny()), Times.Once); } [Fact] public async void ComplexEvaluationDetail_DeleteComplexAsync_Success() { var evaluationDetailId = DateTime.Now.Millisecond; _mockEvaluationDetailService.Setup(x => x.DeleteComplexAsync(It.IsAny())).Verifiable(); _mockRateEvaluationService.Setup(x => x.DeleteRangeByEvaluationDetailIdAsync(It.IsAny())).Verifiable(); await _service.DeleteComplexAsync(evaluationDetailId); _mockEvaluationDetailService.Verify(x => x.DeleteComplexAsync(It.IsAny()), Times.Once); _mockRateEvaluationService.Verify(x => x.DeleteRangeByEvaluationDetailIdAsync(It.IsAny()), Times.Once); } [Fact] public void ComplexEvaluationDetail_DeleteComplexAsync_Failure_Exception() { _mockEvaluationDetailService.Setup(x => x.DeleteComplexAsync(It.IsAny())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.DeleteComplexAsync(It.IsAny())); _mockEvaluationDetailService.Verify(x => x.DeleteComplexAsync(It.IsAny()), Times.Once); } }