Files
2026-04-07 14:21:04 -05:00

382 lines
19 KiB
C#

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;
}
}