private void CreateTransactionHistoryReport(TransactionInfo tranInfo, CardAccount cardAccount)
 {
     automatedTellerMachineContext.TransactionsHistories.Add(new TransactionsHistory()
     {
         Ammount = tranInfo.MoneyToRetrieve,
         TransactionDate = DateTime.Now,
         CardAccount = cardAccount
     });
 }
        public void TestOnTooShortCardNumberShouldThrowArgumentException()
        {
            var tranInfo = new TransactionInfo()
            {
                CardNumber = "SHORT",
                CardPIN = "0000",
                MoneyToRetrieve = 200
            };

            automatedTellerMachine.RetrieveMoney(tranInfo);
        }
        public void TestOnTooLongCardNumberShouldThrowArgumentException()
        {
            var tranInfo = new TransactionInfo()
            {
                CardNumber = "CARD-NUMBER-TOO-LONG",
                CardPIN = "0000",
                MoneyToRetrieve = 200
            };

            automatedTellerMachine.RetrieveMoney(tranInfo);
        }
   public void TestOnExistingCardAccountAndInValidAmountOfMoneyToRetrieveShouldThrowArgumentException()
   {
       var tranInfo = new TransactionInfo()
       {
           CardNumber = "111-11-111",
           CardPIN = "0000",
           MoneyToRetrieve = -200
       };
 
       automatedTellerMachine.RetrieveMoney(tranInfo);
   }
 private static void PerformTransaction(TransactionInfo tranInfo)
 {
     try
     {
         automatedTellerMachine.RetrieveMoney(tranInfo);
         Console.WriteLine("\rSuccessful transaction!");
     }
     catch (Exception e)
     {
         Console.WriteLine("\r" + e.Message);
     }
 }
        public void RetrieveMoney(TransactionInfo tranInfo)
        {
            using (var transaction = automatedTellerMachineContext.Database.BeginTransaction(IsolationLevel.RepeatableRead))
            {
                try
                {
                    if (!validationController.IsValidCardNumber(tranInfo.CardNumber))
                    {
                        throw new ArgumentException("Invalid card number. Current transaction is aborted!");
                    }

                    if (!validationController.IsValidCardPin(tranInfo.CardPIN))
                    {
                        throw new ArgumentException("Invalid Card PIN Code. Current transaction is aborted!");
                    }

                    var cardAccount = automatedTellerMachineContext.CardAccounts
                                                                   .FirstOrDefault(c => c.CardNumber == tranInfo.CardNumber);

                    if (cardAccount == null)
                    {
                        throw new ArgumentException("There is no Card account with the given Card number. Current transaction is aborted!");
                    }

                    if (!validationController.IsPinCodeMatches(tranInfo.CardPIN, cardAccount.CardPIN))
                    {
                        throw new ArgumentException("Chosen Card PIN Code does not matches the actual PIN Code of the card account. Current transaction is aborted!");
                    }

                    if (!validationController.IsPermittedWithdrawalAmount(tranInfo.MoneyToRetrieve, cardAccount.CardCash))
                    {
                        throw new ArgumentException("Invalid withdrawal money amount to retrieve. Current transaction is aborted!");
                    }

                    cardAccount.CardCash -= tranInfo.MoneyToRetrieve;

                    this.CreateTransactionHistoryReport(tranInfo, cardAccount);

                    transaction.Commit();
                    automatedTellerMachineContext.SaveChanges();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
            }
        }
        public void TestOnExistingCardAccountAndValidAmountOfMoneyToRetrieve()
        {
            var tranInfo = new TransactionInfo()
            {
                CardNumber = "111-11-111",
                CardPIN = "0000",
                MoneyToRetrieve = 200
            };

            var oldTranHistoryCount = automatedTellerMachineContext.TransactionsHistories.Count();
            var oldCardCash = automatedTellerMachine.GetCardAccountCash(tranInfo.CardNumber);

            automatedTellerMachine.RetrieveMoney(tranInfo);

            var newTranHistoryCount = automatedTellerMachineContext.TransactionsHistories.Count();
            var newCardCash = automatedTellerMachine.GetCardAccountCash(tranInfo.CardNumber);

            Assert.AreEqual(oldTranHistoryCount + 1, newTranHistoryCount);
            Assert.AreEqual(oldCardCash - tranInfo.MoneyToRetrieve, newCardCash);
        }
        public void TestValidUnknownCardNumberShouldThrowArgumentException()
        {
            var tranInfo = new TransactionInfo()
            {
                CardNumber = "111-11-999",
                CardPIN = "0000",
                MoneyToRetrieve = 200
            };

            automatedTellerMachine.RetrieveMoney(tranInfo);
        }
        public void TestOnNullCardPinShouldThrowArgumentException()
        {
            var tranInfo = new TransactionInfo()
            {
                CardNumber = "111-11-111",
                CardPIN = null,
                MoneyToRetrieve = 200
            };

            automatedTellerMachine.RetrieveMoney(tranInfo);
        }