Files
monorepo/LCU.API.Internal.LoanRate/LCU.API.Internal.LoanRateTests/ServiceTests/ValidateLoanRateServicesTests/ValidateRateEvaluationsServiceTest.cs
T
2026-04-07 14:21:04 -05:00

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