Beispiel #1
0
        public void TransferMoney_Should_ThrowMoneyNotEnoughException_When_TotalBalanceIsLessThanAmoutToTransfer()
        {
            var sender = "NL95INGB1938035321";
            var payee  = "NL13ABNA7035378898";
            var dto    = new TransferMoneyDto
            {
                payee_iban_number  = payee,
                sender_iban_number = sender,
                amount             = 2000
            };

            Account senderInstance = new Account();
            Account payeeInstance  = new Account();

            MockAccountRepository.Setup(x => x.GetByIBanNumber(sender)).Returns(Task.FromResult(senderInstance));
            MockAccountRepository.Setup(x => x.GetByIBanNumber(payee)).Returns(Task.FromResult(payeeInstance));

            IEnumerable <Statement> statements = new List <Statement>
            {
                new Statement {
                    Amount = 100
                },
                new Statement {
                    Amount = 1000
                }
            };

            MockStatementRepository.Setup(x => x.GetByAccountId(It.IsAny <int>())).Returns(Task.FromResult(statements));

            Assert.ThrowsAsync <MoneyNotEnoughException>(() => _testService.TransferMoney(dto));
        }
Beispiel #2
0
        public void TransferMoney_Should_ThrowValidationException_When_PayeeIbanNumberIsInvalid()
        {
            var dto = new TransferMoneyDto
            {
                payee_iban_number  = "thank you",
                sender_iban_number = "NL13ABNA7035378898",
                amount             = -1
            };

            Assert.ThrowsAsync <ValidationException>(() => _testService.TransferMoney(dto));
        }
Beispiel #3
0
        public void TransferMoney_Should_ThrowValidationException_When_AmountIsLessThanZero()
        {
            var dto = new TransferMoneyDto
            {
                payee_iban_number  = "NL13ABNA7035378898",
                sender_iban_number = "NL95INGB1938035321",
                amount             = -1
            };

            Assert.ThrowsAsync <ValidationException>(() => _testService.TransferMoney(dto));
        }
        public IActionResult TransferWallet([FromBody] TransferMoneyDto transferMoneyDto)
        {
            if (transferMoneyDto.Amount <= 0)
            {
                return(BadRequest());
            }


            var fromUserWallet = _userWalletRepository.GetUserWalletById(transferMoneyDto.FromUserWalletId);

            if (fromUserWallet == null)
            {
                return(NotFound());
            }

            var toUserWallet = _userWalletRepository.GetUserWalletById(transferMoneyDto.ToUserWalletId);

            if (toUserWallet == null)
            {
                return(NotFound());
            }


            if (fromUserWallet.WalletId == toUserWallet.WalletId)
            {
                fromUserWallet.Balance -= transferMoneyDto.Amount;

                toUserWallet.Balance += transferMoneyDto.Amount;
            }
            else
            {
                fromUserWallet.Balance -= transferMoneyDto.Amount;

                toUserWallet.Balance += _euroRateProvider
                                        .ConvertMoney(fromUserWallet.Wallet.CurrencyCode,
                                                      toUserWallet.Wallet.CurrencyCode,
                                                      transferMoneyDto.Amount);;
            }

            if (!TryValidateModel(fromUserWallet))
            {
                return(BadRequest());
            }

            _userWalletRepository.SaveChanges();

            return(CreatedAtRoute("GetUserWallets", new { userId = fromUserWallet.UserId }, transferMoneyDto));
        }
Beispiel #5
0
        public void TransferMoney_Should_ThrowAccountNotFoundExceptionn_When_PayeeAccountWasNotFound()
        {
            var sender = "NL95INGB1938035321";
            var payee  = "NL13ABNA7035378898";
            var dto    = new TransferMoneyDto
            {
                payee_iban_number  = payee,
                sender_iban_number = sender,
                amount             = 2000
            };

            Account senderInstance = new Account();
            Account payeeInstance  = null;

            MockAccountRepository.Setup(x => x.GetByIBanNumber(sender)).Returns(Task.FromResult(senderInstance));
            MockAccountRepository.Setup(x => x.GetByIBanNumber(payee)).Returns(Task.FromResult(payeeInstance));

            Assert.ThrowsAsync <AccountNotFoundException>(() => _testService.TransferMoney(dto));
        }
Beispiel #6
0
        public void TransferMoney_Should_Success_When_AmountIsLessThanTotalBalance()
        {
            var sender = "NL95INGB1938035321";
            var payee  = "NL13ABNA7035378898";
            var dto    = new TransferMoneyDto
            {
                payee_iban_number  = payee,
                sender_iban_number = sender,
                amount             = 2000
            };

            Account senderInstance = new Account();
            Account payeeInstance  = new Account();

            MockAccountRepository.Setup(x => x.GetByIBanNumber(sender)).Returns(Task.FromResult(senderInstance));
            MockAccountRepository.Setup(x => x.GetByIBanNumber(payee)).Returns(Task.FromResult(payeeInstance));

            IEnumerable <Statement> statements = new List <Statement>
            {
                new Statement {
                    Amount = 100
                },
                new Statement {
                    Amount = 1000
                },
                new Statement {
                    Amount = 10000
                }
            };

            MockStatementRepository.Setup(x => x.GetByAccountId(It.IsAny <int>())).Returns(Task.FromResult(statements));

            TransferMoneyResultDto resultDto = new TransferMoneyResultDto {
                success = true
            };

            MockTransactionRepository.Setup(x => x.SaveTransferringMoney(It.IsAny <TransferMoneyFullDto>())).Returns(Task.FromResult(resultDto));

            var result = _testService.TransferMoney(dto).Result;

            Assert.IsTrue(result.success);
        }
Beispiel #7
0
        public async Task <TransferMoneyResultDto> TransferMoney(TransferMoneyDto dto)
        {
            ValidationHelper.Validate(_transferMoneyValidator, dto);
            Account sender = await _accountRepository.GetByIBanNumber(dto.sender_iban_number);

            if (sender == null)
            {
                throw new AccountNotFoundException("sender was not found");
            }

            Account payee = await _accountRepository.GetByIBanNumber(dto.payee_iban_number);

            if (payee == null)
            {
                throw new AccountNotFoundException("payee was not found");
            }

            var statements = await _statementRepository.GetByAccountId(sender.Id);

            var totalBalance = statements.Sum(x => StatementHelper.CalculateActualAmount(x.Amount, x.Fee));

            if (totalBalance < dto.amount)
            {
                throw new MoneyNotEnoughException("not enough money to transfer");
            }

            TransferMoneyFullDto fullDto = new TransferMoneyFullDto
            {
                amount        = dto.amount,
                sender        = sender,
                payee         = payee,
                transfer_date = DateTime.Now,
                transfer_fee  = _appSettings.TransferFee
            };

            var dtoResult = await _transactionRepository.SaveTransferringMoney(fullDto);

            return(dtoResult);
        }
Beispiel #8
0
        public async Task <ActionResult <TransferMoneyResultDto> > Post(TransferMoneyDto dto)
        {
            var viewDto = await _transactionService.TransferMoney(dto);

            return(Ok(viewDto));
        }
Beispiel #9
0
        public async Task TransferMoney([FromBody] TransferMoneyDto request)
        {
            var command = new TransferMoneyCommand(request.SourceAccountNumber, request.DestinationAccountNumber, request.Amount);

            await this.AccountCommands.TransferMoneyAsync(command);
        }