public void CannotPayNotExistingInstallment() { //arrange int userId = 1, creditId = 2, installmentId = 3; var installmentDto = new CreditInstallmentDto() { CreditId = creditId, Id = installmentId }; var mockedCredit = new Credit() { BankAccountId = userId, Installments = new Collection <CreditInstallment>(), InstallmentsAlreadyPaid = 10, TotalInstallments = 20, NextInstallmentDate = DateTime.Now, }; _creditRepository.Setup(c => c.GetSingle(It.Is <int>(x => x.Equals(creditId)), a => a.Installments)).Returns(mockedCredit); var service = InstantiateService(); //act var result = service.PayInstallment(userId, installmentDto); //assert Assert.IsFalse(result.Success); Assert.AreEqual("Cannot find the installment", result.Message); }
public IHttpActionResult GetPenalty([FromUri] CreditInstallmentDto creditInstallmentDto) { var userId = User.Identity.GetUserId().Value; var result = _creditService.GetInstallmentWithPenalty(creditInstallmentDto, userId); if (!result.Success) { return(BadRequest(result.Message)); } else { return(Ok(result)); } }
public IHttpActionResult PayInstallment(CreditInstallmentDto creditInstallmentDto) { var userId = User.Identity.GetUserId().Value; var result = _creditService.PayInstallment(userId, creditInstallmentDto); if (!result.Success) { return(BadRequest(result.Message)); } else { return(Ok(result.Message)); } }
public void CanPayLateInstallment() { //arrange int userId = 1, creditId = 2, installmentId = 3; decimal installmentAmount = 100; var installmentDto = new CreditInstallmentDto() { CreditId = creditId, Id = installmentId }; var mockedCredit = new Credit() { BankAccountId = userId, Installments = new Collection <CreditInstallment>() { new CreditInstallment() { Id = installmentId, InstallmentAmount = installmentAmount, PaymentDeadline = (DateTime.Now - TimeSpan.FromDays(2)).Date } }, InstallmentsAlreadyPaid = 10, TotalInstallments = 20, NextInstallmentDate = DateTime.Now, }; _creditRepository.Setup(c => c.GetSingle(It.Is <int>(x => x.Equals(creditId)), a => a.Installments)).Returns(mockedCredit); _bankAccountService.Setup(b => b.TakeCash(It.Is <decimal>(a => a.Equals(installmentAmount * 1.1m)), It.Is <int>(x => x.Equals(userId)))).Returns(true); var service = InstantiateService(); //act var result = service.PayInstallment(userId, installmentDto); //assert Assert.IsTrue(result.Success); Assert.AreEqual("You have successfully paid an installment", result.Message); _creditInstallmentRepository.Verify(c => c.Update(It.IsAny <CreditInstallment>()), Times.Once()); _creditInstallmentRepository.Verify(c => c.Create(It.IsAny <CreditInstallment>()), Times.Once()); _creditRepository.Verify(c => c.Update(It.IsAny <Credit>()), Times.Once()); }
public void CannotPayInstallmentWithoutMoney() { //arrange int userId = 1, creditId = 2, installmentId = 3; decimal installmentAmount = 100; var installmentDto = new CreditInstallmentDto() { CreditId = creditId, Id = installmentId }; var mockedCredit = new Credit() { BankAccountId = userId, Installments = new Collection <CreditInstallment>() { new CreditInstallment() { Id = installmentId, InstallmentAmount = installmentAmount, PaymentDeadline = DateTime.Now } }, InstallmentsAlreadyPaid = 10, TotalInstallments = 20, NextInstallmentDate = DateTime.Now, }; _creditRepository.Setup(c => c.GetSingle(It.Is <int>(x => x.Equals(creditId)), a => a.Installments)).Returns(mockedCredit); _bankAccountService.Setup(b => b.TakeCash(It.Is <decimal>(a => a.Equals(installmentAmount)), It.Is <int>(x => x.Equals(userId)))).Returns(false); var service = InstantiateService(); //act var result = service.PayInstallment(userId, installmentDto); //assert Assert.IsFalse(result.Success); Assert.AreEqual("Cannot finish transaction", result.Message); }
public void CannotPayInstallmentForAnotherUsersCredit() { //arrange int userId = 1, creditId = 2, installmentId = 3, askingUserId = 4; decimal installmentAmount = 100; var installmentDto = new CreditInstallmentDto() { CreditId = creditId, Id = installmentId }; var mockedCredit = new Credit() { BankAccountId = userId, Installments = new Collection <CreditInstallment>() { new CreditInstallment() { Id = installmentId, InstallmentAmount = installmentAmount, PaymentDeadline = DateTime.Now } }, InstallmentsAlreadyPaid = 10, TotalInstallments = 20, NextInstallmentDate = DateTime.Now, }; _creditRepository.Setup(c => c.GetSingle(It.Is <int>(x => x.Equals(creditId)), a => a.Installments)).Returns(mockedCredit); var service = InstantiateService(); //act var result = service.PayInstallment(askingUserId, installmentDto); //assert Assert.IsFalse(result.Success); Assert.AreEqual("The credit does not exist or you don't have access to it", result.Message); }
public void CanGetInstallmentWithPenalty() { //arrange int userId = 1, creditId = 2, installmentId = 3; var installmentDto = new CreditInstallmentDto() { CreditId = creditId, Id = installmentId }; var mockedCredit = new Credit() { BankAccountId = userId, Installments = new Collection <CreditInstallment>() { new CreditInstallment() { Id = installmentId, PaymentDeadline = (DateTime.Now - TimeSpan.FromDays(2)).Date, InstallmentAmount = 100 } } }; _creditRepository.Setup(c => c.GetSingle(It.Is <int>(x => x.Equals(creditId)), a => a.Installments)).Returns(mockedCredit); var service = InstantiateService(); //act var result = service.GetInstallmentWithPenalty(installmentDto, userId); //assert Assert.AreEqual("Successfully calculated penalty", result.Message); Assert.IsTrue(result.Success); Assert.IsInstanceOf <InstallmentPenaltyDto>(result.Data); Assert.AreEqual(10, result.Data.PenaltyPercentage); }
public ResultDto <InstallmentPenaltyDto> GetInstallmentWithPenalty(CreditInstallmentDto creditInstallmentDto, int userId) { var credit = _creditRepository.GetSingle(creditInstallmentDto.CreditId, c => c.Installments); if (credit == null || credit.BankAccountId != userId) { return new ResultDto <InstallmentPenaltyDto>() { Success = false, Message = "The credit does not exist or you don't have permission to access it" } } ; var installment = credit.Installments.SingleOrDefault(i => i.Id == creditInstallmentDto.Id); if (installment == null) { return new ResultDto <InstallmentPenaltyDto>() { Success = false, Message = "Specified installment does not exist" } } ; var penalty = CalculatePenalty(installment.PaymentDeadline); var installmentPenalty = new InstallmentPenaltyDto() { Amount = installment.InstallmentAmount + (installment.InstallmentAmount * penalty / 100m), PenaltyPercentage = penalty }; return(new ResultDto <InstallmentPenaltyDto>() { Success = true, Message = "Successfully calculated penalty", Data = installmentPenalty }); }
public ResultDto PayInstallment(int userId, CreditInstallmentDto installmentDto) { var credit = _creditRepository.GetSingle(installmentDto.CreditId, c => c.Installments); if (credit == null || credit.BankAccountId != userId) { return new ResultDto() { Success = false, Message = "The credit does not exist or you don't have access to it" } } ; var installment = credit.Installments.SingleOrDefault(ci => ci.Id == installmentDto.Id); if (installment == null) { return new ResultDto() { Success = false, Message = "Cannot find the installment" } } ; var penaltyPercentage = CalculatePenalty(installment.PaymentDeadline); installment.InstallmentAmount += installment.InstallmentAmount * (penaltyPercentage / 100m); var result = _bankAccountService.TakeCash(installment.InstallmentAmount, userId); if (!result) { return new ResultDto() { Success = false, Message = "Cannot finish transaction" } } ; credit.InstallmentsAlreadyPaid++; installment.PaidOn = DateTime.Now; _creditInstallmentsRepository.Update(installment); if (credit.InstallmentsAlreadyPaid == credit.TotalInstallments) { credit.PaidInFull = true; } else { credit.NextInstallmentDate += TimeSpan.FromDays(1); var nextInstallment = new CreditInstallment() { CreditId = credit.Id, InstallmentAmount = credit.InstallmentAmount, PaymentDeadline = credit.NextInstallmentDate.Value }; _creditInstallmentsRepository.Create(nextInstallment); } _creditRepository.Update(credit); return(new ResultDto() { Success = true, Message = "You have successfully paid an installment" }); }