public void TestWithdrawMoney() { //Arrange const int amount = 100500; const decimal balance = 200500; var operationId = Guid.NewGuid(); var allCash = new Money { Amount = 240000, Notes = new Dictionary <PaperNote, int> { { PaperNote.Twenty, 2000 }, { PaperNote.Fifty, 4000 } } }; var resultCash = new Money { Amount = amount, Notes = new Dictionary <PaperNote, int> { { PaperNote.Fifty, 2010 } } }; _cashProcessor.Cash.Returns(allCash); _cashProcessor.MinDenomination().Returns(PaperNote.Twenty); _cashProcessor.WithdrawMoney(amount).Returns(resultCash); _cardProcessor.GetCardBalance().Returns(balance); _cardProcessor.BlockAmount(amount).Returns(operationId); //Act var result = _atMachine.WithdrawMoney(amount); //Assert Received.InOrder(() => { _cashProcessor.MinDenomination(); _cardProcessor.GetCardBalance(); _cardProcessor.BlockAmount(Arg.Is(amount)); _cashProcessor.WithdrawMoney(Arg.Is(amount)); _cardProcessor.WithdrawFromBlocked(Arg.Is(operationId)); }); Assert.Equal(resultCash, result); }
/// <summary> /// Preliminary checks the possiblity of withdrawal /// </summary> /// <param name="amount">Requested amount</param> private void WithdrawalValidation(int amount) { if (amount <= 0) { throw new InvalidAmountException(); } if (amount > _cashProcessor.Cash.Amount) { throw new AmountIsTooBigException(); } var minBankNote = (int)_cashProcessor.MinDenomination(); if (amount % minBankNote != 0) { throw new AmountIsNotMultipleException(minBankNote); } if (amount > _cardProcessor.GetCardBalance()) { throw new InsufficientFundsException(); } }