public void TransferMoney_HappyPath_TransfersMoney()
        {
            // Arrange

            var model = new TransferMoneyModel
            {
                SourceAccountNumber      = "test1",
                DestinationAccountNumber = "test2",
                Amount = 123
            };

            var controller = new AccountController(bankServiceMock.Object, sessionManagerMock.Object, emailService.Object);

            // Act
            RedirectToRouteResult result = controller.TransferMoney(model) as RedirectToRouteResult;

            // Assert
            Assert.IsNotNull(result);

            // assert TransferMoney was called on the bank service
            bankServiceMock.Verify(m => m.TransferMoney("test1", "test2", 123), Times.Once);

            // assert the source account number was stored in the session
            sessionManagerMock.Verify(m => m.Store("SourceAccountNumber", "test1"));

            // assert the confirmation email was sent
            emailService.Verify(m => m.SendTransferEmailConfirmation("test1", "test2", 123), Times.Once);

            // assert the result is a redirect to Index
            Assert.AreSame("Index", result.RouteValues["action"]);
        }
        // GET api/values

        // POST api/values
        public string Post(TransferMoneyModel model)
        {
            var from   = AccountService.GetAccount(model.FromAccount);
            var to     = AccountService.GetAccount(model.ToAccount);
            var result = TransactionService.Transfer(from, to, model.Amount);

            return(result.ToString());
        }
Beispiel #3
0
        public void Transfer(TransferMoneyModel model)
        {
            //TODO: - show refactoring strength when having UTs (->domsrv)

            var from = _db.Accounts.FirstOrDefault(a => a.Iban == model.IbanFrom);
            var to   = _db.Accounts.FirstOrDefault(a => a.Iban == model.IbanTo);

            var transferService = new TransferService();

            transferService.Transfer(from, to, model.Amount);

            _db.SaveChanges();
        }
        public async Task <ActionResult> Transfer(int id, [FromBody] TransferMoneyModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            var sender = await _context.Accounts.FindAsync(id);

            var recepient = await _context.Accounts.FindAsync(model.RecipientId);

            if (sender == null || recepient == null)
            {
                return(NotFound("Account not found"));
            }

            if (sender.Balance < model.Amount)
            {
                return(BadRequest("Not enough money,  milord)"));
            }

            using (var transaction = _context.Database.BeginTransaction())
            {
                try
                {
                    var transfer = new Transfer()
                    {
                        SenderId    = sender.Id,
                        RecipientId = recepient.Id,
                        Amount      = model.Amount
                    };
                    _context.Transfers.Add(transfer);

                    sender.Balance    -= model.Amount;
                    recepient.Balance += model.Amount;

                    await _context.SaveChangesAsync();

                    await transaction.CommitAsync();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    return(StatusCode(500));
                }
            }

            return(Ok());
        }
        public void TransferMoney_WithSameAccount_HasInvalidModelState()
        {
            // Arrange

            var model = new TransferMoneyModel
            {
                SourceAccountNumber      = "test1",
                DestinationAccountNumber = "test1",
                Amount = 123
            };

            var controller = new AccountController(bankServiceMock.Object, sessionManagerMock.Object, emailService.Object);

            // Act
            ViewResult result = controller.TransferMoney(model) as ViewResult;

            // Assert
            Assert.IsNotNull(result);
            Assert.IsTrue(controller.ModelState.Count > 0);
            Assert.IsTrue(controller.ModelState.ContainsKey("SameAccount"));
        }
        public ActionResult TransferMoney(TransferMoneyModel model)
        {
            if (model.SourceAccountNumber == model.DestinationAccountNumber)
            {
                ModelState.AddModelError("SameAccount", "The source and destination accounts must be different");
            }

            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            try
            {
                bankService.TransferMoney(model.SourceAccountNumber, model.DestinationAccountNumber, model.Amount);
            }
            catch (InsufficientFundsException)
            {
                ModelState.AddModelError("InsufficientFunds", "There were insufficient funds to complete the transfer.");
            }
            catch (AccountNotFoundException ex)
            {
                ModelState.AddModelError("AccountNotFound", $"There was a problem finding account {ex.AccountNumber}.");
            }
            catch
            {
                ModelState.AddModelError("TransferFailed", "There was a problem with the transfer, please contact your bank.");
            }

            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            this.sessionManager.Store("SourceAccountNumber", model.SourceAccountNumber);

            this.emailService.SendTransferEmailConfirmation(model.SourceAccountNumber, model.DestinationAccountNumber, model.Amount);

            return(RedirectToAction("Index"));
        }
Beispiel #7
0
        public ActionResult TransferMoney(TransferMoneyModel model, int id)
        {
            Card card = db.Cards.Find(id);

            model.Balance    = card.Transactions.Sum(p => p.Sum);
            ViewBag.toCardID = new SelectList(db.Cards, "ID", "CardNumber", model.toCardID);
            if (model.UserTypePin == card.Pin)
            {
                if (model.Sum <= model.Balance)
                {
                    Transaction tr = new Transaction();
                    tr.OperationDate = DateTime.Now;
                    tr.CardID        = id;
                    tr.Sum           = -model.Sum;
                    tr.Decription    = model.Description;

                    db.Transactions.Add(tr);
                    db.SaveChanges();
                    card.Balance = card.Transactions.Sum(p => p.Sum);

                    Transaction tr1 = new Transaction();
                    tr1.OperationDate = DateTime.Now;
                    tr1.CardID        = model.toCardID;
                    tr1.Sum           = model.Sum;
                    tr1.Decription    = "Перевод с карты " + tr.Card.CardNumber;

                    db.Transactions.Add(tr1);
                    db.SaveChanges();
                    Card cardTo = db.Cards.Find(id);
                    card.Balance = card.Transactions.Sum(p => p.Sum);

                    return(RedirectToAction("Details", "Card", new { id = tr.CardID }));
                }
                return(View(model));
            }
            return(View(model));
        }
        public void TransferMoney_WithInsufficientFunds_HasInvalidModelState()
        {
            // Arrange

            var model = new TransferMoneyModel
            {
                SourceAccountNumber      = "test1",
                DestinationAccountNumber = "test2",
                Amount = 123
            };

            bankServiceMock.Setup(m => m.TransferMoney(model.SourceAccountNumber, model.DestinationAccountNumber, model.Amount))
            .Throws(new InsufficientFundsException());

            var controller = new AccountController(bankServiceMock.Object, sessionManagerMock.Object, emailService.Object);

            // Act
            ViewResult result = controller.TransferMoney(model) as ViewResult;

            // Assert
            Assert.IsNotNull(result);
            Assert.IsTrue(controller.ModelState.Count > 0);
            Assert.IsTrue(controller.ModelState.ContainsKey("InsufficientFunds"));
        }
 public void Transfer(TransferMoneyModel model)
 {
     new TransferCommandHandler(_db).Transfer(model);
 }