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 _mockRateRepository; private readonly Mock _mockRateSheetService; private readonly Mock _mockLoadTestRunInfoService; private readonly Mock _mockUnitOfWork; private readonly IRateService _service; public RateServiceTest() { _mockRateRepository = new Mock(); _mockRateSheetService = new Mock(); _mockLoadTestRunInfoService = new Mock(); _mockUnitOfWork = new Mock(); _service = new RateService(_mockUnitOfWork.Object, _mockRateRepository.Object, _mockRateSheetService.Object, _mockLoadTestRunInfoService.Object); } [Fact] public async void Rate_GetAsync_Success() { var rates = new List { 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? 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(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())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.GetByIdAsync(It.IsAny())); _mockRateRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once); } [Fact] public async void Rate_GetByDateAsync_Success() { var rateId = 1; var rates = new List{ 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 = 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())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.GetByDateAsync(It.IsAny())); _mockRateRepository.Verify(x => x.FindByDateAsync(It.IsAny()), 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 { 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? 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())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.GetRateHistory(It.IsAny())); _mockRateRepository.Verify(x => x.FindRateHistoryAsync(It.IsAny()), Times.Once); } [Fact] public async void Rate_GetRangeByIdAsync_Success() { var rates = new List { 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? rates = null; var ids = new List { 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>())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.GetRangeByIdAsync(It.IsAny>())); _mockRateRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny>()), 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{ new Rate { RateId = rateId, RateSheetId = rateSheetId, RateStartDate = date } }; var evaluationIds = new List { 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? rates = null; var evaluationIds = new List { 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(), It.IsAny>(), It.IsAny())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.GetByDateEvaluationIdAndEvaluationTypeAsync(It.IsAny(), It.IsAny>(), It.IsAny())); _mockRateRepository.Verify(x => x.FindByDateEvaluationIdsAndEvaluationTypeAsync(It.IsAny(), It.IsAny>(), It.IsAny()), 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()), 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(async () => await _service.SaveAsync(rate)); _mockRateRepository.Verify(x => x.AddAsync(It.IsAny()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public void Rate_SaveAsync_Failure_Exception() { _mockRateRepository.Setup(x => x.AddAsync(It.IsAny())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.SaveAsync(It.IsAny())); _mockRateRepository.Verify(x => x.AddAsync(It.IsAny()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public async void Rate_SaveRangeAsync_Success() { var rates = new List { 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>()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once); } [Fact] public void Rate_SaveRangeAsync_Failure_Exception() { _mockRateRepository.Setup(x => x.AddRangeAsync(It.IsAny>())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.SaveRangeAsync(It.IsAny>())); _mockRateRepository.Verify(x => x.AddRangeAsync(It.IsAny>()), 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()), 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(async () => await _service.UpdateAsync(rate)); _mockRateRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public void Rate_UpdateAsync_Failure_Exception() { _mockRateRepository.Setup(x => x.FindByIdAsync(It.IsAny())) .ThrowsAsync(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.UpdateAsync(It.IsAny())); _mockRateRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Never); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public async void Rate_UpdateRangeAsync_Success() { var rates = new List { 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>()), Times.Once()); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once); } [Fact] public void Rate_UpdateRangeAsync_Failure_Exception() { _mockRateRepository.Setup(x => x.UpdateRange(It.IsAny>())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.UpdateRangeAsync(It.IsAny>())); _mockRateRepository.Verify(x => x.UpdateRange(It.IsAny>()), 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()), Times.Once()); _mockRateRepository.Verify(x => x.Remove(It.IsAny()), 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(async () => await _service.DeleteAsync(rateId)); _mockRateRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once()); _mockRateRepository.Verify(x => x.Remove(It.IsAny()), Times.Never); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public void Rate_DeleteAsync_Failure_Exception() { _mockRateRepository.Setup(x => x.FindByIdAsync(It.IsAny())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.DeleteAsync(It.IsAny())); _mockRateRepository.Verify(x => x.FindByIdAsync(It.IsAny()), Times.Once); _mockRateRepository.Verify(x => x.Remove(It.IsAny()), Times.Never); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public async void Rate_DeleteRangeAsync_Success() { var rateIds = new List { 1, 2, 3 }; var rates = new List { 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>()), Times.Once()); _mockRateRepository.Verify(x => x.RemoveRange(It.IsAny>()), Times.Once()); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Once); } [Fact] public void Rate_DeleteRangeAsync_Failure_ReturnedNull() { var rateIds = new List { 1, 2, 3 }; List? rates = null; _mockRateRepository.Setup(x => x.FindRangeByIdAsync(rateIds)) .ReturnsAsync(rates).Verifiable(); Assert.ThrowsAsync(async () => await _service.DeleteRangeAsync(rateIds)); _mockRateRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny>()), Times.Once()); _mockRateRepository.Verify(x => x.RemoveRange(It.IsAny>()), Times.Never); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } [Fact] public void Rate_DeleteRangeAsync_Failure_Exception() { _mockRateRepository.Setup(x => x.RemoveRange(It.IsAny>())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.DeleteRangeAsync(It.IsAny>())); _mockRateRepository.Verify(x => x.FindRangeByIdAsync(It.IsAny>()), Times.Once()); _mockRateRepository.Verify(x => x.RemoveRange(It.IsAny>()), Times.Never); _mockUnitOfWork.Verify(x => x.CompleteAsync(), Times.Never); } }