Exemplo n.º 1
0
        public async Task ProcessPaymentAsync_ForValidRequestHavingAmountGreaterThan500AndPremiumFailsFirst2TimesAndPassedNextTime_PremiumGatewayIsCalled3TimesAndReturnsProcessedStatusAsync()
        {
            //Arrange
            var model = GetPaymentRequestModel(550);

            _premiumPaymentGateway.ProcessPaymentAsync(Arg.Any <PaymentRequestModel>())
            .Returns(x => throw new Exception(), x => throw new Exception(), x => Task.FromResult(PaymentStatus.Processed));

            _unitOfWork.PaymentsRepository.When(x => x.AddAsync(Arg.Any <PaymentEntities.Entities.Payment>())).Do(x => { });
            _unitOfWork.When(x => x.Complete()).Do(x => { });

            //Act
            var actual = await _paymentBusiness.ProcessPaymentAsync(model);

            //Assert

            Assert.AreEqual(PaymentStatus.Processed, actual);

            _serviceAccessor.Received(2).Invoke(Arg.Any <string>());
            await _cheapPaymentGateway.Received(0).ProcessPaymentAsync(Arg.Any <PaymentRequestModel>());

            await _expensivePaymentGateway.Received(0).ProcessPaymentAsync(Arg.Any <PaymentRequestModel>());

            await _expensivePaymentGateway.Received(0).IsAvailableAsync();

            await _premiumPaymentGateway.Received(3).ProcessPaymentAsync(Arg.Any <PaymentRequestModel>());

            await _unitOfWork.PaymentsRepository.Received(1).AddAsync(Arg.Any <PaymentEntities.Entities.Payment>());

            _unitOfWork.Received(1).Complete();
            _logger.Received(2).LogError(Arg.Any <Exception>());
        }