Пример #1
0
        public async Task Process_PaymentRequest_ReturnsPaymentResponse()
        {
            // Arrange
            var logger = Substitute.For <ILogger <PaymentsController> >();
            var paymentRequestProcessorSub = Substitute.For <IPaymentRequestProcessor>();
            var paymentRequestDto          = new PaymentRequestDto
            {
                MerchantId     = 0,
                CardHolderName = "John Smith",
                CardNumber     = "1234 1234 1234 1234",
                Amount         = 100.00M,
                Currency       = "GBP",
                CVV            = "123",
                ExpiryDate     = DateTime.Now
            };
            var money = new Money(paymentRequestDto.Amount, paymentRequestDto.Currency);
            var acquiringBankPaymentId = Guid.NewGuid().ToString();
            var timestamp = DateTime.Now;

            paymentRequestProcessorSub
            .Process(Arg.Is <PaymentRequest>(p => p.CardNumber == paymentRequestDto.CardNumber.Replace(" ", string.Empty)))
            .Returns(Task.FromResult(new Payment(1,
                                                 100,
                                                 "John Smith",
                                                 "123412******1234",
                                                 paymentRequestDto.ExpiryDate,
                                                 money,
                                                 acquiringBankPaymentId,
                                                 PaymentStatus.Approved,
                                                 timestamp)));
            var paymentFinderSub = Substitute.For <IPaymentFinder>();
            var controller       = new PaymentsController(paymentRequestProcessorSub, paymentFinderSub, logger);

            // Act
            var response = await controller.Process(paymentRequestDto);

            // Assert
            Assert.NotNull(response);
            Assert.NotNull(response.Result);
            Assert.IsType <OkObjectResult>(response.Result);
            var result = (OkObjectResult)response.Result;
            var value  = (PaymentResponseDto)result.Value;

            Assert.Equal(value.AcquiringBankPaymentId, acquiringBankPaymentId);
            Assert.Equal(value.Status, PaymentStatus.Approved.ToString());
            Assert.Equal(value.Timestamp, timestamp);
        }