Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }