public async Task Create_WithdrawExistingAccount_ShouldReturnTransactions()
        {
            var request = new WithdrawCreateRequest
            {
                AccountId  = 1,
                Ammount    = 100,
                CustomerId = 2,
                Details    = "Test",
            };

            var transferTransactions = WithdrawTransactions(request);

            _mockMediator
            .Setup(m => m.Send(It.Is <WithdrawCreateRequest>(t => t.AccountId == request.AccountId &&
                                                             t.Ammount == request.Ammount &&
                                                             t.CustomerId == request.CustomerId &&
                                                             t.Details == request.Details), default))
            .ReturnsAsync(transferTransactions)
            .Verifiable();

            var controller = new WithdrawController(_mockMediator.Object);

            var result = await controller.Create(request);

            _mockMediator.Verify();

            Assert.True(typeof(CreatedAtActionResult) == result.Result.GetType());
        }
        public async Task Create_WithdrawNonExistingAccount_ShouldReturnNotFound()
        {
            var request = new WithdrawCreateRequest
            {
                AccountId  = 1,
                Ammount    = 100,
                CustomerId = 2,
                Details    = "Test",
            };

            _mockMediator
            .Setup(m => m.Send(It.Is <WithdrawCreateRequest>(t => t.AccountId == request.AccountId &&
                                                             t.Ammount == request.Ammount &&
                                                             t.CustomerId == request.CustomerId &&
                                                             t.Details == request.Details), default))
            .ThrowsAsync(new NotFoundException())
            .Verifiable();

            var controller = new WithdrawController(_mockMediator.Object);

            var result = await controller.Create(request);

            _mockMediator.Verify();

            Assert.True(typeof(NotFoundObjectResult) == result.Result.GetType());
        }
Esempio n. 3
0
        private static void ValidateWithdrawal(WithdrawCreateRequest request, AccountModel account, TransactionType transactionType)
        {
            var ammountToWithdraw = request.Ammount + transactionType.FixedCharge.Value;

            var balanceAfterWithdrawal = account.Balance - ammountToWithdraw;

            if (balanceAfterWithdrawal < 0)
            {
                throw new BusinessException("Your account cannot have a negative balance.");
            }
        }
Esempio n. 4
0
        public async Task <IEnumerable <TransactionModel> > Handle(WithdrawCreateRequest request, CancellationToken cancellationToken)
        {
            var withdrawTransactionType = _repository.TransactionTypeRepository.FindSingle(tt => tt.Code == "W");

            AccountModel account = await GetAccount(request, cancellationToken);

            ValidateWithdrawal(request, account, withdrawTransactionType);

            IEnumerable <TransactionModel> withdrawTransaction = await CreateWithdrawalTransaction(request, account, withdrawTransactionType);

            return(withdrawTransaction);
        }
Esempio n. 5
0
        public async Task <ActionResult <IEnumerable <TransactionModel> > > Create([FromBody, Required] WithdrawCreateRequest request)
        {
            try
            {
                var result = await _mediator.Send(request);

                return(CreatedAtAction(nameof(Create), result));
            }
            catch (BusinessException businessException)
            {
                return(Conflict(new { message = businessException.Message }));
            }
            catch (NotFoundException notFoundException)
            {
                return(NotFound(new { message = notFoundException.Message }));
            }
        }
        public async Task Handle_CreateWithdrawNegativeBalance_ShouldReturnBusinessException()
        {
            var handler = new WithdrawCreateHandler(_mockMediator.Object, _mockRepo.Object);

            var request = new WithdrawCreateRequest {
                AccountId = 1, CustomerId = 1, Ammount = 200
            };
            var account = GetTestAccount();

            _mockMediator
            .Setup(m => m.Send(It.Is <AccountGetRequest>(a => a.AccountId == account.Id), default))
            .Returns(Task.FromResult(account))
            .Verifiable();

            MockWithdrawTransactionType();

            await Assert.ThrowsAsync <BusinessException>(() => handler.Handle(request, default));

            _mockMediator.Verify();
        }
        public async Task Handle_CreateWithdrawl_ShouldReturnTransaction()
        {
            var handler = new WithdrawCreateHandler(_mockMediator.Object, _mockRepo.Object);

            var request = new WithdrawCreateRequest {
                AccountId = 1, CustomerId = 1, Ammount = 10
            };
            var account        = GetTestAccount();
            var withdrawalType = GetWithdrawType();

            var withdrawTransactions = handler.BuildWithdrawalTransactions(request, account, withdrawalType);

            MockWithdrawTransactionType();
            MockMediator(withdrawTransactions, account);

            var result = await handler.Handle(request, default);

            _mockMediator.Verify();
            Assert.IsAssignableFrom <IEnumerable <TransactionModel> >(result);
            Assert.Equal(2, result.Count());
        }
Esempio n. 8
0
        public List <TransactionModel> BuildWithdrawalTransactions(WithdrawCreateRequest request, AccountModel account, TransactionType withdrawalTransactionType)
        {
            var withdrawalTransaction = new TransactionModel
            {
                AccountId         = account.Id,
                Ammount           = -request.Ammount,
                Details           = request.Details,
                TransactionTypeId = withdrawalTransactionType.Id
            };

            var withdrawalSurcharge = new TransactionModel
            {
                AccountId         = account.Id,
                Ammount           = -withdrawalTransactionType.FixedCharge.Value,
                Details           = $"Bank withdrawal surcharge of ${withdrawalTransactionType.FixedCharge.Value}",
                TransactionTypeId = withdrawalTransactionType.Id
            };

            return(new List <TransactionModel> {
                withdrawalTransaction, withdrawalSurcharge
            });
        }
 private List <TransactionModel> WithdrawTransactions(WithdrawCreateRequest request)
 {
     return(new List <TransactionModel>
     {
         new TransactionModel
         {
             AccountId = request.AccountId.Value,
             Ammount = -request.Ammount,
             Date = DateTime.Now,
             Details = request.Details,
             OperationId = 1,
             TransactionTypeId = 2
         },
         new TransactionModel
         {
             AccountId = request.AccountId.Value,
             Ammount = -4,
             Date = DateTime.Now,
             Details = request.Details,
             OperationId = 1,
             TransactionTypeId = 2
         },
     });
 }
Esempio n. 10
0
        private async Task <IEnumerable <TransactionModel> > CreateWithdrawalTransaction(WithdrawCreateRequest request, AccountModel account, TransactionType withdrawalTransactionType)
        {
            List <TransactionModel> transactionsToCreate = BuildWithdrawalTransactions(request, account, withdrawalTransactionType);

            var transactions = await _mediator.Send(new TransactionCreateRequest
            {
                Transactions     = transactionsToCreate,
                OperationDetails = $"Withdrawal: ammount ${request.Ammount} "
            });

            return(transactions);
        }
Esempio n. 11
0
 private async Task <AccountModel> GetAccount(WithdrawCreateRequest request, CancellationToken cancellationToken)
 {
     return(await _mediator.Send(new AccountGetRequest { AccountId = request.AccountId.Value, CustomerId = request.CustomerId }, cancellationToken));
 }