public void cannot_validate_loan_request_for_value_less_than_minimum()
 {
     var lenders = TestHelpers.GetSevenLendersForTesting();
     var requestLoanFromMarket = new RequestLoanFromMarket(100, 36, _currency);
     var validRequest = _loanRequestValidator.ValidateLoanRequest(requestLoanFromMarket,
         lenders);
     validRequest.ErrorMessages.Count.Should().Be(1);
     validRequest.IsValid.Should().BeFalse();
     validRequest.ErrorMessages.Should().Contain(x => x == "This is less than the minimum allowed. Our lending options start at £1,000.00.");
 }
 public void cannot_validate_loan_request_for_incremement_that_is_not_100()
 {
     var lenders = TestHelpers.GetSevenLendersForTesting();
     var requestLoanFromMarket = new RequestLoanFromMarket(1790, 36, _currency);
     var validRequest = _loanRequestValidator.ValidateLoanRequest(requestLoanFromMarket,
         lenders);
     validRequest.ErrorMessages.Count.Should().Be(1);
     validRequest.IsValid.Should().BeFalse();
     validRequest.ErrorMessages.Should().Contain(x => x == "This is not an increment of £100.00. Please specify an amount of any £100.00 increment between £1,000.00 and £15,000.00.");
 }
 public void cannot_validate_loan_request_for_value_over_maximum()
 {
     var lenders = TestHelpers.GetSevenLendersForTesting();
     var requestLoanFromMarket = new RequestLoanFromMarket(17000, 36, _currency);
     var validRequest = _loanRequestValidator.ValidateLoanRequest(requestLoanFromMarket,
         lenders);
     validRequest.ErrorMessages.Count.Should().Be(2);
     validRequest.IsValid.Should().BeFalse();
     validRequest.ErrorMessages.Should().Contain(x => x == "This is more than the maximum allowed. We can only lend up to £15,000.00.");
     validRequest.ErrorMessages.Should().Contain(x => x == "There are not enough funds available to service your request, the maximum we can lend is £2,330.00");
 }
 /// <inheritdoc />
 public ValidLoanRequest ValidateLoanRequest(RequestLoanFromMarket requestLoanFromMarket,
     IEnumerable<Lender> availableLenders)
 {
     //find out how much we can possibly lend
     var maximumAvailable = availableLenders.Sum(x => x.Available);
     //set the currency format for messages..
     _numberFormat = requestLoanFromMarket.Currency.Value;
     //a container for error messages
     var errorMessages = new List<string>();
     //if the requested loan amount if greater than the maxiumum amount a borrower
     //can request then set an error message
     if (requestLoanFromMarket.Amount > _maximumLoanRequest)
     {
         errorMessages.Add(
             string.Format(
                 "This is more than the maximum allowed. We can only lend up to {0}.",
                 FormatNumberForCurrency(_maximumLoanRequest)));
     }
     //if the requested loan amount if less than the minimum loan request then
     //set an error message
     if (requestLoanFromMarket.Amount < _minimumLoanRequest)
     {
         errorMessages.Add(
             string.Format("This is less than the minimum allowed. Our lending options start at {0}.",
                 FormatNumberForCurrency(_minimumLoanRequest)));
     }
     //if the loan amount is not a valid increment value
     //set an error message
     if (requestLoanFromMarket.Amount % _allowedIncrement > 0)
     {
         errorMessages.Add(
             string.Format(
                 "This is not an increment of {0}. Please specify an amount of any {0} increment between {1} and {2}.",
                 FormatNumberForCurrency(_allowedIncrement),
                 FormatNumberForCurrency(_minimumLoanRequest),
                 FormatNumberForCurrency(_maximumLoanRequest)));
     }
     //if the loan amount if greater than the maximum available
     //set an error message
     if (requestLoanFromMarket.Amount > maximumAvailable)
     {
         errorMessages.Add(string.Format("There are not enough funds available to service your request, the maximum we can lend is {0}", FormatNumberForCurrency(maximumAvailable)));
     }
     //if we have any error messages return an invalid loan request else return a valid loan request
     return errorMessages.Count > 0 ? new ValidLoanRequest(errorMessages, false) : new ValidLoanRequest(new List<string>(), true);
 }
 public void can_request_loan_from_market()
 {
     //set up
     var lenders = TestHelpers.GetSevenLendersForTesting();
     var addLendersToMarket = new AddLendersToMarket(lenders);
     _marketService.AddLendersToMarket(addLendersToMarket);
     var amountRequested = 1000;
     var repaymentMonths = 36;
     //act
     var requestLoanFromMarket = new RequestLoanFromMarket(amountRequested, repaymentMonths, new Currency(new CultureInfo("en-gb").NumberFormat));
     var quote = _marketService.RequestQuoteFromMarket(requestLoanFromMarket);
     //assert
     quote.Quote.RequestedAmount.Should().Be(amountRequested);
     quote.Quote.TotalRepyment.Should().Be(new decimal(1233.08));
     quote.Quote.MonthlyRepayment.Should().Be(new decimal(34.25));
     quote.Quote.Rate.Should().Be(0.1);
 }
Exemple #6
0
 /// <inheritdoc />
 public ResponseToLoanRequest RequestQuoteFromMarket(RequestLoanFromMarket requestLoanFromMarket)
 {
     //get all the lenders with available money
     var lenders = _lenderRepository.FindBy(x => x.Available > 0);
     //convert he ienumberable to an array or we can get enumeration problems! This is
     //not ideal.
     var availableLenders = lenders as Lender[] ?? lenders.ToArray();
     //validate the loan request
     var validateRequest = _loanRequestValidator.ValidateLoanRequest(requestLoanFromMarket,
         availableLenders);
     //if the loan request isnt valid
     if (!validateRequest.IsValid)
     {
         //return a response that indicates failure.
         return new ResponseToLoanRequest(null, validateRequest);
     }
     //get the best offers for the loan request
     var offers = _loanCalculator.GetTheBestAvailableOffersFromLenders(availableLenders, requestLoanFromMarket.Amount);
     //work out the quote from the offers
     var quote = _loanCalculator.CalculateQuoteFromOffers(offers, requestLoanFromMarket.RepaymentMonths,
         requestLoanFromMarket.Amount);
     //return the quote with a successful response
     return new ResponseToLoanRequest(quote, new ValidLoanRequest(new List<string>(), true));
 }
Exemple #7
0
 /// <summary>
 /// This method takes the arguments passed into the console and attempts to get a quote.
 /// </summary>
 /// <param name="args"></param>
 private static void GetQuote(string[] args)
 {
     var marketService = _unityContainer.Resolve<IMarketService>();
     var consoleService = _unityContainer.Resolve<IDocumentService>();
     var printService = _unityContainer.Resolve<IPrintService>();
     //receive a request for a loan which has the current market and the loan amount required..
     var documentLocation = args[0];
     var loanAmountRequested = Convert.ToDecimal(args[1]);
     var numberOfRepaymentMonths = Convert.ToInt32(ConfigurationManager.AppSettings["NumberOfRepaymentMonths"]);
     //parse the document to get the lenders
     var lenders = consoleService.GetLendersFromDocument(documentLocation);
     //persist the current market
     var addLendersToMarket = new AddLendersToMarket(lenders);
     marketService.AddLendersToMarket(addLendersToMarket);
     //try and get the loan requested
     var requestLoanFromMarket = new RequestLoanFromMarket(loanAmountRequested, numberOfRepaymentMonths, new Domain.Model.Currency(new CultureInfo("en-gb").NumberFormat));
     var responseToLoanRequest = marketService.RequestQuoteFromMarket(requestLoanFromMarket);
     printService.PrintResponseToLoanRequest(responseToLoanRequest);
 }
 public void can_validate_loan()
 {
     var lenders = TestHelpers.GetSevenLendersForTesting();
     var requestLoanFromMarket = new RequestLoanFromMarket(1000, 36, _currency);
     var validRequest = _loanRequestValidator.ValidateLoanRequest(requestLoanFromMarket,
         lenders);
     validRequest.ErrorMessages.Count.Should().Be(0);
     validRequest.IsValid.Should().BeTrue();
 }