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); }
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 })); }
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); }