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 { private readonly IRateSheetService _service; private readonly Mock _mockRateSheetRepository; public RateSheetServiceTest() { _mockRateSheetRepository = new Mock(); _service = new RateSheetService(_mockRateSheetRepository.Object); } [Fact] public async void RateSheet_GetIncludeAllAsync_Success() { var rateSheets = new List { new () { RateSheetId = (int)typeof(int).GetRandomValue(), RateType = (RateTypes)typeof(RateTypes).GetRandomValue(), Rates = new List { 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? 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(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 { 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? rates = null; _mockRateSheetRepository.Setup(x => x.FindRatesByRateType(It.IsAny())) .ReturnsAsync(rates).Verifiable(); var result = await _service.GetRatesByRateTypeAsync(It.IsAny()); Assert.NotNull(result); Assert.Empty(result); _mockRateSheetRepository.Verify(); } [Fact] public void RateSheet_GetRatesByRateTypeAsync_Failure_Exception() { _mockRateSheetRepository.Setup(x => x.FindRatesByRateType(It.IsAny())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.GetRatesByRateTypeAsync(It.IsAny())); _mockRateSheetRepository.Verify(x => x.FindRatesByRateType(It.IsAny()), 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 { 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? rates = null; _mockRateSheetRepository.Setup(x => x.FindRatesByDateAndRateType(It.IsAny(), It.IsAny())) .ReturnsAsync(rates).Verifiable(); var result = await _service.GetRatesByDateAndRateTypeAsync(It.IsAny(), It.IsAny()); Assert.NotNull(result); Assert.Empty(result); _mockRateSheetRepository.Verify(); } [Fact] public void RateSheet_GetRatesByDateAndRateTypeAsync_Failure_Exception() { _mockRateSheetRepository.Setup(x => x.FindRatesByDateAndRateType(It.IsAny(), It.IsAny())) .Throws(new Exception("Test")).Verifiable(); Assert.ThrowsAsync(async () => await _service.GetRatesByDateAndRateTypeAsync(It.IsAny(), It.IsAny())); _mockRateSheetRepository.Verify(x => x.FindRatesByDateAndRateType(It.IsAny(), It.IsAny()), Times.Once); } }