382 lines
19 KiB
C#
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;
|
|
}
|
|
} |