diff --git a/src/CheckoutSdk/Payments/IPaymentsClient.cs b/src/CheckoutSdk/Payments/IPaymentsClient.cs index 465f8c62..51b628db 100644 --- a/src/CheckoutSdk/Payments/IPaymentsClient.cs +++ b/src/CheckoutSdk/Payments/IPaymentsClient.cs @@ -29,6 +29,12 @@ Task> GetPaymentActions( string paymentId, CancellationToken cancellationToken = default); + Task CancelAScheduledRetry( + string paymentId, + CancelAScheduledRetryRequest cancelAScheduledRetryRequest, + string idempotencyKey = null, + CancellationToken cancellationToken = default); + Task CapturePayment( string paymentId, CaptureRequest captureRequest = null, diff --git a/src/CheckoutSdk/Payments/PaymentsClient.cs b/src/CheckoutSdk/Payments/PaymentsClient.cs index 9291c587..06deb3f7 100644 --- a/src/CheckoutSdk/Payments/PaymentsClient.cs +++ b/src/CheckoutSdk/Payments/PaymentsClient.cs @@ -8,6 +8,7 @@ namespace Checkout.Payments public class PaymentsClient : AbstractClient, IPaymentsClient { private const string PaymentsPath = "payments"; + private const string CancelAScheduledRetryPath = "cancellations"; public PaymentsClient( IApiClient apiClient, @@ -72,6 +73,19 @@ public Task> GetPaymentActions( SdkAuthorization(), cancellationToken); } + + public Task CancelAScheduledRetry(string paymentId, CancelAScheduledRetryRequest cancelAScheduledRetryRequest, + string idempotencyKey = null, + CancellationToken cancellationToken = default) + { + CheckoutUtils.ValidateParams("paymentId",paymentId,"cancelAScheduledRetryRequest", cancelAScheduledRetryRequest); + return ApiClient.Post( + BuildPath(PaymentsPath, paymentId, CancelAScheduledRetryPath), + SdkAuthorization(), + cancelAScheduledRetryRequest, + cancellationToken, + idempotencyKey); + } public Task CapturePayment( string paymentId, diff --git a/src/CheckoutSdk/Payments/Request/CancelAScheduledRetryRequest.cs b/src/CheckoutSdk/Payments/Request/CancelAScheduledRetryRequest.cs new file mode 100644 index 00000000..c495adcb --- /dev/null +++ b/src/CheckoutSdk/Payments/Request/CancelAScheduledRetryRequest.cs @@ -0,0 +1,7 @@ +namespace Checkout.Payments.Request +{ + public class CancelAScheduledRetryRequest + { + public string Reference { get; set; } + } +} \ No newline at end of file diff --git a/src/CheckoutSdk/Payments/Response/CancelAScheduledRetryResponse.cs b/src/CheckoutSdk/Payments/Response/CancelAScheduledRetryResponse.cs new file mode 100644 index 00000000..1880249b --- /dev/null +++ b/src/CheckoutSdk/Payments/Response/CancelAScheduledRetryResponse.cs @@ -0,0 +1,11 @@ +using Checkout.Common; + +namespace Checkout.Payments.Response +{ + public class CancelAScheduledRetryResponse : Resource + { + public string ActionId { get; set; } + + public string Reference { get; set; } + } +} \ No newline at end of file diff --git a/test/CheckoutSdkTest/Payments/PaymentsClientTest.cs b/test/CheckoutSdkTest/Payments/PaymentsClientTest.cs index 28b35e61..964d6a71 100644 --- a/test/CheckoutSdkTest/Payments/PaymentsClientTest.cs +++ b/test/CheckoutSdkTest/Payments/PaymentsClientTest.cs @@ -17,6 +17,7 @@ namespace Checkout.Payments public class PaymentsClientTest : UnitTestFixture { private const string PaymentsPath = "payments"; + private const string CancelAScheduledRetryPath = "cancellations"; private readonly SdkAuthorization _authorization = new SdkAuthorization(PlatformType.Default, ValidDefaultSk); private readonly Mock _apiClient = new Mock(); @@ -260,6 +261,29 @@ private async Task ShouldGetPaymentActions() response.ShouldNotBeNull(); response.ShouldBeSameAs(paymentActions); } + + [Fact] + private async Task ShouldCancelAScheduledRetry() + { + var cancelAScheduledRetryRequest = new CancelAScheduledRetryRequest(); + var cancelAScheduledRetryResponse = new CancelAScheduledRetryResponse(); + + _apiClient.Setup(apiClient => + apiClient.Post( + PaymentsPath + "/payment_id/" + CancelAScheduledRetryPath, + _authorization, + cancelAScheduledRetryRequest, + CancellationToken.None, + "test")) + .ReturnsAsync(() => cancelAScheduledRetryResponse); + + IPaymentsClient paymentsClient = new PaymentsClient(_apiClient.Object, _configuration.Object); + + var response = await paymentsClient.CancelAScheduledRetry("payment_id", cancelAScheduledRetryRequest, "test"); + + response.ShouldNotBeNull(); + response.ShouldBeSameAs(cancelAScheduledRetryResponse); + } [Fact] private async Task ShouldCapturePayment_Id() @@ -304,7 +328,8 @@ private async Task ShouldCapturePayment_Request() var captureResponse = new CaptureResponse(); _apiClient.Setup(apiClient => - apiClient.Post(PaymentsPath + "/payment_id/captures", _authorization, + apiClient.Post(PaymentsPath + "/payment_id/captures", + _authorization, captureRequest, CancellationToken.None, "test")) .ReturnsAsync(() => captureResponse); diff --git a/test/CheckoutSdkTest/Payments/RequestPaymentsIntegrationTest.cs b/test/CheckoutSdkTest/Payments/RequestPaymentsIntegrationTest.cs index 60868569..13f773a8 100644 --- a/test/CheckoutSdkTest/Payments/RequestPaymentsIntegrationTest.cs +++ b/test/CheckoutSdkTest/Payments/RequestPaymentsIntegrationTest.cs @@ -249,6 +249,23 @@ private async Task ShouldMakeCard3dsPayment_N3d() paymentResponse.HasLink("void").ShouldBeTrue(); } + [Fact(Skip = "Use on demand")] + private async Task ShouldCancelAScheduleRetry() + { + var paymentResponse = await MakeCardPayment(); + + var request = new CancelAScheduledRetryRequest + { + Reference = paymentResponse.Reference, + }; + + var response = await DefaultApi.PaymentsClient().CancelAScheduledRetry(paymentResponse.Id, request); + + response.ShouldNotBeNull(); + response.ActionId.ShouldNotBeNullOrEmpty(); + response.Reference.ShouldNotBeNullOrEmpty(); + } + [Fact] private async Task ShouldTokenPayment() {