public void ProcessTransaction_CardNaoEncontrado_RetornaStatusReasonCartaoInvalido()
        {
            //Arrange
            // Muda Bandeira e Número para valores válidos porém inexistente na base de dados
            inputTransaction.card_brand  = "bedrock_master";
            inputTransaction.card_number = "1111222233334445";

            //Act
            validador.ProcessTransaction(inputTransaction);
            var statusCode   = validador.statusCode;
            var statusReason = validador.statusReason;
            var errors       = validador.errors;

            //Assert
            Assert.AreSame(statusCode, Constantes.scRecusada);
            Assert.AreSame(statusReason, Constantes.srCartaoInvalido);
            Assert.IsTrue(errors.Count > 0);
            Assert.IsTrue(errors[0].error_code == 501);
        }
Beispiel #2
0
        public void ProcessTransaction_CardBloqueado_RetornaStatusReasonCartaoBloqueado()
        {
            //Arrange
            // Usar a transação criada na inicialização sem alterações

            //Act
            validador.ProcessTransaction(inputTransaction);
            var statusCode   = validador.statusCode;
            var statusReason = validador.statusReason;
            var errors       = validador.errors;

            //Assert
            Assert.AreSame(statusCode, Constantes.scRecusada);
            Assert.AreSame(statusReason, Constantes.srCartaoBloqueado);
            Assert.IsTrue(errors.Count > 0);
            Assert.IsTrue(errors[0].error_code == 509);
        }
        public void ProcessTransaction_TransactioTypeNaoInformado_RetornaStatusReasonCampoRequerido()
        {
            //Arrange
            // Limpa Tipo de Transação
            inputTransaction.transaction_type = "";

            //Act
            validador.ProcessTransaction(inputTransaction);
            var statusCode   = validador.statusCode;
            var statusReason = validador.statusReason;
            var errors       = validador.errors;

            //Assert
            Assert.AreSame(statusCode, Constantes.scRecusada);
            Assert.AreSame(statusReason, Constantes.srCampoRequerido);
            Assert.IsTrue(errors.Count > 0);
            Assert.IsTrue(errors[0].error_code == 301);
        }
        public IHttpActionResult CreateTransaction(TransactionApiInputDto transactionApiInputDto)
        {
            //Coloca valor do parâmetro show_errors numa var booleana para uso futuro
            var showErros = transactionApiInputDto.show_errors;

            //Cria lista de erros encontrados durante a validação
            List <Error> errors = new List <Error>();

            var transactionType = new TransactionType();
            var cardBrand       = new CardBrand();
            var card            = new Card();
            var clientInDB      = new Client();

            decimal transAmountInDecimal = 0m;

            //A transação é presumida recusada inicialmente
            var statusCode   = Constantes.scRecusada;
            var statusReason = Constantes.srErroInesperado;

            if (!ModelState.IsValid)
            {
                foreach (var e in ModelState.SelectMany(keyValuePair => keyValuePair.Value.Errors))
                {
                    errors.Add(new Error(500, "Erro Inesperado (" + e.ErrorMessage + ")"));
                }
                //errors.Add(new Error(500, "Erro Inesperado."));
            }

            if (errors.Count == 0)
            {
                var validador = new Validador(_unitOfWork, showErros);
                validador.ProcessTransaction(transactionApiInputDto);

                statusCode   = validador.statusCode;
                statusReason = validador.statusReason;

                transAmountInDecimal = validador.transAmountInDecimal;

                transactionType = validador.transactionType;
                cardBrand       = validador.cardBrand;
                card            = validador.card;
                clientInDB      = validador.clientInDB;

                errors = validador.errors;
            }
            ;

            // *** FIM DA VALIDAÇÂO ***


            //___/ Cria Dto para saida da API \_____________________

            var transactionApiOutputDto = new TransactionApiOutputDto();

            transactionApiOutputDto.amount           = transactionApiInputDto.amount;
            transactionApiOutputDto.card_brand       = transactionApiInputDto.card_brand;
            transactionApiOutputDto.card_holder_name = transactionApiInputDto.card_holder_name;

            var cardNumberFirst = "";
            var cardNumberLast  = "";

            if (!String.IsNullOrEmpty(transactionApiInputDto.card_number))
            {
                cardNumberFirst = transactionApiInputDto.card_number.Substring(1, 4);
                if (transactionApiInputDto.card_number.Length >= 4)
                {
                    cardNumberLast = transactionApiInputDto.card_number.Substring(transactionApiInputDto.card_number.Length - 4, 4);
                }
            }

            transactionApiOutputDto.card_number_first = cardNumberFirst;
            transactionApiOutputDto.card_number_last  = cardNumberLast;

            transactionApiOutputDto.installments       = transactionApiInputDto.installments;
            transactionApiOutputDto.transaction_type   = transactionApiInputDto.transaction_type;
            transactionApiOutputDto.creation_timestamp = DateTime.Now;

            transactionApiOutputDto.status_code   = statusCode;
            transactionApiOutputDto.status_reason = statusReason;

            //Gera registro da transação(transaction log) solicitada para ser salva na base de dados
            var transactionLog = new TransactionLog
            {
                Amount             = transactionApiInputDto.amount,
                Card_brand         = transactionApiInputDto.card_brand,
                Card_holder_name   = transactionApiInputDto.card_holder_name,
                Card_number_first  = cardNumberFirst,
                Card_number_last   = cardNumberLast,
                Installments       = transactionApiInputDto.installments,
                Transaction_type   = transactionApiInputDto.transaction_type,
                Status_code        = statusCode,
                Status_reason      = statusReason,
                Creation_timestamp = DateTime.Now,
            };

            //Adiciona registro de TransactionLog a base de dados
            _unitOfWork.TransactionLogs.Add(transactionLog);

            //Caso algum erro tenha sido encontrado...
            if (errors.Count > 0)
            {
                if (showErros)
                {
                    //Passa todos os erros em errors para errorsDto
                    List <ErrorDto> errorsDto = new List <ErrorDto>();
                    if (errors.Count > 0)
                    {
                        foreach (var e in errors)
                        {
                            var errorDto = new ErrorDto(e.error_code, e.error_message);
                            errorsDto.Add(errorDto);
                            var errorLog = new ErrorLog
                            {
                                TransactionLogId = transactionLog.Id,
                                Error_code       = e.error_code,
                                Error_message    = e.error_message
                            };
                            _unitOfWork.ErrorLogs.Add(errorLog);
                        }
                    }

                    //Adiciona erros à TransactionApiOutputDto
                    transactionApiOutputDto.errors = errorsDto;
                }

                //Atualiza a base de dados
                _unitOfWork.Complete();

                //Adiciona registro de TransactionLog a Dto de saida
                transactionApiOutputDto.transaction_log_id = transactionLog.Id;

                //Retorna TransactionApiPoutputDto como JSon
                return(Json(transactionApiOutputDto));
            }


            // Validação Terminada com Sucesso \__________________

            // Criar a transação vinculada ao cartão e coloca a data de criação
            var transaction = new Transaction {
                Amount            = transAmountInDecimal,
                Card              = card,
                TransactionType   = transactionType,
                Installments      = transactionApiInputDto.installments,
                CreationTimestamp = DateTime.Now,
                TransactionLogId  = transactionLog.Id
            };

            //Adiciona a transação à base de dados
            _unitOfWork.Transactions.Add(transaction);

            //Atualiza o saldo do cliente com o valor da transação
            clientInDB.Saldo = clientInDB.Saldo - transAmountInDecimal;

            //Atualiza a base de dados
            _unitOfWork.Complete();

            //Adiciona registro de TransactionLog a Dto de saida
            transactionApiOutputDto.transaction_log_id = transactionLog.Id;

            //Atualiza a TransactionApiOutputDto com a Id da transação
            transactionApiOutputDto.transaction_id = transaction.Id;

            //Retorna TransactionApiOutputDto como Json e disponibiliza o link para a transação criada
            return(Created(new Uri(Request.RequestUri + "/" + transaction.Id), transactionApiOutputDto));
        }
        public ActionResult Save(TransactionEditViewModel transEditView)
        {
            //Coloca valor do parâmetro show_errors numa var booleana para uso futuro
            var showErros = true;

            //Cria lista de erros encontrados durante a validação
            List <Error> errors = new List <Error>();

            TransactionApiInputDto inputTransaction;
            var transactionType = new TransactionType();
            var cardBrand       = new CardBrand();
            var card            = new Card();
            var clientInDB      = new Client();

            decimal transAmountInDecimal = 0m;

            //A transação é presumida recusada inicialmente
            var statusCode   = Constantes.scRecusada;
            var statusReason = Constantes.srErroInesperado;

            //Pega todos os Transactiontypes(tipos de transações)
            var transactionTypes = _unitOfWork.TransactionTypes.GetAll();
            //Pega todos os CardBrands(bandeiras de cartões)
            var cardBrands = _unitOfWork.CardBrands.GetAll();

            //Atribuindo os TransactionTypes e os CardBrands a viewmodel caso tenhamos que voltar para a view
            transEditView.TransactionTypes = transactionTypes;
            transEditView.CardBrands       = cardBrands;

            //Se algum erro foi gerado até aqui...
            if (!ModelState.IsValid)
            {
                //Retorna a TransactionEditViewModel para a view TransactionForm(nova transação)
                return(View("TransactionForm", transEditView));
            }

            //Esse teste é executado somente aqui e antes de chamar o validador (não é executado no validador)
            var tempAmount    = transEditView.Amount.Replace(",", "");
            var amountIsDigit = tempAmount.All(char.IsDigit);

            //Verifica se todos os caracteres do campo card_number são números
            if (!amountIsDigit)
            {
                ModelState.AddModelError("", "410 - O valor informado não é válido.");
            }

            if (!ModelState.IsValid)
            {
                //Retorna a TransactionEditViewModel para a view TransactionForm(nova transação)
                return(View("TransactionForm", transEditView));
            }

            var dblAmount = Convert.ToDouble(transEditView.Amount);
            var intAmount = Convert.ToInt32(dblAmount * 100);

            //Move os dados da Edit View para a Dto.
            inputTransaction = new TransactionApiInputDto
            {
                amount           = intAmount,
                card_brand       = transEditView.CardBrandApiName,
                card_holder_name = transEditView.CardHolderName,
                card_number      = transEditView.Number,
                cvv = transEditView.Cvv,
                expiration_month = transEditView.ExpirationMonth,
                expiration_year  = transEditView.ExpirationYear,
                installments     = transEditView.Installments,
                password         = transEditView.Password,
                show_errors      = showErros,
                transaction_type = transEditView.TransactionTypeApiName,
            };

            var validador = new Validador(_unitOfWork, showErros);

            validador.ProcessTransaction(inputTransaction);

            statusCode   = validador.statusCode;
            statusReason = validador.statusReason;

            transAmountInDecimal = validador.transAmountInDecimal;

            transactionType = validador.transactionType;
            cardBrand       = validador.cardBrand;
            card            = validador.card;
            clientInDB      = validador.clientInDB;

            errors = validador.errors;

            // *** FIM DAS VALIDAÇÕES ***

            //Adiciona todos os error do validador ao ModelState
            if (errors.Count > 0)
            {
                foreach (var e in errors)
                {
                    ModelState.AddModelError("", e.error_code + " - " + e.error_message);
                }
            }

            if (!ModelState.IsValid)
            {
                //Retorna a TransactionEditViewModel para a view TransactionForm(nova transação)
                return(View("TransactionForm", transEditView));
            }


            // Validação Terminada com Sucesso \__________________

            var cardNumberFirst = "";
            var cardNumberLast  = "";

            if (!String.IsNullOrEmpty(transEditView.Number))
            {
                cardNumberFirst = transEditView.Number.Substring(1, 4);
                if (transEditView.Number.Length >= 4)
                {
                    cardNumberLast = transEditView.Number.Substring(transEditView.Number.Length - 4, 4);
                }
            }

            //Gera registro da transação(transaction log) solicitada para ser salva na base de dados
            var transactionLog = new TransactionLog
            {
                Amount             = Convert.ToInt32(transAmountInDecimal * 100),
                Card_brand         = card.CardBrand.ApiName,
                Card_holder_name   = transEditView.CardHolderName,
                Card_number_first  = cardNumberFirst,
                Card_number_last   = cardNumberLast,
                Installments       = transEditView.Installments,
                Transaction_type   = transEditView.TransactionTypeApiName,
                Status_code        = statusCode,
                Status_reason      = statusReason,
                Creation_timestamp = DateTime.Now,
                //Errors = null
            };

            //Adiciona registro no log de transações ao banco de dados
            _unitOfWork.TransactionLogs.Add(transactionLog);

            if (errors.Count > 0)
            {
                foreach (var e in errors)
                {
                    var errorLog = new ErrorLog
                    {
                        TransactionLogId = transactionLog.Id,
                        Error_code       = e.error_code,
                        Error_message    = e.error_message
                    };
                    _unitOfWork.ErrorLogs.Add(errorLog);
                }
            }
            ;

            //Criar a transação vinculada ao cartão e coloca a data de criação
            var transaction = new Transaction {
                Amount            = transAmountInDecimal,
                CardId            = card.Id,
                CreationTimestamp = DateTime.Now,
                Installments      = transEditView.Installments,
                TransactionTypeId = transactionType.Id,
                TransactionLogId  = transactionLog.Id
            };

            //Adiciona a transação ao banco de dados
            _unitOfWork.Transactions.Add(transaction);

            //Atualiza o saldo do cliente com o valor da transação.
            clientInDB.Saldo = clientInDB.Saldo - transaction.Amount;

            _unitOfWork.Complete();

            //Retorna a TransactionEditViewModel para a view Index(listagem de transações)
            return(RedirectToAction("Index", new { cardId = transaction.CardId }));
        }
Beispiel #6
0
        public void ProcessTransaction_TransactionTypeInvalido_RetornaStatusReasonCampoInvalido()
        {
            //Arrange
            // Muda Tipo de Transação para um valor inválido
            inputTransaction.transaction_type = "drebito";

            //Act
            validador.ProcessTransaction(inputTransaction);
            var statusCode   = validador.statusCode;
            var statusReason = validador.statusReason;
            var errors       = validador.errors;

            //Assert
            Assert.AreSame(statusCode, Constantes.scRecusada);
            Assert.AreSame(statusReason, Constantes.srCampoInvalido);
            Assert.IsTrue(errors.Count > 0);
            Assert.IsTrue(errors[0].error_code == 401);
        }