431 lines
18 KiB
C#
431 lines
18 KiB
C#
using LCU.API.Internal.LoanRate.Services;
|
|
using LCU.API.Internal.LoanRate.Services.LoanRateOperationServices;
|
|
using LCU.API.Internal.LoanRate.Services.ValidateLoanRateServices;
|
|
using LCU.Library.Internal.LcuEvaluationModels.Entities;
|
|
using LCU.Library.Internal.LcuEvaluationModels.Enums;
|
|
using LCU.Library.Internal.LcuEvaluation.Services;
|
|
using LCU.Library.Internal.LoanRateModels.Entities;
|
|
using LCU.Library.Internal.LoanRateModels.Requests;
|
|
using LCU.Library.Internal.LcuEvaluation.Services.EvaluationServices;
|
|
|
|
namespace LCU.API.Internal.LoanRateTests.ServiceTests.ValidateLoanRateServicesTests;
|
|
|
|
public class ValidateRateEvaluationsServiceTest
|
|
{
|
|
private readonly ValidateRateEvaluationsService _validateRateEvaluationsService;
|
|
private readonly Mock<IEvaluationDetailService> _mockEvaluationDetailService;
|
|
private readonly Mock<IRateService> _mockRateService;
|
|
private readonly Mock<IRunRuleService> _mockRunEvaluationService;
|
|
private readonly Mock<IRateFinderService> _mockRateFinderService;
|
|
|
|
public ValidateRateEvaluationsServiceTest()
|
|
{
|
|
_mockEvaluationDetailService = new Mock<IEvaluationDetailService>();
|
|
_mockRateService = new Mock<IRateService>();
|
|
_mockRunEvaluationService = new Mock<IRunRuleService>();
|
|
_mockRateFinderService = new Mock<IRateFinderService>();
|
|
_validateRateEvaluationsService = new ValidateRateEvaluationsService(_mockEvaluationDetailService.Object,
|
|
_mockRateService.Object,
|
|
_mockRunEvaluationService.Object,
|
|
_mockRateFinderService.Object);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ValidateRatePassesEvaluation_True()
|
|
{
|
|
var rateRequest = new RateRequest();
|
|
|
|
var evaluationBuilder1 = new EvaluationDetail()
|
|
{
|
|
EvaluationDetailId = 1,
|
|
Description = "CreditScore Greater Than Or Equal 740.",
|
|
EvaluationParameters = new List<EvaluationParameter>()
|
|
{
|
|
new (0, ParameterTypes.Variable, "RateRequest.CreditScore"),
|
|
new (1, ParameterTypes.GreaterThanOrEqual, ""),
|
|
new (2, ParameterTypes.TextInput, "740")
|
|
}
|
|
};
|
|
|
|
_mockEvaluationDetailService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(evaluationBuilder1).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 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,
|
|
}
|
|
}
|
|
};
|
|
_mockRateService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(rate1).Verifiable();
|
|
|
|
var result = await _validateRateEvaluationsService.ValidateRatePassesEvaluation(rateRequest, 1, 1);
|
|
Assert.True(result);
|
|
|
|
_mockEvaluationDetailService.Verify(x => x.GetByIdAsync(1), Times.Once);
|
|
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
|
|
_mockRateService.Verify(x => x.GetByIdAsync(1), Times.Once);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ValidateRatePassesEvaluation_False()
|
|
{
|
|
var rateRequest = new RateRequest();
|
|
|
|
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")
|
|
}
|
|
};
|
|
|
|
_mockEvaluationDetailService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(evaluationBuilder1).Verifiable();
|
|
|
|
var evaluationsReturned = new List<EvaluationDetail>();
|
|
_mockRunEvaluationService.Setup(x => x.ValidateRequestRules(rateRequest, It.IsAny<List<EvaluationDetail>>())).Returns(evaluationsReturned).Verifiable();
|
|
|
|
var rate1 = new Rate()
|
|
{
|
|
RateId = 3,
|
|
Value = 5.49M,
|
|
RateEvaluations = new List<RateEvaluation>()
|
|
{
|
|
new RateEvaluation()
|
|
{
|
|
RateEvaluationId = 1,
|
|
RateId = 1,
|
|
EvaluationDetailId = 1,
|
|
},
|
|
new RateEvaluation()
|
|
{
|
|
RateEvaluationId = 2,
|
|
RateId = 1,
|
|
EvaluationDetailId = 3,
|
|
}
|
|
}
|
|
};
|
|
_mockRateService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(rate1).Verifiable();
|
|
|
|
var result = await _validateRateEvaluationsService.ValidateRatePassesEvaluation(rateRequest, 1, 1);
|
|
Assert.False(result);
|
|
|
|
_mockEvaluationDetailService.Verify(x => x.GetByIdAsync(1), Times.Once);
|
|
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
|
|
_mockRateService.Verify(x => x.GetByIdAsync(1), Times.Once);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ValidateRatePassesEvaluations_True()
|
|
{
|
|
var rate1 = new Rate()
|
|
{
|
|
RateId = 3,
|
|
Value = 5.49M,
|
|
RateEvaluations = new List<RateEvaluation>()
|
|
{
|
|
new RateEvaluation()
|
|
{
|
|
RateEvaluationId = 1,
|
|
RateId = 1,
|
|
EvaluationDetailId = 3,
|
|
},
|
|
new RateEvaluation()
|
|
{
|
|
RateEvaluationId = 2,
|
|
RateId = 1,
|
|
EvaluationDetailId = 4,
|
|
}
|
|
}
|
|
};
|
|
var applicationDate = DateTime.Now;
|
|
|
|
_mockRateService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(rate1).Verifiable();
|
|
|
|
var evaluationIds = rate1.RateEvaluations.Select(rateEvaluation => rateEvaluation.EvaluationDetailId).ToList();
|
|
_mockEvaluationDetailService.Setup(x => x.GetActiveByEvaluationTypeAndIdsAsync(applicationDate, EvaluationTypes.Rule, evaluationIds)).ReturnsAsync(GetFakeEvaluations()).Verifiable();
|
|
|
|
var evaluationsReturned = new List<EvaluationDetail>
|
|
{
|
|
new EvaluationDetail
|
|
{
|
|
EvaluationDetailId = 1
|
|
},
|
|
new EvaluationDetail
|
|
{
|
|
EvaluationDetailId = 2
|
|
}
|
|
};
|
|
|
|
var rateRequest = new RateRequest { ApplicationDate = applicationDate };
|
|
_mockRunEvaluationService.Setup(x => x.ValidateRequestRules(rateRequest, It.IsAny<List<EvaluationDetail>>())).Returns(evaluationsReturned).Verifiable();
|
|
|
|
var rateReturn = ( new Rate { RateId = 1 }, string.Empty );
|
|
_mockRateFinderService.Setup(x => x.DetermineRate(applicationDate, evaluationsReturned)).ReturnsAsync(rateReturn).Verifiable();
|
|
|
|
var result = await _validateRateEvaluationsService.ValidateRatePassesEvaluations(rateRequest, 1);
|
|
Assert.True(result);
|
|
|
|
_mockRateService.Verify(x => x.GetByIdAsync(1), Times.Once);
|
|
_mockEvaluationDetailService.Verify(x => x.GetActiveByEvaluationTypeAndIdsAsync(It.IsAny<DateTime>(), It.IsAny<EvaluationTypes>(), It.IsAny<List<int>>()), Times.Once);
|
|
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
|
|
_mockRateFinderService.Verify(x => x.DetermineRate(It.IsAny<DateTime>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ValidateRatePassesEvaluations_False()
|
|
{
|
|
var applicationDate = DateTime.Now;
|
|
var rateRequest = new RateRequest() { ApplicationDate = applicationDate };
|
|
|
|
var rate1 = new Rate()
|
|
{
|
|
RateId = 3,
|
|
Value = 5.49M,
|
|
RateStartDate = applicationDate.AddDays(-50),
|
|
RateEvaluations = new List<RateEvaluation>()
|
|
{
|
|
new RateEvaluation()
|
|
{
|
|
RateEvaluationId = 1,
|
|
RateId = 1,
|
|
EvaluationDetailId = 3,
|
|
},
|
|
new RateEvaluation()
|
|
{
|
|
RateEvaluationId = 2,
|
|
RateId = 1,
|
|
EvaluationDetailId = 4,
|
|
}
|
|
}
|
|
};
|
|
_mockRateService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(rate1).Verifiable();
|
|
|
|
|
|
var evaluationIds = rate1.RateEvaluations.Select(rateEvaluation => rateEvaluation.EvaluationDetailId).ToList();
|
|
_mockEvaluationDetailService.Setup(x => x.GetActiveByEvaluationTypeAndIdsAsync(rateRequest.ApplicationDate, EvaluationTypes.Rule, evaluationIds)).ReturnsAsync(GetFakeEvaluations()).Verifiable();
|
|
|
|
var evaluationsReturned = new List<EvaluationDetail>
|
|
{
|
|
new EvaluationDetail
|
|
{
|
|
EvaluationDetailId = 1,
|
|
StartDate = applicationDate.AddDays(-10)
|
|
},
|
|
new EvaluationDetail
|
|
{
|
|
EvaluationDetailId = 2,
|
|
StartDate = applicationDate.AddDays(-10)
|
|
}
|
|
};
|
|
|
|
_mockRunEvaluationService.Setup(x => x.ValidateRequestRules(rateRequest, It.IsAny<List<EvaluationDetail>>())).Returns(evaluationsReturned).Verifiable();
|
|
|
|
var rateReturn = ( new Rate { RateId = 100 }, string.Empty );
|
|
_mockRateFinderService.Setup(x => x.DetermineRate(applicationDate, evaluationsReturned)).ReturnsAsync(rateReturn).Verifiable();
|
|
|
|
var result = await _validateRateEvaluationsService.ValidateRatePassesEvaluations(rateRequest, 1);
|
|
Assert.False(result);
|
|
|
|
_mockRateService.Verify(x => x.GetByIdAsync(1), Times.Once);
|
|
_mockEvaluationDetailService.Verify(x => x.GetActiveByEvaluationTypeAndIdsAsync(It.IsAny<DateTime>(), It.IsAny<EvaluationTypes>(), It.IsAny<List<int>>()), Times.Once);
|
|
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
|
|
_mockRateFinderService.Verify(x => x.DetermineRate(It.IsAny<DateTime>(), It.IsAny<List<EvaluationDetail>>()), Times.Once);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ValidateRatePassesEvaluations_False_NoEvaluations()
|
|
{
|
|
var rate1 = new Rate()
|
|
{
|
|
RateId = 3,
|
|
Value = 5.49M,
|
|
RateEvaluations = new List<RateEvaluation>()
|
|
{
|
|
new RateEvaluation()
|
|
{
|
|
RateEvaluationId = 1,
|
|
RateId = 1,
|
|
EvaluationDetailId = 3,
|
|
},
|
|
new RateEvaluation()
|
|
{
|
|
RateEvaluationId = 2,
|
|
RateId = 1,
|
|
EvaluationDetailId = 4,
|
|
}
|
|
}
|
|
};
|
|
_mockRateService.Setup(x => x.GetByIdAsync(1)).ReturnsAsync(rate1).Verifiable();
|
|
|
|
_mockEvaluationDetailService.Setup(x => x.GetActiveByEvaluationTypeAndIdsAsync(It.IsAny<DateTime>(), EvaluationTypes.Rule, It.IsAny<List<int>>())).ReturnsAsync(new List<EvaluationDetail>()).Verifiable();
|
|
|
|
var rateRequest = new RateRequest();
|
|
var result = await _validateRateEvaluationsService.ValidateRatePassesEvaluations(rateRequest, 1);
|
|
Assert.False(result);
|
|
|
|
_mockRateService.Verify(x => x.GetByIdAsync(1), Times.Once);
|
|
_mockEvaluationDetailService.Verify(x => x.GetActiveByEvaluationTypeAndIdsAsync(It.IsAny<DateTime>(), It.IsAny<EvaluationTypes>(), It.IsAny<List<int>>()), Times.Once);
|
|
_mockRunEvaluationService.Verify(x => x.ValidateRequestRules(It.IsAny<RateRequest>(), It.IsAny<List<EvaluationDetail>>()), Times.Never);
|
|
_mockRateFinderService.Verify(x => x.DetermineRate(It.IsAny<DateTime>(), It.IsAny<List<EvaluationDetail>>()), Times.Never);
|
|
}
|
|
|
|
public static List<EvaluationDetail> GetFakeEvaluations()
|
|
{
|
|
var date = DateTime.Now;
|
|
var evaluationBuilder1 = new EvaluationDetail()
|
|
{
|
|
EvaluationDetailId = 1,
|
|
Description = "CreditScore Greater Than Or Equal 740.",
|
|
StartDate = DateTime.Now.AddDays(-10),
|
|
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.",
|
|
StartDate = DateTime.Now.AddDays(-20),
|
|
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.",
|
|
StartDate = DateTime.Now.AddDays(-10),
|
|
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,
|
|
StartDate = DateTime.Now.AddDays(-15),
|
|
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<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;
|
|
}
|
|
} |