Exemplo n.º 1
0
        public async Task <ActionResult> Post(LancamentoRequest lancamentoRequest, CancellationToken cancellationToken)
        {
            var result = await _lancamentoAppService.PerformOperationAsync(lancamentoRequest, cancellationToken);

            return
                (StatusCode((int)result.StatusCode, result));
        }
Exemplo n.º 2
0
        private Task <Result <decimal> > ValidateOperation(LancamentoRequest lancamentoRequest)
        {
            var objLancamento = base._mapper.Map <LancamentoRequest, Lancamento>(lancamentoRequest);

            if (!objLancamento.IsValid(EValidationStage.Insert))
            {
                return(Task.FromResult(new Result <decimal>(0, HttpStatusCode.BadRequest, objLancamento.ValidationErrors)));
            }

            return(Task.FromResult(new Result <decimal>(0, HttpStatusCode.OK, null)));
        }
Exemplo n.º 3
0
        public async void TestCreateLancamentoDepositoContaDestinoEmptyError()
        {
            var objLancamento = new LancamentoRequest()
            {
                Id             = "ABC",
                EOperacao      = EOperacao.Deposito,
                IdContaDestino = "",
                IdContaOrigem  = "01030-20",
                Valor          = 100
            };
            var result = await _lancamentoApp.InsertOneAsync(objLancamento, _cancellationToken);

            Assert.Contains(result.Failures, x => x.ErrorMessage == "IdContaDestino can't be null.");
            Assert.True(result.StatusCode == HttpStatusCode.BadRequest);
            Assert.True(string.IsNullOrWhiteSpace(result.Value));
        }
Exemplo n.º 4
0
        public async void TestTransferOk()
        {
            var objLancamentoRequest = new LancamentoRequest()
            {
                Id             = "ABC",
                EOperacao      = EOperacao.Transferencia,
                IdContaDestino = "3",
                IdContaOrigem  = "2",
                Valor          = 100
            };
            var result = await _lancamentoApp.PerformOperationAsync(objLancamentoRequest, _cancellationToken);

            Assert.True(result.StatusCode == HttpStatusCode.Created);
            Assert.True(result.Failures == null);
            Assert.True(result.Value == "ABC");
        }
Exemplo n.º 5
0
        public async void TestTransferInsufficientFundsError()
        {
            var objLancamentoRequest = new LancamentoRequest()
            {
                Id             = "ABC",
                EOperacao      = EOperacao.Transferencia,
                IdContaDestino = "2",
                IdContaOrigem  = "3",
                Valor          = 200
            };
            var result = await _lancamentoApp.PerformOperationAsync(objLancamentoRequest, _cancellationToken);

            Assert.True(result.StatusCode == HttpStatusCode.BadRequest);
            Assert.Contains(result.Failures, x => x.ErrorMessage == "Insufficient funds.");
            Assert.True(string.IsNullOrWhiteSpace(result.Value));
        }
Exemplo n.º 6
0
        public async void TestTransferUpdateBalanceError()
        {
            var objLancamentoRequest = new LancamentoRequest()
            {
                Id             = "ABC",
                EOperacao      = EOperacao.Transferencia,
                IdContaDestino = "3",
                IdContaOrigem  = "1",
                Valor          = 100
            };
            var result = await _lancamentoApp.PerformOperationAsync(objLancamentoRequest, _cancellationToken);

            Assert.True(result.StatusCode == HttpStatusCode.InternalServerError);
            Assert.Contains(result.Failures, x => x.ErrorMessage == "Cannot update balance.");
            Assert.True(string.IsNullOrWhiteSpace(result.Value));
        }
Exemplo n.º 7
0
        public async void TestCreateLancamentoEOperacaoInvalidError()
        {
            var objLancamento = new LancamentoRequest()
            {
                Id             = "ABC",
                EOperacao      = (EOperacao)999,
                IdContaDestino = "01020-30",
                IdContaOrigem  = "01030-20",
                Valor          = 100
            };
            var result = await _lancamentoApp.InsertOneAsync(objLancamento, _cancellationToken);

            Assert.Contains(result.Failures, x => x.ErrorMessage == "EOperacao is invalid.");
            Assert.True(result.StatusCode == HttpStatusCode.BadRequest);
            Assert.True(string.IsNullOrWhiteSpace(result.Value));
        }
Exemplo n.º 8
0
        public async void TestWithdrawIdContaOrigemNotFoundError()
        {
            var objLancamentoRequest = new LancamentoRequest()
            {
                Id             = "ABC",
                EOperacao      = EOperacao.Saque,
                IdContaDestino = "",
                IdContaOrigem  = "0",
                Valor          = 100
            };
            var result = await _lancamentoApp.PerformOperationAsync(objLancamentoRequest, _cancellationToken);

            Assert.True(result.StatusCode == HttpStatusCode.NotFound);
            Assert.Contains(result.Failures, x => x.ErrorMessage == "Conta not found.");
            Assert.True(string.IsNullOrWhiteSpace(result.Value));
        }
Exemplo n.º 9
0
        public async void TestPerformOperationInvalidOperationError()
        {
            var objLancamentoRequest = new LancamentoRequest()
            {
                Id             = "ABC",
                EOperacao      = (EOperacao)999,
                IdContaDestino = "",
                IdContaOrigem  = "",
                Valor          = 100
            };
            var result = await _lancamentoApp.PerformOperationAsync(objLancamentoRequest, _cancellationToken);

            Assert.True(result.StatusCode == HttpStatusCode.BadRequest);
            Assert.Contains(result.Failures, x => x.ErrorMessage == "Operation kind not supported.");
            Assert.True(string.IsNullOrWhiteSpace(result.Value));
        }
Exemplo n.º 10
0
        public async void TestReplaceLancamentoValorZeroError()
        {
            var objLancamento = new LancamentoRequest()
            {
                Id             = "ABC",
                EOperacao      = EOperacao.Transferencia,
                IdContaDestino = "01020-20",
                IdContaOrigem  = "01020-30",
                Valor          = 0
            };
            var result = await _lancamentoApp.InsertOneAsync(objLancamento, _cancellationToken);

            Assert.Contains(result.Failures, x => x.ErrorMessage == "Valor must be highter than R$ 0,00.");
            Assert.True(result.StatusCode == HttpStatusCode.BadRequest);
            Assert.True(string.IsNullOrWhiteSpace(result.Value));
        }
Exemplo n.º 11
0
        public async void TestReplaceLancamentoSaqueContaDestinoEmptyOk()
        {
            var objLancamento = new LancamentoRequest()
            {
                Id             = "ABC",
                EOperacao      = EOperacao.Saque,
                IdContaDestino = "",
                IdContaOrigem  = "01020-30",
                Valor          = 100
            };
            var result = await _lancamentoApp.InsertOneAsync(objLancamento, _cancellationToken);

            Assert.True(result.Failures == null);
            Assert.True(result.StatusCode == HttpStatusCode.Created);
            Assert.True(result.Value == "ABC");
        }
Exemplo n.º 12
0
        public async void TestCreateLancamentoTransferenciaContaOrigemSameThatContaDestinoDestinoError()
        {
            var objLancamento = new LancamentoRequest()
            {
                Id             = "ABC",
                EOperacao      = EOperacao.Transferencia,
                IdContaDestino = "01020-30",
                IdContaOrigem  = "01020-30",
                Valor          = 100
            };
            var result = await _lancamentoApp.InsertOneAsync(objLancamento, _cancellationToken);

            Assert.Contains(result.Failures, x => x.ErrorMessage == "IdContaOrigem can't be the same that IdContaDestino.");
            Assert.True(result.StatusCode == HttpStatusCode.BadRequest);
            Assert.True(string.IsNullOrWhiteSpace(result.Value));
        }
Exemplo n.º 13
0
        public async Task <Result <string> > PerformOperationAsync(LancamentoRequest lancamentoRequest, CancellationToken cancellationToken)
        {
            if (lancamentoRequest == null)
            {
                return(new Result <string>(null, HttpStatusCode.BadRequest, Failure.GenerateOneFailure("Object is null.")));
            }

            Result <decimal> result;

            switch (lancamentoRequest.EOperacao)
            {
            case EOperacao.Deposito:
            {
                result = await _lancamentoService.DepositAsync(lancamentoRequest);

                break;
            }

            case EOperacao.Saque:
            {
                result = await _lancamentoService.WithdrawAsync(lancamentoRequest);

                break;
            }

            case EOperacao.Transferencia:
            {
                result = await _lancamentoService.TransferAsync(lancamentoRequest);

                break;
            }

            default:
                return(new Result <string>(null, HttpStatusCode.BadRequest, Failure.GenerateOneFailure("Operation kind not supported.")));
            }

            if (!result.StatusCode.IsSuccessStatusCode())
            {
                return(new Result <string>(null, result.StatusCode, result.Failures));
            }

            return
                (await _lancamentoService.InsertOneAsync(lancamentoRequest, cancellationToken));
        }
Exemplo n.º 14
0
        public async Task <Result <decimal> > WithdrawAsync(LancamentoRequest lancamentoRequest)
        {
            try
            {
                var validation = await ValidateOperation(lancamentoRequest);

                if (!validation.StatusCode.IsSuccessStatusCode())
                {
                    return(validation);
                }

                var sourceAccount = await _contaService.GetByIdAsync <ContaResponse>(lancamentoRequest.IdContaOrigem);

                var sourceAccountRequest = _mapper.Map <ContaResponse, ContaRequest>(sourceAccount.Value);
                lancamentoRequest.ContaOrigem = sourceAccountRequest;

                if (!sourceAccount.StatusCode.IsSuccessStatusCode())
                {
                    return(new Result <decimal>(0, sourceAccount.StatusCode, sourceAccount.Failures));
                }

                var account    = base._mapper.Map <ContaResponse, Conta>(sourceAccount.Value);
                var newBalance = await account.DecreaseBalance(lancamentoRequest.Valor);

                if (!newBalance.StatusCode.IsSuccessStatusCode())
                {
                    return(new Result <decimal>(0, newBalance.StatusCode, newBalance.Failures));
                }

                var updateBalance = await _contaService.UpdateBalanceAsync(account.Id, newBalance.Value);

                if (!updateBalance.StatusCode.IsSuccessStatusCode())
                {
                    return(new Result <decimal>(0, updateBalance.StatusCode, updateBalance.Failures));
                }

                return(new Result <decimal>(newBalance.Value, HttpStatusCode.OK, null));
            }
            catch (Exception ex)
            {
                return(new Result <decimal>(0, HttpStatusCode.InternalServerError, Failure.GenerateOneFailure(ex.Message)));
            }
        }
Exemplo n.º 15
0
        public async Task <Result <decimal> > TransferAsync(LancamentoRequest lancamentoRequest)
        {
            try
            {
                #region Validate the operation
                var validation = await ValidateOperation(lancamentoRequest);

                if (!validation.StatusCode.IsSuccessStatusCode())
                {
                    return(validation);
                }
                #endregion
                #region Map the account object, so we can track the operation
                var sourceAccountResponse = await _contaService.GetByIdAsync <ContaResponse>(lancamentoRequest.IdContaOrigem);

                var targetAccountResponse = await _contaService.GetByIdAsync <ContaResponse>(lancamentoRequest.IdContaDestino);

                var sourceAccountRequest = _mapper.Map <ContaResponse, ContaRequest>(sourceAccountResponse.Value);
                var targetAccountRequest = _mapper.Map <ContaResponse, ContaRequest>(targetAccountResponse.Value);

                lancamentoRequest.ContaOrigem  = sourceAccountRequest;
                lancamentoRequest.ContaDestino = targetAccountRequest;

                if (!sourceAccountResponse.StatusCode.IsSuccessStatusCode())
                {
                    return(new Result <decimal>(0, sourceAccountResponse.StatusCode, sourceAccountResponse.Failures));
                }

                if (!targetAccountResponse.StatusCode.IsSuccessStatusCode())
                {
                    return(new Result <decimal>(0, targetAccountResponse.StatusCode, targetAccountResponse.Failures));
                }

                var sourceAccount = base._mapper.Map <ContaResponse, Conta>(sourceAccountResponse.Value);
                var targetAccount = base._mapper.Map <ContaResponse, Conta>(targetAccountResponse.Value);
                #endregion
                #region Decrease Balance
                var newBalanceSourceAccount = await sourceAccount.DecreaseBalance(lancamentoRequest.Valor);

                if (!newBalanceSourceAccount.StatusCode.IsSuccessStatusCode())
                {
                    return(new Result <decimal>(0, newBalanceSourceAccount.StatusCode, newBalanceSourceAccount.Failures));
                }
                #endregion
                #region Increase Balance
                var newBalanceTargetAccount = await targetAccount.IncreaseBalance(lancamentoRequest.Valor);

                if (!newBalanceTargetAccount.StatusCode.IsSuccessStatusCode())
                {
                    return(new Result <decimal>(0, newBalanceTargetAccount.StatusCode, newBalanceTargetAccount.Failures));
                }
                #endregion
                #region Update Balance
                var updateBalance = await _contaService.UpdateBalanceAsync(sourceAccount.Id, newBalanceSourceAccount.Value);

                if (!updateBalance.StatusCode.IsSuccessStatusCode())
                {
                    return(new Result <decimal>(0, updateBalance.StatusCode, updateBalance.Failures));
                }

                updateBalance = await _contaService.UpdateBalanceAsync(targetAccount.Id, newBalanceTargetAccount.Value);

                if (!updateBalance.StatusCode.IsSuccessStatusCode())
                {
                    return(new Result <decimal>(0, updateBalance.StatusCode, updateBalance.Failures));
                }
                #endregion

                return(new Result <decimal>(newBalanceSourceAccount.Value, HttpStatusCode.OK, null));
            }
            catch (Exception ex)
            {
                return(new Result <decimal>(0, HttpStatusCode.InternalServerError, Failure.GenerateOneFailure(ex.Message)));
            }
        }