From bf99b47db4bec6382c4cc0211aba89e987d94897 Mon Sep 17 00:00:00 2001 From: Vincent Kok Date: Wed, 10 Jul 2024 19:37:29 +0200 Subject: [PATCH] Create a constructor overload for payment method specific payment requests (#384) --- .../ApplePayPaymentRequest.cs | 9 ++++- .../BankTransferPaymentRequest.cs | 7 ++++ .../CreditCardPaymentRequest.cs | 7 ++++ .../GiftcardPaymentRequest.cs | 9 ++++- .../IDealPaymentRequest.cs | 7 ++++ .../KbcPaymentRequest.cs | 9 ++++- .../PayPalPaymentRequest.cs | 7 ++++ .../PaySafeCardPaymentRequest.cs | 9 ++++- .../Przelewy24PaymentRequest.cs | 7 ++++ .../SepaDirectDebitRequest.cs | 7 ++++ .../Payment/Request/PaymentRequestTests.cs | 39 +++++++++++++++++++ 11 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 tests/Mollie.Tests.Unit/Models/Payment/Request/PaymentRequestTests.cs diff --git a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/ApplePayPaymentRequest.cs b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/ApplePayPaymentRequest.cs index e81d3395..6da81fa7 100644 --- a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/ApplePayPaymentRequest.cs +++ b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/ApplePayPaymentRequest.cs @@ -1,10 +1,17 @@ -namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { +using System.Diagnostics.CodeAnalysis; + +namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { public record ApplePayPaymentRequest : PaymentRequest { public ApplePayPaymentRequest() { Method = PaymentMethod.ApplePay; } + [SetsRequiredMembers] + public ApplePayPaymentRequest(PaymentRequest paymentRequest) : base(paymentRequest) { + Method = PaymentMethod.ApplePay; + } + /// /// Optional - The Apple Pay Payment Token object (encoded as JSON) that is part of the result of authorizing a payment /// request. The token contains the payment information needed to authorize the payment. diff --git a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/BankTransferPaymentRequest.cs b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/BankTransferPaymentRequest.cs index d4959b54..51cb56c0 100644 --- a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/BankTransferPaymentRequest.cs +++ b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/BankTransferPaymentRequest.cs @@ -1,9 +1,16 @@ +using System.Diagnostics.CodeAnalysis; + namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { public record BankTransferPaymentRequest : PaymentRequest { public BankTransferPaymentRequest() { Method = PaymentMethod.BankTransfer; } + [SetsRequiredMembers] + public BankTransferPaymentRequest(PaymentRequest paymentRequest) : base(paymentRequest) { + Method = PaymentMethod.BankTransfer; + } + /// /// Optional - Consumer's e-mail address, to automatically send the bank transfer details to. Please note: the payment /// instructions will be sent immediately when creating the payment. if you don't specify the locale parameter, the diff --git a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/CreditCardPaymentRequest.cs b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/CreditCardPaymentRequest.cs index 217e27b0..b2017a67 100644 --- a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/CreditCardPaymentRequest.cs +++ b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/CreditCardPaymentRequest.cs @@ -1,9 +1,16 @@ +using System.Diagnostics.CodeAnalysis; + namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { public record CreditCardPaymentRequest : PaymentRequest { public CreditCardPaymentRequest() { Method = PaymentMethod.CreditCard; } + [SetsRequiredMembers] + public CreditCardPaymentRequest(PaymentRequest paymentRequest) : base(paymentRequest) { + Method = PaymentMethod.CreditCard; + } + /// /// The card token you get from Mollie Components. The token contains the card information /// (such as card holder, card number and expiry date) needed to complete the payment. diff --git a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/GiftcardPaymentRequest.cs b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/GiftcardPaymentRequest.cs index 235a21a1..0120d691 100644 --- a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/GiftcardPaymentRequest.cs +++ b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/GiftcardPaymentRequest.cs @@ -1,9 +1,16 @@ -namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { +using System.Diagnostics.CodeAnalysis; + +namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { public record GiftcardPaymentRequest : PaymentRequest { public GiftcardPaymentRequest() { Method = PaymentMethod.GiftCard; } + [SetsRequiredMembers] + public GiftcardPaymentRequest(PaymentRequest paymentRequest) : base(paymentRequest) { + Method = PaymentMethod.GiftCard; + } + /// /// The gift card brand to use for the payment. These issuers are not dynamically available through the Issuers API, /// but can be retrieved by using the issuers include in the Methods API. If you need a brand not in the list, contact diff --git a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/IDealPaymentRequest.cs b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/IDealPaymentRequest.cs index a6926a2e..d00e5d43 100644 --- a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/IDealPaymentRequest.cs +++ b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/IDealPaymentRequest.cs @@ -1,9 +1,16 @@ +using System.Diagnostics.CodeAnalysis; + namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { public record IdealPaymentRequest : PaymentRequest { public IdealPaymentRequest() { Method = PaymentMethod.Ideal; } + [SetsRequiredMembers] + public IdealPaymentRequest(PaymentRequest paymentRequest) : base(paymentRequest) { + Method = PaymentMethod.Ideal; + } + /// /// (Optional) iDEAL issuer id. The id could for example be ideal_INGBNL2A. The returned paymentUrl will then directly /// point to the ING web site. diff --git a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/KbcPaymentRequest.cs b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/KbcPaymentRequest.cs index 092a7375..617146f1 100644 --- a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/KbcPaymentRequest.cs +++ b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/KbcPaymentRequest.cs @@ -1,9 +1,16 @@ -namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { +using System.Diagnostics.CodeAnalysis; + +namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { public record KbcPaymentRequest : PaymentRequest { public KbcPaymentRequest() { Method = PaymentMethod.Kbc; } + [SetsRequiredMembers] + public KbcPaymentRequest(PaymentRequest paymentRequest) : base(paymentRequest) { + Method = PaymentMethod.Kbc; + } + /// /// The issuer to use for the KBC/CBC payment. These issuers are not dynamically available through the Issuers API, /// but can be retrieved by using the issuers include in the Methods API. See the Mollie.Api.Models.Payment.Request.KbcIssuer diff --git a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/PayPalPaymentRequest.cs b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/PayPalPaymentRequest.cs index ff6cb7cc..c1e92692 100644 --- a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/PayPalPaymentRequest.cs +++ b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/PayPalPaymentRequest.cs @@ -1,9 +1,16 @@ +using System.Diagnostics.CodeAnalysis; + namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { public record PayPalPaymentRequest : PaymentRequest { public PayPalPaymentRequest() { Method = PaymentMethod.PayPal; } + [SetsRequiredMembers] + public PayPalPaymentRequest(PaymentRequest paymentRequest) : base(paymentRequest) { + Method = PaymentMethod.PayPal; + } + /// /// The unique ID you have used for the PayPal fraud library. You should include this if you use PayPal /// for an on-demand payment. The maximum character length is 32. diff --git a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/PaySafeCardPaymentRequest.cs b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/PaySafeCardPaymentRequest.cs index cc596b2e..0f24ae36 100644 --- a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/PaySafeCardPaymentRequest.cs +++ b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/PaySafeCardPaymentRequest.cs @@ -1,9 +1,16 @@ -namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { +using System.Diagnostics.CodeAnalysis; + +namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { public record PaySafeCardPaymentRequest : PaymentRequest { public PaySafeCardPaymentRequest() { Method = PaymentMethod.PaySafeCard; } + [SetsRequiredMembers] + public PaySafeCardPaymentRequest(PaymentRequest paymentRequest) : base(paymentRequest) { + Method = PaymentMethod.PaySafeCard; + } + /// /// Used for consumer identification. For example, you could use the consumer’s IP address. /// diff --git a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/Przelewy24PaymentRequest.cs b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/Przelewy24PaymentRequest.cs index b9c4a734..96a8280c 100644 --- a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/Przelewy24PaymentRequest.cs +++ b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/Przelewy24PaymentRequest.cs @@ -1,3 +1,5 @@ +using System.Diagnostics.CodeAnalysis; + namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { public record Przelewy24PaymentRequest : PaymentRequest @@ -7,6 +9,11 @@ public Przelewy24PaymentRequest() Method = PaymentMethod.Przelewy24; } + [SetsRequiredMembers] + public Przelewy24PaymentRequest(PaymentRequest paymentRequest) : base(paymentRequest) { + Method = PaymentMethod.Przelewy24; + } + /// /// Consumer�s email address, this is required for Przelewy24 payments. /// diff --git a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/SepaDirectDebitRequest.cs b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/SepaDirectDebitRequest.cs index 77a0ff0e..6c1dc71a 100644 --- a/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/SepaDirectDebitRequest.cs +++ b/src/Mollie.Api/Models/Payment/Request/PaymentSpecificParameters/SepaDirectDebitRequest.cs @@ -1,9 +1,16 @@ +using System.Diagnostics.CodeAnalysis; + namespace Mollie.Api.Models.Payment.Request.PaymentSpecificParameters { public record SepaDirectDebitRequest : PaymentRequest { public SepaDirectDebitRequest() { Method = PaymentMethod.DirectDebit; } + [SetsRequiredMembers] + public SepaDirectDebitRequest(PaymentRequest paymentRequest) : base(paymentRequest) { + Method = PaymentMethod.DirectDebit; + } + /// /// Optional - Beneficiary name of the account holder. /// diff --git a/tests/Mollie.Tests.Unit/Models/Payment/Request/PaymentRequestTests.cs b/tests/Mollie.Tests.Unit/Models/Payment/Request/PaymentRequestTests.cs new file mode 100644 index 00000000..1e92205d --- /dev/null +++ b/tests/Mollie.Tests.Unit/Models/Payment/Request/PaymentRequestTests.cs @@ -0,0 +1,39 @@ +using System; +using FluentAssertions; +using Mollie.Api.Models; +using Mollie.Api.Models.Payment; +using Mollie.Api.Models.Payment.Request; +using Mollie.Api.Models.Payment.Request.PaymentSpecificParameters; +using Xunit; + +namespace Mollie.Tests.Unit.Models.Payment.Request; + +public class PaymentRequestTests { + [Theory] + [InlineData(PaymentMethod.CreditCard, typeof(CreditCardPaymentRequest))] + [InlineData(PaymentMethod.Ideal, typeof(IdealPaymentRequest))] + public void CreatePaymentRequest(string paymentMethod, Type expectedType) { + var amount = new Amount(Currency.EUR, 50m); + var description = "my-description"; + var paymentRequest = new PaymentRequest() { + Amount = amount, + Description = description + }; + switch (paymentMethod) { + case PaymentMethod.CreditCard: + paymentRequest = new CreditCardPaymentRequest(paymentRequest) { + CardToken = "card-token" + }; + break; + case PaymentMethod.Ideal: + paymentRequest = new IdealPaymentRequest(paymentRequest) { + Issuer = "ideal_issuer" + }; + break; + } + + paymentRequest.Should().BeOfType(expectedType); + paymentRequest.Amount.Should().Be(amount); + paymentRequest.Description.Should().Be(description); + } +}