From 52765255e560ebc091d69be9ddb81cd21ca34bf4 Mon Sep 17 00:00:00 2001 From: Natthawut Haematulin Date: Fri, 1 Sep 2023 15:15:50 +0700 Subject: [PATCH 1/4] feat: add captureAmount and authorizationType attributes --- .../co/omise/models/AuthorizationType.java | 10 +++++++ src/main/java/co/omise/models/Charge.java | 27 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/main/java/co/omise/models/AuthorizationType.java diff --git a/src/main/java/co/omise/models/AuthorizationType.java b/src/main/java/co/omise/models/AuthorizationType.java new file mode 100644 index 00000000..5ed5177e --- /dev/null +++ b/src/main/java/co/omise/models/AuthorizationType.java @@ -0,0 +1,10 @@ +package co.omise.models; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public enum AuthorizationType { + @JsonProperty("pre_auth") + PreAuth, + @JsonProperty("final_auth") + FinalAuth; +} diff --git a/src/main/java/co/omise/models/Charge.java b/src/main/java/co/omise/models/Charge.java index 9b5920ee..92d8bf09 100644 --- a/src/main/java/co/omise/models/Charge.java +++ b/src/main/java/co/omise/models/Charge.java @@ -1,7 +1,6 @@ package co.omise.models; import co.omise.Endpoint; -import co.omise.models.schedules.ChargeSchedule; import co.omise.models.schedules.Schedule; import co.omise.requests.RequestBuilder; import co.omise.requests.ResponseType; @@ -84,6 +83,8 @@ public class Charge extends Model { private boolean voided; @JsonProperty("zero_interest_installments") private boolean zeroInterestInstallments; + @JsonProperty("authorization_type") + private AuthorizationType authorizationType; public long getAmount() { return this.amount; @@ -461,6 +462,14 @@ public void setTransactionFees(TransactionFee transactionFees) { this.transactionFees = transactionFees; } + public AuthorizationType getAuthorizationType() { + return authorizationType; + } + + public void setAuthorizationType(AuthorizationType authorizationType) { + this.authorizationType = authorizationType; + } + public static class ListRequestBuilder extends RequestBuilder> { private ScopedList.Options options; @@ -521,6 +530,8 @@ public static class CreateRequestBuilder extends RequestBuilder { private String returnUri; @JsonProperty private String source; + @JsonProperty("authorization_type") + private AuthorizationType authorizationType; @Override protected String method() { @@ -607,6 +618,11 @@ public CreateRequestBuilder zeroInterestInstallments(boolean zeroInterestInstall return this; } + public CreateRequestBuilder authorizationType(AuthorizationType authorizationType) { + this.authorizationType = authorizationType; + return this; + } + @Override protected RequestBody payload() throws IOException { return serialize(); @@ -765,10 +781,19 @@ public UpdateRequestBuilder metadata(String key, Object value) { public static class CaptureRequestBuilder extends RequestBuilder { private String chargeId; + + @JsonProperty("capture_amount") + private long captureAmount; + public CaptureRequestBuilder(String chargeId) { this.chargeId = chargeId; } + public CaptureRequestBuilder captureAmount(long captureAmount) { + this.captureAmount = captureAmount; + return this; + } + @Override protected String method() { return POST; From 77a6cebe1205e4ef80f8a41aa872bb53f2e85a96 Mon Sep 17 00:00:00 2001 From: Natthawut Haematulin Date: Mon, 4 Sep 2023 10:24:05 +0700 Subject: [PATCH 2/4] test: add unit tests --- .../co/omise/requests/ChargeRequestTest.java | 31 +++++++++++++++++++ .../testdata/objects/charge_object.json | 1 + 2 files changed, 32 insertions(+) diff --git a/src/test/java/co/omise/requests/ChargeRequestTest.java b/src/test/java/co/omise/requests/ChargeRequestTest.java index 7946b5e5..50f34b5d 100644 --- a/src/test/java/co/omise/requests/ChargeRequestTest.java +++ b/src/test/java/co/omise/requests/ChargeRequestTest.java @@ -1,5 +1,6 @@ package co.omise.requests; +import co.omise.models.AuthorizationType; import co.omise.models.Barcode; import co.omise.models.Charge; import co.omise.models.OmiseException; @@ -65,6 +66,22 @@ public void testCreateChargeFromSource() throws IOException, OmiseException { assertEquals(100000L, charge.getAmount()); } + @Test + public void testCreatePartialCapturableCharge() throws IOException, OmiseException { + Request createChargeRequest = + new Charge.CreateRequestBuilder() + .amount(100000) + .currency("thb") + .capture(false) + .authorizationType(AuthorizationType.PreAuth) + .returnUri("http://example.com/orders/345678/complete") + .build(); + + Charge charge = getTestRequester().sendRequest(createChargeRequest); + + assertRequested("POST", "/charges", 200); + } + @Test public void testUpdate() throws IOException, OmiseException { Request updateChargeRequest = @@ -92,6 +109,20 @@ public void testCapture() throws IOException, OmiseException { assertTrue(charge.isPaid()); } + @Test + public void testPartialCapture() throws IOException, OmiseException { + Request captureChargeRequest = + new Charge.CaptureRequestBuilder(CHARGE_ID) + .captureAmount(100_000) + .build(); + Charge charge = getTestRequester().sendRequest(captureChargeRequest); + + assertRequested("POST", "/charges/" + CHARGE_ID + "/capture", 200); + assertEquals(CHARGE_ID, charge.getId()); + assertFalse(charge.isCapture()); + assertTrue(charge.isPaid()); + } + @Test public void testReverse() throws IOException, OmiseException { Request reverseChargeRequest = diff --git a/src/test/resources/testdata/objects/charge_object.json b/src/test/resources/testdata/objects/charge_object.json index ffe02707..648ffe18 100644 --- a/src/test/resources/testdata/objects/charge_object.json +++ b/src/test/resources/testdata/objects/charge_object.json @@ -5,6 +5,7 @@ "location": "/charges/chrg_test_5086xlsx4lghk9bpb75", "amount": 100000, "currency": "thb", + "authorization_type": "pre_auth", "description": null, "capture": true, "authorized": true, From 972482bec415e9822e0792dacaafc3c559944d00 Mon Sep 17 00:00:00 2001 From: Natthawut Haematulin Date: Mon, 4 Sep 2023 11:25:01 +0700 Subject: [PATCH 3/4] test: add live tests --- src/main/java/co/omise/models/Charge.java | 5 +++ .../co/omise/live/LiveChargeRequestTest.java | 43 ++++++++++++++++++- .../co/omise/requests/ChargeRequestTest.java | 9 +++- .../java/co/omise/requests/RequestTest.java | 1 + 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/main/java/co/omise/models/Charge.java b/src/main/java/co/omise/models/Charge.java index 92d8bf09..4e24f7ba 100644 --- a/src/main/java/co/omise/models/Charge.java +++ b/src/main/java/co/omise/models/Charge.java @@ -808,6 +808,11 @@ protected HttpUrl path() { protected ResponseType type() { return new ResponseType<>(Charge.class); } + + @Override + protected RequestBody payload() throws IOException { + return serialize(); + } } public static class ExpireRequestBuilder extends RequestBuilder { diff --git a/src/test/java/co/omise/live/LiveChargeRequestTest.java b/src/test/java/co/omise/live/LiveChargeRequestTest.java index 21f59cfd..42eba0b6 100644 --- a/src/test/java/co/omise/live/LiveChargeRequestTest.java +++ b/src/test/java/co/omise/live/LiveChargeRequestTest.java @@ -287,7 +287,7 @@ public void testLiveChargeCapture() throws IOException, OmiseException { .name("Omise Co., Ltd. - testLiveCharge") .number("4242424242424242") .securityCode("123") - .expiration(10, 2020)) + .expiration(10, 2030)) .build(); Token token = client.sendRequest(tokenRequest); @@ -317,6 +317,47 @@ public void testLiveChargeCapture() throws IOException, OmiseException { assertTrue(capturedCharge.isPaid()); } + + @Test + @Ignore("only hit the network when we need to.") + public void testLiveChargeSinglePartialCapture() throws IOException, OmiseException { + Request tokenRequest = new Token.CreateRequestBuilder() + .card(new Card.Create() + .name("Omise Co., Ltd. - testLiveCharge") + .number("4242424242424242") + .securityCode("123") + .expiration(10, 2030)) + .build(); + + Token token = client.sendRequest(tokenRequest); + + Request createChargeRequest = + new Charge.CreateRequestBuilder() + .amount(100000) + .currency("thb") + .description("omise-java test") + .card(token.getId()) + .capture(false) + .authorizationType(AuthorizationType.PreAuth) + .build(); + Charge unCapturedCharge = client.sendRequest(createChargeRequest); + + System.out.println("created charge: " + unCapturedCharge.getId()); + + assertNotNull(unCapturedCharge.getId()); + assertFalse(unCapturedCharge.isCapture()); + assertEquals(AuthorizationType.PreAuth, unCapturedCharge.getAuthorizationType()); + + Request captureChargeRequest = + new Charge.CaptureRequestBuilder(unCapturedCharge.getId()).captureAmount(50000).build(); + + Charge capturedCharge = client.sendRequest(captureChargeRequest); + + assertNotNull(capturedCharge); + assertEquals(unCapturedCharge.getId(), capturedCharge.getId()); + assertTrue(capturedCharge.isPaid()); + } + @Test @Ignore("only hit the network when we need to.") public void testLiveChargeReverse() throws IOException, OmiseException { diff --git a/src/test/java/co/omise/requests/ChargeRequestTest.java b/src/test/java/co/omise/requests/ChargeRequestTest.java index 50f34b5d..9b6405ff 100644 --- a/src/test/java/co/omise/requests/ChargeRequestTest.java +++ b/src/test/java/co/omise/requests/ChargeRequestTest.java @@ -6,6 +6,7 @@ import co.omise.models.OmiseException; import co.omise.models.ScopedList; import co.omise.models.SourceType; +import okio.Buffer; import org.junit.Test; import java.io.IOException; @@ -67,7 +68,7 @@ public void testCreateChargeFromSource() throws IOException, OmiseException { } @Test - public void testCreatePartialCapturableCharge() throws IOException, OmiseException { + public void testCreatePartialCaptureCharge() throws IOException, OmiseException { Request createChargeRequest = new Charge.CreateRequestBuilder() .amount(100000) @@ -80,6 +81,8 @@ public void testCreatePartialCapturableCharge() throws IOException, OmiseExcepti Charge charge = getTestRequester().sendRequest(createChargeRequest); assertRequested("POST", "/charges", 200); + assertRequestBody("{\"amount\":100000,\"capture\":false,\"card\":null,\"currency\":\"thb\",\"customer\":null,\"description\":null,\"ip\":null,\"metadata\":null,\"reference\":null,\"source\":null,\"zero_interest_installments\":false,\"expires_at\":null,\"platform_fee\":null,\"return_uri\":\"http://example.com/orders/345678/complete\",\"authorization_type\":\"pre_auth\"}"); + assertNotNull(charge); } @Test @@ -113,11 +116,13 @@ public void testCapture() throws IOException, OmiseException { public void testPartialCapture() throws IOException, OmiseException { Request captureChargeRequest = new Charge.CaptureRequestBuilder(CHARGE_ID) - .captureAmount(100_000) + .captureAmount(100000) .build(); + Charge charge = getTestRequester().sendRequest(captureChargeRequest); assertRequested("POST", "/charges/" + CHARGE_ID + "/capture", 200); + assertRequestBody("{\"capture_amount\":100000}"); assertEquals(CHARGE_ID, charge.getId()); assertFalse(charge.isCapture()); assertTrue(charge.isPaid()); diff --git a/src/test/java/co/omise/requests/RequestTest.java b/src/test/java/co/omise/requests/RequestTest.java index bb985a6a..84a32dde 100644 --- a/src/test/java/co/omise/requests/RequestTest.java +++ b/src/test/java/co/omise/requests/RequestTest.java @@ -46,6 +46,7 @@ protected void assertRequestBody(String expectedRequestBody) { assertEquals(expectedRequestBody, actualRequestBody); } catch (final IOException e) { e.printStackTrace(); + fail("Error occurred."); } } From f445c85d0baa8e71cf48589d01b118369e96f399 Mon Sep 17 00:00:00 2001 From: Natthawut Haematulin Date: Mon, 4 Sep 2023 13:24:51 +0700 Subject: [PATCH 4/4] style: remove unused import --- src/test/java/co/omise/requests/ChargeRequestTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/co/omise/requests/ChargeRequestTest.java b/src/test/java/co/omise/requests/ChargeRequestTest.java index 9b6405ff..9e42c0e7 100644 --- a/src/test/java/co/omise/requests/ChargeRequestTest.java +++ b/src/test/java/co/omise/requests/ChargeRequestTest.java @@ -6,7 +6,6 @@ import co.omise.models.OmiseException; import co.omise.models.ScopedList; import co.omise.models.SourceType; -import okio.Buffer; import org.junit.Test; import java.io.IOException;