コード例 #1
0
        public void WithdrawBalanceShouldBeEqualToAmount()
        {
            var testUser = users[0];

            var result = WithdrawHelper.WithdrawFromAtm(testUser, atm, 1000);

            Assert.AreEqual(1000, result.Balance);
        }
コード例 #2
0
        public void WithdrawShouldPreferNotesOverCoins()
        {
            var testUser = users[0];

            var result = WithdrawHelper.WithdrawFromAtm(testUser, atm, 1000);

            Assert.AreEqual(0, result.CoinDictionary.Count);
        }
コード例 #3
0
        public async Task <IActionResult> Create
            ([Bind("WithdrawId,WithdrawDate,Amount,AtmId,UserId")] WithdrawViewModel withdraw)
        {
            if (ModelState.IsValid)
            {
                var model = withdraw.ToModel(_context);

                bool hasError = model.AutomatedTellerMachine == null || model.User == null;

                try
                {
                    model.CurrencyDictionary = WithdrawHelper.WithdrawFromAtm(model.User, model.AutomatedTellerMachine, withdraw.Amount, _context);
                }
                catch (InsufficentFundsException)
                {
                    ModelState.AddModelError("UserId", $"User {model.User.Name} has insufficient funds (${model.User.Balance}) to withdraw ${withdraw.Amount}");
                    hasError = true;
                }
                catch (InsufficientChangeException)
                {
                    ModelState.AddModelError("AtmId", $"ATM {model.AutomatedTellerMachine.Alias} has insufficient change to withdraw ${withdraw.Amount}");
                    hasError = true;
                }
                catch
                {
                    throw;
                }

                if (model.AutomatedTellerMachine == null)
                {
                    ModelState.AddModelError("AtmId", "ATM not found");
                }

                if (model.User == null)
                {
                    ModelState.AddModelError("UserId", "User not found");
                }

                if (hasError)
                {
                    ViewBag.Users = await GetUsers();

                    ViewBag.Atms = await GetAtms();

                    return(View(withdraw));
                }

                model.WithdrawDate = DateTime.Now;

                _context.Add(model);
                await _context.SaveChangesAsync();

                (TempData["SuccessMessage"], TempData["InfoMessages"]) = BuildWithdrawMessage(model);

                return(RedirectToAction("Index"));
            }
            return(View(withdraw));
        }
コード例 #4
0
        public void WithdrawShouldRemoveBalanceFromUser()
        {
            var testUser = users[0];

            var balance = testUser.Balance;

            WithdrawHelper.WithdrawFromAtm(testUser, atm, 1000);

            Assert.AreEqual(balance - 1000, testUser.Balance);
        }
コード例 #5
0
        public void NegativeWithdrawShouldYieldNothing()
        {
            var testUser = users[0];

            var result = WithdrawHelper.WithdrawFromAtm(testUser, atm, -1);

            var coinCount = result.CoinDictionary.Count;
            var noteCount = result.NoteDictionary.Count;

            Assert.AreEqual((0, 0), (coinCount, noteCount));
        }
コード例 #6
0
        public void WithdrawShouldYieldRightChange()
        {
            var testUser = users[0];

            var result = WithdrawHelper.WithdrawFromAtm(testUser, atm, 578);

            var noteFiveHundredCount = result
                                       .NoteDictionary
                                       .Count(c => c.Key.Value == 500);

            var noteFiftyCount = result
                                 .NoteDictionary
                                 .Count(c => c.Key.Value == 50);

            var coinTwentyCount = result
                                  .CoinDictionary
                                  .Count(c => c.Key.Value == 20);

            var coinFiveCount = result
                                .CoinDictionary
                                .Count(c => c.Key.Value == 5);

            var coinTwoCount = result
                               .CoinDictionary
                               .Count(c => c.Key.Value == 2);

            var coinOneCount = result
                               .CoinDictionary
                               .Count(c => c.Key.Value == 1);

            var actual = (
                noteFiveHundredCount,
                noteFiftyCount,
                coinTwentyCount,
                coinFiveCount,
                coinTwoCount,
                coinOneCount);

            var expected = (1, 1, 1, 1, 1, 1);

            Assert.AreEqual(expected, actual);
        }
コード例 #7
0
        public void EmptyAtmShouldNotWithdraw()
        {
            var testUser = users[0];

            WithdrawHelper.WithdrawFromAtm(testUser, emptyAtm, 1);
        }
コード例 #8
0
        public void UserWithdrawShouldThrowIfAtmHasNotEnoughChange()
        {
            var testUser = users[0];

            WithdrawHelper.WithdrawFromAtm(testUser, atm, 99999999);
        }
コード例 #9
0
        public void UserWithdrawWithInsufficientFundsShouldThrow()
        {
            var testUser = users[1];

            WithdrawHelper.WithdrawFromAtm(testUser, atm, 3000);
        }