using FindAndDrive.Domain.Interfaces.Gateways; using FindAndDrive.Domain.Interfaces.Repositories; using FindAndDrive.Domain.Interfaces.Services; using FindAndDrive.Domain.Models.DTO; using FindAndDrive.Domain.Models.Entities; using FindAndDrive.Domain.Models.Enums; using FindAndDrive.Domain.Services; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using FindAndDrive.Domain.Models.Settings; using Microsoft.Extensions.Options; using FindAndDrive.Persistence.Repository; using FindAndDrive.Domain.Interfaces.Providers; namespace FindAndDrive.Tests.UnitTests.Services { public class FinancingServiceTests { private readonly Mock _experianGateway; private readonly Mock _transUnionGateway; private readonly Mock _applicantRepository; private readonly Mock _applicantFinanceRepository; private readonly Mock> _settings; private readonly Mock> _transunionSettings; private readonly IFinancingService _systemUnderTest; private readonly Mock _dateTimeProvider; private readonly Mock _applicantAudit; private readonly Mock _applicantCredit; private readonly Mock _applicantFraud; private readonly Mock _applicantPrediciton; public FinancingServiceTests() { _experianGateway = new Mock(); _transUnionGateway = new Mock(); _applicantRepository = new Mock(); _applicantFinanceRepository = new Mock(); _settings = new Mock>(); _transunionSettings = new Mock>(); _applicantAudit = new Mock(); _applicantCredit = new Mock(); _applicantFraud = new Mock(); _applicantPrediciton = new Mock(); _dateTimeProvider = new Mock(); _systemUnderTest = new FinancingService(_experianGateway.Object, _transUnionGateway.Object, _dateTimeProvider.Object, _applicantRepository.Object, _applicantFinanceRepository.Object, _applicantAudit.Object, _applicantCredit.Object, _applicantFraud.Object, _applicantPrediciton.Object, _settings.Object, _transunionSettings.Object); } [Fact] public async Task FinancingCalc_ShouldSucceed_WhenDepositIsNull() { // Arrange var request = new PreVettingRequest { MonthlyBudget = 100000, NetIncome = 200000, MobileNumber = "+27724402527" }; var clientId = Guid.NewGuid(); // Act var response = await _systemUnderTest.FinancingCalc(request, clientId); // Assert Assert.Equal(200,response.StatusCode); } [Fact] //Test to check TotalAmount and Monthly calculations public async Task FinancingCalc_TotalAmount() { //Arrange var request1 = new PreVettingRequest { Deposit = 20000, NetIncome = 300000, MobileNumber = "+27724402527" }; var clientId = Guid.NewGuid(); //Act var response = await _systemUnderTest.FinancingCalc(request1, clientId); //Assert //Both are correct Assert.Equal(83000, response.TotalAmount); Assert.Equal(1867, response.MonthlyAmount); } [Fact] //Testing Predective model scenorio 1 public void MakePrediciton_Scenario1() { //Arrange var request1 = new PredictionRequest { NetIncome = 30000, AdditionalIncome = 1000, CalcExpenses = 15000, CreditScore = 681 }; var response = _systemUnderTest.MakePrediction(request1); //Assert Assert.Equal(ChancesOfApproval.High, response.Prediction); Assert.Equal("", response.Reason); Assert.Equal("", response.ReasonVerbiage); } [Fact] //Testing Predective model scenorio 2 public void MakePrediciton_Scenario2() { //Arrange var request1 = new PredictionRequest { NetIncome = 30000, AdditionalIncome = 1000, CalcExpenses = 15000, CreditScore = 614 }; var response = _systemUnderTest.MakePrediction(request1); //Assert Assert.Equal(ChancesOfApproval.Medium, response.Prediction); Assert.Equal("", response.Reason); Assert.Equal("", response.ReasonVerbiage); } [Fact] //Testing Predective model scenorio 3 public void MakePrediciton_Scenario3() { //Arrange var request1 = new PredictionRequest { NetIncome = 6500, AdditionalIncome = 0, CalcExpenses = 1000, CreditScore = 614 }; var response = _systemUnderTest.MakePrediction(request1); //Assert Assert.Equal(ChancesOfApproval.Low, response.Prediction); Assert.Equal("Affordability", response.Reason); Assert.Equal("", response.ReasonVerbiage); } [Fact] //Testing Predective model scenorio 4 public void MakePrediciton_Scenario4() { //Arrange var request1 = new PredictionRequest { NetIncome = 30000, AdditionalIncome = 1000, CalcExpenses = 15000, CreditScore = 614 }; var response = _systemUnderTest.MakePrediction(request1); //Assert Assert.Equal(ChancesOfApproval.Low, response.Prediction); Assert.Equal("High debt", response.Reason); Assert.Equal("", response.ReasonVerbiage); } [Fact] //Testing Predective model scenorio 5 public void MakePrediciton_Scenario5() { //Arrange var request1 = new PredictionRequest { NetIncome = 30000, AdditionalIncome = 1000, CalcExpenses = 15000, CreditScore = 0, ScoreIndicator = "01", Reason1 = "07" }; var response = _systemUnderTest.MakePrediction(request1); //Assert Assert.Equal(ChancesOfApproval.Low, response.Prediction); Assert.Equal("Credit History", response.Reason); Assert.Equal("TransUnion is unable to provide you with a credit score because your trade information is insufficient.", response.ReasonVerbiage); } [Fact] //Testing Predective model scenorio 6 public void MakePrediciton_Scenario6() { //Arrange var request1 = new PredictionRequest { NetIncome = 30000, AdditionalIncome = 1000, CalcExpenses = 15000, CreditScore = 0, ScoreIndicator = "02", Reason1 = "01" }; var response = _systemUnderTest.MakePrediction(request1); //Assert Assert.Equal(ChancesOfApproval.Low, response.Prediction); Assert.Equal("Credit Behaviour", response.Reason); Assert.Equal("You have a high amount outstanding on your accounts. A high outstanding balance may signal to potential lenders that you are spending more than you can afford.", response.ReasonVerbiage); } } }