public async Task WhenHandlingPaymentRequestGatewayShouldCallPaymentProcessor() { var request = new GatewayPaymentRequest { MerchantId = Guid.NewGuid().ToString(), MerchantReferenceNumber = Guid.NewGuid().ToString(), LongNumber = "1111 1111 1111 1111" }; paymentProcessor.Setup(p => p.HandlePaymentRequest(It.IsAny <PaymentProcessorRequest>())) .Returns(Task.FromResult(new PaymentProcessorResponse { IsSuccess = true })); var gatewayResponse = await gateway.HandlePaymentRequest(request); Check.That(gatewayResponse).IsNotNull(); paymentProcessor.Verify(p => p.HandlePaymentRequest(It.IsAny <PaymentProcessorRequest>()), Times.Once); var storedRequest = await repository.RetrieveRequest(gatewayResponse.GatewayId); Check.That(storedRequest).IsNotNull(); Check.That(storedRequest.MerchantId).Equals(request.MerchantId); Check.That(storedRequest.MerchantReferenceNumber).Equals(request.MerchantReferenceNumber); Check.That(storedRequest.LongNumber).IsNotEqualTo(request.LongNumber); Check.That(storedRequest.TruncatedNumber).IsNotNull(); var responseDetails = await repository.RetrieveDetails(request.MerchantId, request.MerchantReferenceNumber); Check.That(responseDetails).IsNotNull(); Check.That(responseDetails.MerchantId).Equals(request.MerchantId); Check.That(responseDetails.MerchantReferenceNumber).Equals(request.MerchantReferenceNumber); }
public void WillEncryptLongNumberAndProduceTruncatedOne() { var request = new GatewayPaymentRequest { LongNumber = "1111222233334444" }; var encrypted = CardEncryptor.EncryptCardData(request); Check.That(encrypted.TruncatedNumber).Equals("4444"); Check.That(encrypted.LongNumber).IsNotEqualTo(request.LongNumber); }
public static PaymentProcessorRequest MapRequest(GatewayPaymentRequest request) { return(new PaymentProcessorRequest { CCV = request.CVV, LongCardNumber = request.LongNumber, NameOnCard = request.NameOnCard, ValidFrom = request.ValidFrom, ValidTo = request.ValidTo, PaymentAmount = request.PaymentAmount, PaymentCurrency = request.PaymentCurrency }); }
public async Task <GatewayResponse> HandlePaymentRequest(GatewayPaymentRequest request) { var encyptedRequest = CardEncryptor.EncryptCardData(request); var gatewayId = await repository.RegisterPaymentRequest(encyptedRequest); var paymentRequest = PaymentProcessorMapper.MapRequest(request); var result = await paymentProcessor.HandlePaymentRequest(paymentRequest); var response = PaymentProcessorMapper.MapResponse(result, encyptedRequest); await repository.RegisterResponse(response); return(response); }
public static GatewayResponse MapResponse(PaymentProcessorResponse response, GatewayPaymentRequest request) { return(new GatewayResponse { MerchantId = request.MerchantId, MerchantReferenceNumber = request.MerchantReferenceNumber, TimeStamp = request.TimeStamp, GatewayId = request.GatewayId, IsSuccess = response.IsSuccess, FailureReason = response.FailureReason, PaymentProcessorId = response.PaymentProcessorReference, TruncatedCardNumber = request.TruncatedNumber, PaymentAmount = request.PaymentAmount, PaymentCurrency = request.PaymentCurrency }); }
public static GatewayPaymentRequest EncryptCardData(GatewayPaymentRequest originalRequest) { var encrypted = new GatewayPaymentRequest { CVV = originalRequest.CVV, LongNumber = "**********", MerchantId = originalRequest.MerchantId, MerchantReferenceNumber = originalRequest.MerchantReferenceNumber, NameOnCard = originalRequest.NameOnCard, PaymentAmount = originalRequest.PaymentAmount, PaymentCurrency = originalRequest.PaymentCurrency, TimeStamp = originalRequest.TimeStamp, TruncatedNumber = originalRequest.LongNumber.Substring(Math.Max(0, originalRequest.LongNumber.Length - 4)), ValidFrom = originalRequest.ValidFrom, ValidTo = originalRequest.ValidTo }; return(encrypted); }
public Task <string> RegisterPaymentRequest(GatewayPaymentRequest request) { request.GatewayId = Guid.NewGuid().ToString(); requests.Add(request); return(Task.FromResult(request.GatewayId)); }