public async void MultipleSimultaneousWithdrawTransactions() { // Arrange var cashCard = new CashCard(_testsFixture.MockPinService.Object, 1, 5m); // Act var withdrawTask1 = Task.Run(() => { return(cashCard.WithdrawCash(1234, 5m)); }); var withdrawTask2 = Task.Run(() => { return(cashCard.WithdrawCash(1234, 5m)); }); var withdrawTask3 = Task.Run(() => { return(cashCard.WithdrawCash(1234, 5m)); }); await Task.WhenAll(withdrawTask1, withdrawTask2, withdrawTask3); // Assert // Check that we received exactly 2 rejections for insufficient balance from the 3 operations var rejectionReasons = new List <RejectionReasonEnum?>() { withdrawTask1.Result.RejectionReason, withdrawTask2.Result.RejectionReason, withdrawTask3.Result.RejectionReason }; Assert.Single(rejectionReasons.Where(x => x == null)); Assert.Equal(2, rejectionReasons.Where(x => x == RejectionReasonEnum.InsufficientBalance).Count()); Assert.Equal(0m, withdrawTask1.Result.RemainingBalance); Assert.Equal(0m, withdrawTask2.Result.RemainingBalance); Assert.Equal(0m, withdrawTask3.Result.RemainingBalance); }
public void CorrectPinCorrectAmountWithdrawSucceeds(decimal balance, decimal withdrawAmount) { // Arrange var cashCard = new CashCard(_testsFixture.MockPinService.Object, 1, balance); // Act var result = cashCard.WithdrawCash(1234, withdrawAmount); // Assert Assert.Null(result.RejectionReason); Assert.Equal(balance - withdrawAmount, result.RemainingBalance); }
public void CorrectPinAmountTooLargeWithdrawRejected(decimal withdrawAmount, decimal balance) { // Arrange var cashCard = new CashCard(_testsFixture.MockPinService.Object, 1, balance); // Act var result = cashCard.WithdrawCash(1234, withdrawAmount); // Assert Assert.Equal(RejectionReasonEnum.InsufficientBalance, result.RejectionReason); Assert.Equal(balance, result.RemainingBalance); }
public void IncorrectPinWithdrawRejectedBalanceNotRevealed(decimal withdrawAmount, decimal balance) { // Arrange var cashCard = new CashCard(_testsFixture.MockPinService.Object, 1, balance); // Act var result = cashCard.WithdrawCash(1111, withdrawAmount); // Assert Assert.Equal(RejectionReasonEnum.IncorrectPin, result.RejectionReason); Assert.Equal(0, result.RemainingBalance); }