From 71c35ed0a581bac65678c2b344ff0e7a43bfd8d4 Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 11:13:05 -0300 Subject: [PATCH 01/16] refactor: abacate pay client configs --- src/main/java/com/abacatepay/AbacatePay.java | 24 ++++--------------- .../factories/AbacatePayClientFactory.java | 18 ++++++++++---- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/abacatepay/AbacatePay.java b/src/main/java/com/abacatepay/AbacatePay.java index 9925d76..e0181f2 100644 --- a/src/main/java/com/abacatepay/AbacatePay.java +++ b/src/main/java/com/abacatepay/AbacatePay.java @@ -8,34 +8,20 @@ import com.abacatepay.model.billing.CreateBillingResponse; import com.abacatepay.model.billing.ListBillingResponse; import feign.FeignException; -import feign.RequestInterceptor; public class AbacatePay implements IAbacatePay { private static final String API_BASE_URL = "https://api.abacatepay.com/v1"; - private final AbacatePayClient client; - private final String apiKey; - private final String userAgent; public AbacatePay(String apiKey) { - this.apiKey = apiKey; - this.client = AbacatePayClientFactory.create(API_BASE_URL, requestInterceptor()); + if (apiKey == null || apiKey.isEmpty()) { + throw new IllegalArgumentException("API key not provided"); + } //TODO: Pegar a versão do SDK dinamicamente - this.userAgent = "Java SDK (1.0.0)"; - } - - private RequestInterceptor requestInterceptor() { - return template -> { - if (apiKey == null || apiKey.isEmpty()) { - throw new IllegalArgumentException("API key not provided"); - } - - template.header("Authorization", "Bearer " + apiKey); - template.header("Content-Type", "application/json"); - template.header("User-Agent", userAgent); - }; + String userAgent = "Java SDK (1.0.0)"; + this.client = AbacatePayClientFactory.create(API_BASE_URL, apiKey, userAgent); } @Override diff --git a/src/main/java/com/abacatepay/clients/factories/AbacatePayClientFactory.java b/src/main/java/com/abacatepay/clients/factories/AbacatePayClientFactory.java index bc97ac5..05db596 100644 --- a/src/main/java/com/abacatepay/clients/factories/AbacatePayClientFactory.java +++ b/src/main/java/com/abacatepay/clients/factories/AbacatePayClientFactory.java @@ -13,16 +13,26 @@ public class AbacatePayClientFactory { private static final ObjectMapper MAPPER = new ObjectMapper(); - public static AbacatePayClient create( - String baseUrl, RequestInterceptor requestInterceptor - ) { + static { MAPPER.registerModule(new JavaTimeModule()); + } + public static AbacatePayClient create( + String baseUrl, String apiKey, String userAgent + ) { return Feign.builder() .decoder(new JacksonDecoder(MAPPER)) .encoder(new JacksonEncoder(MAPPER)) .errorDecoder(new CustomExceptionDecoder()) - .requestInterceptor(requestInterceptor) + .requestInterceptor(requestInterceptor(apiKey, userAgent)) .target(AbacatePayClient.class, baseUrl); } + + private static RequestInterceptor requestInterceptor(String apiKey, String userAgent) { + return template -> { + template.header("Authorization", "Bearer " + apiKey); + template.header("Content-Type", "application/json"); + template.header("User-Agent", userAgent); + }; + } } From 990a577a31c97731f9bbd54f974bcb0526573482 Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 11:13:33 -0300 Subject: [PATCH 02/16] test: ensure api key is provided when initiate abacatepay sdk --- src/test/java/com/abacatepay/AbacatePayTest.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/abacatepay/AbacatePayTest.java b/src/test/java/com/abacatepay/AbacatePayTest.java index 9db2cde..cd0ffcc 100644 --- a/src/test/java/com/abacatepay/AbacatePayTest.java +++ b/src/test/java/com/abacatepay/AbacatePayTest.java @@ -19,8 +19,6 @@ class AbacatePayTest { @Mock private AbacatePayClient abacatePayClient; - - @InjectMocks private AbacatePay abacatePay; @BeforeEach @@ -82,4 +80,18 @@ void shouldListBillingThrowsAnException() { verify(abacatePayClient, atMostOnce()).list(); Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); } + + @Test + void shouldThrowsIllegalArgumentExceptionIfApiKeyIsNull() { + Assertions.assertThrows(IllegalArgumentException.class, () -> { + abacatePay = new AbacatePay(null); + }, "Should throw an IllegalArgumentException"); + } + + @Test + void shouldThrowsIllegalArgumentExceptionIfApiKeyIsBlank() { + Assertions.assertThrows(IllegalArgumentException.class, () -> { + abacatePay = new AbacatePay(""); + }, "Should throw an IllegalArgumentException"); + } } From c4fe6cf0f1e86e8b91f6735ab5212d57608035a6 Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 11:16:43 -0300 Subject: [PATCH 03/16] refactor: billing models --- .../java/com/abacatepay/model/billing/Billing.java | 10 +++------- .../model/billing/CreateBillingResponse.java | 7 +------ .../abacatepay/model/billing/ListBillingResponse.java | 6 +----- src/main/java/com/abacatepay/utils/DateUtils.java | 6 ++++++ .../model/billing/CreateBillingResponseTest.java | 4 ++-- .../model/billing/ListBillingResponseTest.java | 4 ++-- 6 files changed, 15 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/abacatepay/utils/DateUtils.java diff --git a/src/main/java/com/abacatepay/model/billing/Billing.java b/src/main/java/com/abacatepay/model/billing/Billing.java index 0c67bdc..b85de2b 100644 --- a/src/main/java/com/abacatepay/model/billing/Billing.java +++ b/src/main/java/com/abacatepay/model/billing/Billing.java @@ -1,10 +1,12 @@ package com.abacatepay.model.billing; +import com.abacatepay.utils.DateUtils; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; import java.math.BigDecimal; +import java.sql.Date; import java.time.LocalDateTime; import java.util.List; @@ -20,16 +22,10 @@ public class Billing { private List products; private BillingKind frequency; - @JsonFormat(timezone = "America/Sao_Paulo", pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + @JsonFormat(timezone = DateUtils.DATE_TIMEZONE_DEFAULT, pattern = DateUtils.DATE_FORMAT_PATTERN) private LocalDateTime nextBilling; private Customer customer; - - @JsonFormat(timezone = "America/Sao_Paulo", pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") - private LocalDateTime createdAt; - - @JsonFormat(timezone = "America/Sao_Paulo", pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") - private LocalDateTime updatedAt; } @Data diff --git a/src/main/java/com/abacatepay/model/billing/CreateBillingResponse.java b/src/main/java/com/abacatepay/model/billing/CreateBillingResponse.java index aa29ec9..e64941c 100644 --- a/src/main/java/com/abacatepay/model/billing/CreateBillingResponse.java +++ b/src/main/java/com/abacatepay/model/billing/CreateBillingResponse.java @@ -1,18 +1,13 @@ package com.abacatepay.model.billing; -import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor public class CreateBillingResponse { - - @JsonInclude(JsonInclude.Include.NON_NULL) private String error; - - @JsonInclude(JsonInclude.Include.NON_NULL) - private Billing billing; + private Billing data; public CreateBillingResponse(String error) { this.error = error; diff --git a/src/main/java/com/abacatepay/model/billing/ListBillingResponse.java b/src/main/java/com/abacatepay/model/billing/ListBillingResponse.java index a51256b..b4dca0a 100644 --- a/src/main/java/com/abacatepay/model/billing/ListBillingResponse.java +++ b/src/main/java/com/abacatepay/model/billing/ListBillingResponse.java @@ -1,6 +1,5 @@ package com.abacatepay.model.billing; -import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import lombok.NoArgsConstructor; @@ -9,11 +8,8 @@ @Data @NoArgsConstructor public class ListBillingResponse { - @JsonInclude(JsonInclude.Include.NON_NULL) private String error; - - @JsonInclude(JsonInclude.Include.NON_NULL) - private List billings; + private List data; public ListBillingResponse(String error) { this.error = error; diff --git a/src/main/java/com/abacatepay/utils/DateUtils.java b/src/main/java/com/abacatepay/utils/DateUtils.java new file mode 100644 index 0000000..ec9e231 --- /dev/null +++ b/src/main/java/com/abacatepay/utils/DateUtils.java @@ -0,0 +1,6 @@ +package com.abacatepay.utils; + +public class DateUtils { + public static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; + public static final String DATE_TIMEZONE_DEFAULT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; +} diff --git a/src/test/java/com/abacatepay/model/billing/CreateBillingResponseTest.java b/src/test/java/com/abacatepay/model/billing/CreateBillingResponseTest.java index aca7545..8f03777 100644 --- a/src/test/java/com/abacatepay/model/billing/CreateBillingResponseTest.java +++ b/src/test/java/com/abacatepay/model/billing/CreateBillingResponseTest.java @@ -15,9 +15,9 @@ void testErrorConstructor() { void testGettersAndSetters() { CreateBillingResponse response = new CreateBillingResponse(); response.setError("Error occurred"); - response.setBilling(null); + response.setData(null); assertEquals("Error occurred", response.getError(), "Error field must be set correctly"); - assertNull(response.getBilling(), "Billing field must be set correctly"); + assertNull(response.getData(), "Billing field must be set correctly"); } } \ No newline at end of file diff --git a/src/test/java/com/abacatepay/model/billing/ListBillingResponseTest.java b/src/test/java/com/abacatepay/model/billing/ListBillingResponseTest.java index 06b67a4..82591db 100644 --- a/src/test/java/com/abacatepay/model/billing/ListBillingResponseTest.java +++ b/src/test/java/com/abacatepay/model/billing/ListBillingResponseTest.java @@ -15,9 +15,9 @@ void testErrorConstructor() { void testGettersAndSetters() { ListBillingResponse response = new ListBillingResponse(); response.setError("Error occurred"); - response.setBillings(null); + response.setData(null); assertEquals("Error occurred", response.getError(), "Error field must be set correctly"); - assertNull(response.getBillings(), "Billings field must be set correctly"); + assertNull(response.getData(), "Billings field must be set correctly"); } } \ No newline at end of file From a33b3b7788a841c4c7bc4e78bbe3452e13ff8520 Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 11:17:59 -0300 Subject: [PATCH 04/16] refactor: billing models --- src/main/java/com/abacatepay/AbacatePay.java | 4 ++-- .../abacatepay/clients/AbacatePayClient.java | 4 ++-- .../java/com/abacatepay/AbacatePayTest.java | 17 ++++++++--------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/abacatepay/AbacatePay.java b/src/main/java/com/abacatepay/AbacatePay.java index e0181f2..ea1f806 100644 --- a/src/main/java/com/abacatepay/AbacatePay.java +++ b/src/main/java/com/abacatepay/AbacatePay.java @@ -32,7 +32,7 @@ class AbacatePayBilling implements IAbacatePayBilling { @Override public CreateBillingResponse create(CreateBillingData data) { try { - return client.create(data); + return client.createBilling(data); } catch (IllegalArgumentException | FeignException e) { return new CreateBillingResponse(e.getMessage()); } @@ -41,7 +41,7 @@ public CreateBillingResponse create(CreateBillingData data) { @Override public ListBillingResponse list() { try { - return client.list(); + return client.listBillings(); } catch (IllegalArgumentException | FeignException e) { return new ListBillingResponse(e.getMessage()); } diff --git a/src/main/java/com/abacatepay/clients/AbacatePayClient.java b/src/main/java/com/abacatepay/clients/AbacatePayClient.java index cdd1470..fe1f55d 100644 --- a/src/main/java/com/abacatepay/clients/AbacatePayClient.java +++ b/src/main/java/com/abacatepay/clients/AbacatePayClient.java @@ -8,8 +8,8 @@ public interface AbacatePayClient { @RequestLine("GET /billing/list") - ListBillingResponse list(); + ListBillingResponse listBillings(); @RequestLine("POST /billing/create") - CreateBillingResponse create(CreateBillingData body); + CreateBillingResponse createBilling(CreateBillingData body); } diff --git a/src/test/java/com/abacatepay/AbacatePayTest.java b/src/test/java/com/abacatepay/AbacatePayTest.java index cd0ffcc..081c606 100644 --- a/src/test/java/com/abacatepay/AbacatePayTest.java +++ b/src/test/java/com/abacatepay/AbacatePayTest.java @@ -7,7 +7,6 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -40,10 +39,10 @@ void shouldReturnCreateBillingResponseOnSuccess() { CreateBillingData data = CreateBillingData.builder().build(); CreateBillingResponse expectedResponse = new CreateBillingResponse(); - when(abacatePayClient.create(data)).thenReturn(expectedResponse); + when(abacatePayClient.createBilling(data)).thenReturn(expectedResponse); CreateBillingResponse result = abacatePay.billing().create(data); - verify(abacatePayClient, atMostOnce()).create(data); + verify(abacatePayClient, atMostOnce()).createBilling(data); Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); } @@ -52,10 +51,10 @@ void shouldCreateBillingThrowsAnException() { CreateBillingData data = CreateBillingData.builder().build(); CreateBillingResponse expectedResponse = new CreateBillingResponse("API key not provided"); - when(abacatePayClient.create(data)).thenThrow(new IllegalArgumentException("API key not provided")); + when(abacatePayClient.createBilling(data)).thenThrow(new IllegalArgumentException("API key not provided")); CreateBillingResponse result = abacatePay.billing().create(data); - verify(abacatePayClient, atMostOnce()).create(data); + verify(abacatePayClient, atMostOnce()).createBilling(data); Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); } @@ -63,10 +62,10 @@ void shouldCreateBillingThrowsAnException() { void shouldReturnBillingListResponseOnSucess() { ListBillingResponse expectedResponse = new ListBillingResponse(); - when(abacatePayClient.list()).thenReturn(expectedResponse); + when(abacatePayClient.listBillings()).thenReturn(expectedResponse); ListBillingResponse result = abacatePay.billing().list(); - verify(abacatePayClient, atMostOnce()).list(); + verify(abacatePayClient, atMostOnce()).listBillings(); Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); } @@ -74,10 +73,10 @@ void shouldReturnBillingListResponseOnSucess() { void shouldListBillingThrowsAnException() { ListBillingResponse expectedResponse = new ListBillingResponse("API key not provided"); - when(abacatePayClient.list()).thenThrow(new IllegalArgumentException("API key not provided")); + when(abacatePayClient.listBillings()).thenThrow(new IllegalArgumentException("API key not provided")); ListBillingResponse result = abacatePay.billing().list(); - verify(abacatePayClient, atMostOnce()).list(); + verify(abacatePayClient, atMostOnce()).listBillings(); Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); } From 636e76eb3812915234ee743a738d4cbdbcc6c5f4 Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 11:27:04 -0300 Subject: [PATCH 05/16] refactor: move customer models to a specific package --- .../java/com/abacatepay/model/billing/Billing.java | 7 +------ .../java/com/abacatepay/model/customer/Customer.java | 11 +++++++++++ .../model/{billing => customer}/CustomerMetadata.java | 2 +- .../{billing => customer}/CustomerMetadataTest.java | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/abacatepay/model/customer/Customer.java rename src/main/java/com/abacatepay/model/{billing => customer}/CustomerMetadata.java (81%) rename src/test/java/com/abacatepay/model/{billing => customer}/CustomerMetadataTest.java (95%) diff --git a/src/main/java/com/abacatepay/model/billing/Billing.java b/src/main/java/com/abacatepay/model/billing/Billing.java index 0c67bdc..9114770 100644 --- a/src/main/java/com/abacatepay/model/billing/Billing.java +++ b/src/main/java/com/abacatepay/model/billing/Billing.java @@ -1,5 +1,6 @@ package com.abacatepay.model.billing; +import com.abacatepay.model.customer.Customer; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; @@ -38,9 +39,3 @@ class Product { private Integer quantity; } -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -class Customer { - private String id; - private CustomerMetadata metadata; -} \ No newline at end of file diff --git a/src/main/java/com/abacatepay/model/customer/Customer.java b/src/main/java/com/abacatepay/model/customer/Customer.java new file mode 100644 index 0000000..1f47840 --- /dev/null +++ b/src/main/java/com/abacatepay/model/customer/Customer.java @@ -0,0 +1,11 @@ +package com.abacatepay.model.customer; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Customer { + private String id; + private CustomerMetadata metadata; +} diff --git a/src/main/java/com/abacatepay/model/billing/CustomerMetadata.java b/src/main/java/com/abacatepay/model/customer/CustomerMetadata.java similarity index 81% rename from src/main/java/com/abacatepay/model/billing/CustomerMetadata.java rename to src/main/java/com/abacatepay/model/customer/CustomerMetadata.java index d63699f..b11e40b 100644 --- a/src/main/java/com/abacatepay/model/billing/CustomerMetadata.java +++ b/src/main/java/com/abacatepay/model/customer/CustomerMetadata.java @@ -1,4 +1,4 @@ -package com.abacatepay.model.billing; +package com.abacatepay.model.customer; import lombok.Data; diff --git a/src/test/java/com/abacatepay/model/billing/CustomerMetadataTest.java b/src/test/java/com/abacatepay/model/customer/CustomerMetadataTest.java similarity index 95% rename from src/test/java/com/abacatepay/model/billing/CustomerMetadataTest.java rename to src/test/java/com/abacatepay/model/customer/CustomerMetadataTest.java index d0e082e..c40b9d0 100644 --- a/src/test/java/com/abacatepay/model/billing/CustomerMetadataTest.java +++ b/src/test/java/com/abacatepay/model/customer/CustomerMetadataTest.java @@ -1,4 +1,4 @@ -package com.abacatepay.model.billing; +package com.abacatepay.model.customer; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; From 94196e76459f73bc1a0e5804d419f155dc4b237b Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 11:30:11 -0300 Subject: [PATCH 06/16] feat: add create customer method --- src/main/java/com/abacatepay/AbacatePay.java | 11 +++++++++++ .../com/abacatepay/clients/AbacatePayClient.java | 5 +++++ .../com/abacatepay/model/IAbacatePayBilling.java | 3 +++ .../model/customer/CreateCustomerResponse.java | 13 +++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 src/main/java/com/abacatepay/model/customer/CreateCustomerResponse.java diff --git a/src/main/java/com/abacatepay/AbacatePay.java b/src/main/java/com/abacatepay/AbacatePay.java index 9925d76..25f0aef 100644 --- a/src/main/java/com/abacatepay/AbacatePay.java +++ b/src/main/java/com/abacatepay/AbacatePay.java @@ -7,6 +7,8 @@ import com.abacatepay.model.billing.CreateBillingData; import com.abacatepay.model.billing.CreateBillingResponse; import com.abacatepay.model.billing.ListBillingResponse; +import com.abacatepay.model.customer.CreateCustomerResponse; +import com.abacatepay.model.customer.CustomerMetadata; import feign.FeignException; import feign.RequestInterceptor; @@ -60,6 +62,15 @@ public ListBillingResponse list() { return new ListBillingResponse(e.getMessage()); } } + + @Override + public CreateCustomerResponse createCustomer(CustomerMetadata data) { + try { + return client.createCustomer(data); + } catch (IllegalArgumentException | FeignException e) { + return new CreateCustomerResponse(e.getMessage()); + } + } } return new AbacatePayBilling(); diff --git a/src/main/java/com/abacatepay/clients/AbacatePayClient.java b/src/main/java/com/abacatepay/clients/AbacatePayClient.java index cdd1470..3827f63 100644 --- a/src/main/java/com/abacatepay/clients/AbacatePayClient.java +++ b/src/main/java/com/abacatepay/clients/AbacatePayClient.java @@ -3,6 +3,8 @@ import com.abacatepay.model.billing.CreateBillingData; import com.abacatepay.model.billing.CreateBillingResponse; import com.abacatepay.model.billing.ListBillingResponse; +import com.abacatepay.model.customer.CreateCustomerResponse; +import com.abacatepay.model.customer.CustomerMetadata; import feign.RequestLine; public interface AbacatePayClient { @@ -12,4 +14,7 @@ public interface AbacatePayClient { @RequestLine("POST /billing/create") CreateBillingResponse create(CreateBillingData body); + + @RequestLine("POST /customer/create") + CreateCustomerResponse createCustomer(CustomerMetadata body); } diff --git a/src/main/java/com/abacatepay/model/IAbacatePayBilling.java b/src/main/java/com/abacatepay/model/IAbacatePayBilling.java index 043e84f..f446c1a 100644 --- a/src/main/java/com/abacatepay/model/IAbacatePayBilling.java +++ b/src/main/java/com/abacatepay/model/IAbacatePayBilling.java @@ -3,8 +3,11 @@ import com.abacatepay.model.billing.CreateBillingData; import com.abacatepay.model.billing.CreateBillingResponse; import com.abacatepay.model.billing.ListBillingResponse; +import com.abacatepay.model.customer.CreateCustomerResponse; +import com.abacatepay.model.customer.CustomerMetadata; public interface IAbacatePayBilling { CreateBillingResponse create(CreateBillingData data); ListBillingResponse list(); + CreateCustomerResponse createCustomer(CustomerMetadata data); } diff --git a/src/main/java/com/abacatepay/model/customer/CreateCustomerResponse.java b/src/main/java/com/abacatepay/model/customer/CreateCustomerResponse.java new file mode 100644 index 0000000..20e9ace --- /dev/null +++ b/src/main/java/com/abacatepay/model/customer/CreateCustomerResponse.java @@ -0,0 +1,13 @@ +package com.abacatepay.model.customer; + +import lombok.Data; + +@Data +public class CreateCustomerResponse { + private CustomerMetadata data; + private String error; + + public CreateCustomerResponse(String error) { + this.error = error; + } +} From ce1f52608448d60a1841787880211229c5225f3b Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 11:35:47 -0300 Subject: [PATCH 07/16] test: create customer --- .../customer/CreateCustomerResponse.java | 2 ++ .../java/com/abacatepay/AbacatePayTest.java | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/main/java/com/abacatepay/model/customer/CreateCustomerResponse.java b/src/main/java/com/abacatepay/model/customer/CreateCustomerResponse.java index 20e9ace..b41f9cf 100644 --- a/src/main/java/com/abacatepay/model/customer/CreateCustomerResponse.java +++ b/src/main/java/com/abacatepay/model/customer/CreateCustomerResponse.java @@ -1,8 +1,10 @@ package com.abacatepay.model.customer; import lombok.Data; +import lombok.NoArgsConstructor; @Data +@NoArgsConstructor public class CreateCustomerResponse { private CustomerMetadata data; private String error; diff --git a/src/test/java/com/abacatepay/AbacatePayTest.java b/src/test/java/com/abacatepay/AbacatePayTest.java index 9db2cde..fcd51d4 100644 --- a/src/test/java/com/abacatepay/AbacatePayTest.java +++ b/src/test/java/com/abacatepay/AbacatePayTest.java @@ -4,6 +4,8 @@ import com.abacatepay.model.billing.CreateBillingData; import com.abacatepay.model.billing.CreateBillingResponse; import com.abacatepay.model.billing.ListBillingResponse; +import com.abacatepay.model.customer.CreateCustomerResponse; +import com.abacatepay.model.customer.CustomerMetadata; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -82,4 +84,30 @@ void shouldListBillingThrowsAnException() { verify(abacatePayClient, atMostOnce()).list(); Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); } + + @Test + void shouldReturnCreateCustomerResponseOnSuccess() { + CreateCustomerResponse expectedResponse = new CreateCustomerResponse(); + CustomerMetadata request = new CustomerMetadata(); + + when(abacatePayClient.createCustomer(request)) + .thenReturn(expectedResponse); + + CreateCustomerResponse result = abacatePay.billing().createCustomer(request); + verify(abacatePayClient, atMostOnce()).createCustomer(request); + Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); + } + + @Test + void shouldCreateCustomerThrowsAnException() { + CreateCustomerResponse expectedResponse = new CreateCustomerResponse("Unauthorized"); + CustomerMetadata request = new CustomerMetadata(); + + when(abacatePayClient.createCustomer(request)) + .thenThrow(new IllegalArgumentException("Unauthorized")); + + CreateCustomerResponse result = abacatePay.billing().createCustomer(request); + verify(abacatePayClient, atMostOnce()).createCustomer(request); + Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); + } } From 0be7dc2d59570fe8f8a190bace783dd493c1180b Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 11:43:04 -0300 Subject: [PATCH 08/16] feat: add list customers --- src/main/java/com/abacatepay/AbacatePay.java | 10 ++++++++++ .../abacatepay/clients/AbacatePayClient.java | 4 ++++ .../abacatepay/model/IAbacatePayBilling.java | 2 ++ .../model/customer/ListCustomerResponse.java | 17 +++++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 src/main/java/com/abacatepay/model/customer/ListCustomerResponse.java diff --git a/src/main/java/com/abacatepay/AbacatePay.java b/src/main/java/com/abacatepay/AbacatePay.java index 25f0aef..83eb434 100644 --- a/src/main/java/com/abacatepay/AbacatePay.java +++ b/src/main/java/com/abacatepay/AbacatePay.java @@ -9,6 +9,7 @@ import com.abacatepay.model.billing.ListBillingResponse; import com.abacatepay.model.customer.CreateCustomerResponse; import com.abacatepay.model.customer.CustomerMetadata; +import com.abacatepay.model.customer.ListCustomerResponse; import feign.FeignException; import feign.RequestInterceptor; @@ -71,6 +72,15 @@ public CreateCustomerResponse createCustomer(CustomerMetadata data) { return new CreateCustomerResponse(e.getMessage()); } } + + @Override + public ListCustomerResponse listCustomers() { + try { + return client.listCustomers(); + } catch (IllegalArgumentException | FeignException e) { + return new ListCustomerResponse(e.getMessage()); + } + } } return new AbacatePayBilling(); diff --git a/src/main/java/com/abacatepay/clients/AbacatePayClient.java b/src/main/java/com/abacatepay/clients/AbacatePayClient.java index 3827f63..e1c86e6 100644 --- a/src/main/java/com/abacatepay/clients/AbacatePayClient.java +++ b/src/main/java/com/abacatepay/clients/AbacatePayClient.java @@ -5,6 +5,7 @@ import com.abacatepay.model.billing.ListBillingResponse; import com.abacatepay.model.customer.CreateCustomerResponse; import com.abacatepay.model.customer.CustomerMetadata; +import com.abacatepay.model.customer.ListCustomerResponse; import feign.RequestLine; public interface AbacatePayClient { @@ -17,4 +18,7 @@ public interface AbacatePayClient { @RequestLine("POST /customer/create") CreateCustomerResponse createCustomer(CustomerMetadata body); + + @RequestLine("GET /customer/list") + ListCustomerResponse listCustomers(); } diff --git a/src/main/java/com/abacatepay/model/IAbacatePayBilling.java b/src/main/java/com/abacatepay/model/IAbacatePayBilling.java index f446c1a..c0d2c7e 100644 --- a/src/main/java/com/abacatepay/model/IAbacatePayBilling.java +++ b/src/main/java/com/abacatepay/model/IAbacatePayBilling.java @@ -5,9 +5,11 @@ import com.abacatepay.model.billing.ListBillingResponse; import com.abacatepay.model.customer.CreateCustomerResponse; import com.abacatepay.model.customer.CustomerMetadata; +import com.abacatepay.model.customer.ListCustomerResponse; public interface IAbacatePayBilling { CreateBillingResponse create(CreateBillingData data); ListBillingResponse list(); CreateCustomerResponse createCustomer(CustomerMetadata data); + ListCustomerResponse listCustomers(); } diff --git a/src/main/java/com/abacatepay/model/customer/ListCustomerResponse.java b/src/main/java/com/abacatepay/model/customer/ListCustomerResponse.java new file mode 100644 index 0000000..e92b491 --- /dev/null +++ b/src/main/java/com/abacatepay/model/customer/ListCustomerResponse.java @@ -0,0 +1,17 @@ +package com.abacatepay.model.customer; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +public class ListCustomerResponse { + private String error; + private List data; + + public ListCustomerResponse(String error) { + this.error = error; + } +} From 2e2209bdb706f3f98822a7c0907dfcca263ec02d Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 11:43:35 -0300 Subject: [PATCH 09/16] test: add list customers --- .../java/com/abacatepay/AbacatePayTest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/test/java/com/abacatepay/AbacatePayTest.java b/src/test/java/com/abacatepay/AbacatePayTest.java index fcd51d4..4ccd69e 100644 --- a/src/test/java/com/abacatepay/AbacatePayTest.java +++ b/src/test/java/com/abacatepay/AbacatePayTest.java @@ -6,6 +6,7 @@ import com.abacatepay.model.billing.ListBillingResponse; import com.abacatepay.model.customer.CreateCustomerResponse; import com.abacatepay.model.customer.CustomerMetadata; +import com.abacatepay.model.customer.ListCustomerResponse; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -110,4 +111,28 @@ void shouldCreateCustomerThrowsAnException() { verify(abacatePayClient, atMostOnce()).createCustomer(request); Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); } + + @Test + void shouldReturnListCustomersResponseOnSuccess() { + ListCustomerResponse expectedResponse = new ListCustomerResponse(); + + when(abacatePayClient.listCustomers()) + .thenReturn(expectedResponse); + + ListCustomerResponse result = abacatePay.billing().listCustomers(); + verify(abacatePayClient, atMostOnce()).listCustomers(); + Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); + } + + @Test + void shouldListCustomersThrowsAnException() { + ListCustomerResponse expectedResponse = new ListCustomerResponse("Unauthorized"); + + when(abacatePayClient.listCustomers()) + .thenThrow(new IllegalArgumentException("Unauthorized")); + + ListCustomerResponse result = abacatePay.billing().listCustomers(); + verify(abacatePayClient, atMostOnce()).listCustomers(); + Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); + } } From 0294b1891ffb4aa02e0a12a5f10df9927e8c5675 Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 11:46:42 -0300 Subject: [PATCH 10/16] test: customers models --- .../customer/CreateCustomerResponseTest.java | 24 +++++++++++++++++++ .../customer/ListCustomerResponseTest.java | 24 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/test/java/com/abacatepay/model/customer/CreateCustomerResponseTest.java create mode 100644 src/test/java/com/abacatepay/model/customer/ListCustomerResponseTest.java diff --git a/src/test/java/com/abacatepay/model/customer/CreateCustomerResponseTest.java b/src/test/java/com/abacatepay/model/customer/CreateCustomerResponseTest.java new file mode 100644 index 0000000..02ba0a8 --- /dev/null +++ b/src/test/java/com/abacatepay/model/customer/CreateCustomerResponseTest.java @@ -0,0 +1,24 @@ +package com.abacatepay.model.customer; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class CreateCustomerResponseTest { + @Test + void testErrorConstructor() { + CreateCustomerResponse response = new CreateCustomerResponse("Error"); + assertEquals("Error occurred", response.getError(), "Error field must be set correctly"); + } + + @Test + void testGettersAndSetters() { + CreateCustomerResponse response = new CreateCustomerResponse(); + response.setError("Error occurred"); + response.setData(null); + + assertEquals("Error occurred", response.getError(), "Error field must be set correctly"); + assertNull(response.getData(), "Data field must be set correctly"); + } +} diff --git a/src/test/java/com/abacatepay/model/customer/ListCustomerResponseTest.java b/src/test/java/com/abacatepay/model/customer/ListCustomerResponseTest.java new file mode 100644 index 0000000..9d6104a --- /dev/null +++ b/src/test/java/com/abacatepay/model/customer/ListCustomerResponseTest.java @@ -0,0 +1,24 @@ +package com.abacatepay.model.customer; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class ListCustomerResponseTest { + @Test + void testErrorConstructor() { + ListCustomerResponse response = new ListCustomerResponse("Error occurred"); + assertEquals("Error occurred", response.getError(), "Error field must be set correctly"); + } + + @Test + void testGettersAndSetters() { + ListCustomerResponse response = new ListCustomerResponse(); + response.setError("Error occurred"); + response.setData(null); + + assertEquals("Error occurred", response.getError(), "Error field must be set correctly"); + assertNull(response.getData(), "Data field must be set correctly"); + } +} From 3328fa78d248d51846fda953ccbade0c3a29fc9f Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 11:47:49 -0300 Subject: [PATCH 11/16] feat: ensure customer metadada has a builder --- .../java/com/abacatepay/model/customer/CustomerMetadata.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/abacatepay/model/customer/CustomerMetadata.java b/src/main/java/com/abacatepay/model/customer/CustomerMetadata.java index b11e40b..25c232b 100644 --- a/src/main/java/com/abacatepay/model/customer/CustomerMetadata.java +++ b/src/main/java/com/abacatepay/model/customer/CustomerMetadata.java @@ -1,8 +1,10 @@ package com.abacatepay.model.customer; +import lombok.Builder; import lombok.Data; @Data +@Builder public class CustomerMetadata { private String name; private String cellphone; From 025122757c7d1af970d443285a037e35e98d0573 Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 11:48:37 -0300 Subject: [PATCH 12/16] test: ensure customer metadada has a builder --- src/test/java/com/abacatepay/AbacatePayTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/abacatepay/AbacatePayTest.java b/src/test/java/com/abacatepay/AbacatePayTest.java index 4ccd69e..d896280 100644 --- a/src/test/java/com/abacatepay/AbacatePayTest.java +++ b/src/test/java/com/abacatepay/AbacatePayTest.java @@ -89,7 +89,7 @@ void shouldListBillingThrowsAnException() { @Test void shouldReturnCreateCustomerResponseOnSuccess() { CreateCustomerResponse expectedResponse = new CreateCustomerResponse(); - CustomerMetadata request = new CustomerMetadata(); + CustomerMetadata request = CustomerMetadata.builder().build(); when(abacatePayClient.createCustomer(request)) .thenReturn(expectedResponse); @@ -102,7 +102,7 @@ void shouldReturnCreateCustomerResponseOnSuccess() { @Test void shouldCreateCustomerThrowsAnException() { CreateCustomerResponse expectedResponse = new CreateCustomerResponse("Unauthorized"); - CustomerMetadata request = new CustomerMetadata(); + CustomerMetadata request = CustomerMetadata.builder().build(); when(abacatePayClient.createCustomer(request)) .thenThrow(new IllegalArgumentException("Unauthorized")); From 7c0be2632e2df201be0a1b349801853c3eccc595 Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 12:02:13 -0300 Subject: [PATCH 13/16] refactor: moving abacate pay billing and customer to a service --- src/main/java/com/abacatepay/AbacatePay.java | 57 ++-------- .../com/abacatepay/model/IAbacatePay.java | 4 + .../abacatepay/model/IAbacatePayBilling.java | 15 --- .../services/IAbacatePayBilling.java | 10 ++ .../services/IAbacatePayCustomer.java | 10 ++ .../services/impl/AbacatePayBilling.java | 33 ++++++ .../services/impl/AbacatePayCustomer.java | 33 ++++++ .../java/com/abacatepay/AbacatePayTest.java | 106 ------------------ .../customer/CreateCustomerResponseTest.java | 2 +- .../model/customer/CustomerMetadataTest.java | 11 +- .../services/impl/AbacatePayBillingTest.java | 75 +++++++++++++ .../services/impl/AbacatePayCustomerTest.java | 79 +++++++++++++ 12 files changed, 260 insertions(+), 175 deletions(-) delete mode 100644 src/main/java/com/abacatepay/model/IAbacatePayBilling.java create mode 100644 src/main/java/com/abacatepay/services/IAbacatePayBilling.java create mode 100644 src/main/java/com/abacatepay/services/IAbacatePayCustomer.java create mode 100644 src/main/java/com/abacatepay/services/impl/AbacatePayBilling.java create mode 100644 src/main/java/com/abacatepay/services/impl/AbacatePayCustomer.java create mode 100644 src/test/java/com/abacatepay/services/impl/AbacatePayBillingTest.java create mode 100644 src/test/java/com/abacatepay/services/impl/AbacatePayCustomerTest.java diff --git a/src/main/java/com/abacatepay/AbacatePay.java b/src/main/java/com/abacatepay/AbacatePay.java index 83eb434..9a74acf 100644 --- a/src/main/java/com/abacatepay/AbacatePay.java +++ b/src/main/java/com/abacatepay/AbacatePay.java @@ -3,14 +3,10 @@ import com.abacatepay.clients.AbacatePayClient; import com.abacatepay.clients.factories.AbacatePayClientFactory; import com.abacatepay.model.IAbacatePay; -import com.abacatepay.model.IAbacatePayBilling; -import com.abacatepay.model.billing.CreateBillingData; -import com.abacatepay.model.billing.CreateBillingResponse; -import com.abacatepay.model.billing.ListBillingResponse; -import com.abacatepay.model.customer.CreateCustomerResponse; -import com.abacatepay.model.customer.CustomerMetadata; -import com.abacatepay.model.customer.ListCustomerResponse; -import feign.FeignException; +import com.abacatepay.services.IAbacatePayBilling; +import com.abacatepay.services.IAbacatePayCustomer; +import com.abacatepay.services.impl.AbacatePayBilling; +import com.abacatepay.services.impl.AbacatePayCustomer; import feign.RequestInterceptor; public class AbacatePay implements IAbacatePay { @@ -43,46 +39,11 @@ private RequestInterceptor requestInterceptor() { @Override public IAbacatePayBilling billing() { + return new AbacatePayBilling(client); + } - class AbacatePayBilling implements IAbacatePayBilling { - - @Override - public CreateBillingResponse create(CreateBillingData data) { - try { - return client.create(data); - } catch (IllegalArgumentException | FeignException e) { - return new CreateBillingResponse(e.getMessage()); - } - } - - @Override - public ListBillingResponse list() { - try { - return client.list(); - } catch (IllegalArgumentException | FeignException e) { - return new ListBillingResponse(e.getMessage()); - } - } - - @Override - public CreateCustomerResponse createCustomer(CustomerMetadata data) { - try { - return client.createCustomer(data); - } catch (IllegalArgumentException | FeignException e) { - return new CreateCustomerResponse(e.getMessage()); - } - } - - @Override - public ListCustomerResponse listCustomers() { - try { - return client.listCustomers(); - } catch (IllegalArgumentException | FeignException e) { - return new ListCustomerResponse(e.getMessage()); - } - } - } - - return new AbacatePayBilling(); + @Override + public IAbacatePayCustomer customer() { + return new AbacatePayCustomer(client); } } diff --git a/src/main/java/com/abacatepay/model/IAbacatePay.java b/src/main/java/com/abacatepay/model/IAbacatePay.java index ca7cde0..3446df2 100644 --- a/src/main/java/com/abacatepay/model/IAbacatePay.java +++ b/src/main/java/com/abacatepay/model/IAbacatePay.java @@ -1,5 +1,9 @@ package com.abacatepay.model; +import com.abacatepay.services.IAbacatePayBilling; +import com.abacatepay.services.IAbacatePayCustomer; + public interface IAbacatePay { IAbacatePayBilling billing(); + IAbacatePayCustomer customer(); } diff --git a/src/main/java/com/abacatepay/model/IAbacatePayBilling.java b/src/main/java/com/abacatepay/model/IAbacatePayBilling.java deleted file mode 100644 index c0d2c7e..0000000 --- a/src/main/java/com/abacatepay/model/IAbacatePayBilling.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.abacatepay.model; - -import com.abacatepay.model.billing.CreateBillingData; -import com.abacatepay.model.billing.CreateBillingResponse; -import com.abacatepay.model.billing.ListBillingResponse; -import com.abacatepay.model.customer.CreateCustomerResponse; -import com.abacatepay.model.customer.CustomerMetadata; -import com.abacatepay.model.customer.ListCustomerResponse; - -public interface IAbacatePayBilling { - CreateBillingResponse create(CreateBillingData data); - ListBillingResponse list(); - CreateCustomerResponse createCustomer(CustomerMetadata data); - ListCustomerResponse listCustomers(); -} diff --git a/src/main/java/com/abacatepay/services/IAbacatePayBilling.java b/src/main/java/com/abacatepay/services/IAbacatePayBilling.java new file mode 100644 index 0000000..a2d6972 --- /dev/null +++ b/src/main/java/com/abacatepay/services/IAbacatePayBilling.java @@ -0,0 +1,10 @@ +package com.abacatepay.services; + +import com.abacatepay.model.billing.CreateBillingData; +import com.abacatepay.model.billing.CreateBillingResponse; +import com.abacatepay.model.billing.ListBillingResponse; + +public interface IAbacatePayBilling { + CreateBillingResponse create(CreateBillingData data); + ListBillingResponse list(); +} diff --git a/src/main/java/com/abacatepay/services/IAbacatePayCustomer.java b/src/main/java/com/abacatepay/services/IAbacatePayCustomer.java new file mode 100644 index 0000000..d4a3e50 --- /dev/null +++ b/src/main/java/com/abacatepay/services/IAbacatePayCustomer.java @@ -0,0 +1,10 @@ +package com.abacatepay.services; + +import com.abacatepay.model.customer.CreateCustomerResponse; +import com.abacatepay.model.customer.CustomerMetadata; +import com.abacatepay.model.customer.ListCustomerResponse; + +public interface IAbacatePayCustomer { + CreateCustomerResponse create(CustomerMetadata data); + ListCustomerResponse list(); +} diff --git a/src/main/java/com/abacatepay/services/impl/AbacatePayBilling.java b/src/main/java/com/abacatepay/services/impl/AbacatePayBilling.java new file mode 100644 index 0000000..f9a4241 --- /dev/null +++ b/src/main/java/com/abacatepay/services/impl/AbacatePayBilling.java @@ -0,0 +1,33 @@ +package com.abacatepay.services.impl; + +import com.abacatepay.clients.AbacatePayClient; +import com.abacatepay.model.billing.CreateBillingData; +import com.abacatepay.model.billing.CreateBillingResponse; +import com.abacatepay.model.billing.ListBillingResponse; +import com.abacatepay.services.IAbacatePayBilling; +import feign.FeignException; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class AbacatePayBilling implements IAbacatePayBilling { + + private final AbacatePayClient client; + + @Override + public CreateBillingResponse create(CreateBillingData data) { + try { + return client.create(data); + } catch (IllegalArgumentException | FeignException e) { + return new CreateBillingResponse(e.getMessage()); + } + } + + @Override + public ListBillingResponse list() { + try { + return client.list(); + } catch (IllegalArgumentException | FeignException e) { + return new ListBillingResponse(e.getMessage()); + } + } +} diff --git a/src/main/java/com/abacatepay/services/impl/AbacatePayCustomer.java b/src/main/java/com/abacatepay/services/impl/AbacatePayCustomer.java new file mode 100644 index 0000000..dd09253 --- /dev/null +++ b/src/main/java/com/abacatepay/services/impl/AbacatePayCustomer.java @@ -0,0 +1,33 @@ +package com.abacatepay.services.impl; + +import com.abacatepay.clients.AbacatePayClient; +import com.abacatepay.model.customer.CreateCustomerResponse; +import com.abacatepay.model.customer.CustomerMetadata; +import com.abacatepay.model.customer.ListCustomerResponse; +import com.abacatepay.services.IAbacatePayCustomer; +import feign.FeignException; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class AbacatePayCustomer implements IAbacatePayCustomer { + + private final AbacatePayClient client; + + @Override + public CreateCustomerResponse create(CustomerMetadata data) { + try { + return client.createCustomer(data); + } catch (IllegalArgumentException | FeignException e) { + return new CreateCustomerResponse(e.getMessage()); + } + } + + @Override + public ListCustomerResponse list() { + try { + return client.listCustomers(); + } catch (IllegalArgumentException | FeignException e) { + return new ListCustomerResponse(e.getMessage()); + } + } +} diff --git a/src/test/java/com/abacatepay/AbacatePayTest.java b/src/test/java/com/abacatepay/AbacatePayTest.java index d896280..9efa22d 100644 --- a/src/test/java/com/abacatepay/AbacatePayTest.java +++ b/src/test/java/com/abacatepay/AbacatePayTest.java @@ -1,23 +1,13 @@ package com.abacatepay; import com.abacatepay.clients.AbacatePayClient; -import com.abacatepay.model.billing.CreateBillingData; -import com.abacatepay.model.billing.CreateBillingResponse; -import com.abacatepay.model.billing.ListBillingResponse; -import com.abacatepay.model.customer.CreateCustomerResponse; -import com.abacatepay.model.customer.CustomerMetadata; -import com.abacatepay.model.customer.ListCustomerResponse; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.lang.reflect.Field; -import static org.mockito.Mockito.*; - class AbacatePayTest { @Mock @@ -39,100 +29,4 @@ private void setClientMock(AbacatePay abacatePay, AbacatePayClient mockClient) t clientField.setAccessible(true); clientField.set(abacatePay, mockClient); } - - @Test - void shouldReturnCreateBillingResponseOnSuccess() { - CreateBillingData data = CreateBillingData.builder().build(); - CreateBillingResponse expectedResponse = new CreateBillingResponse(); - - when(abacatePayClient.create(data)).thenReturn(expectedResponse); - - CreateBillingResponse result = abacatePay.billing().create(data); - verify(abacatePayClient, atMostOnce()).create(data); - Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); - } - - @Test - void shouldCreateBillingThrowsAnException() { - CreateBillingData data = CreateBillingData.builder().build(); - CreateBillingResponse expectedResponse = new CreateBillingResponse("API key not provided"); - - when(abacatePayClient.create(data)).thenThrow(new IllegalArgumentException("API key not provided")); - - CreateBillingResponse result = abacatePay.billing().create(data); - verify(abacatePayClient, atMostOnce()).create(data); - Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); - } - - @Test - void shouldReturnBillingListResponseOnSucess() { - ListBillingResponse expectedResponse = new ListBillingResponse(); - - when(abacatePayClient.list()).thenReturn(expectedResponse); - - ListBillingResponse result = abacatePay.billing().list(); - verify(abacatePayClient, atMostOnce()).list(); - Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); - } - - @Test - void shouldListBillingThrowsAnException() { - ListBillingResponse expectedResponse = new ListBillingResponse("API key not provided"); - - when(abacatePayClient.list()).thenThrow(new IllegalArgumentException("API key not provided")); - - ListBillingResponse result = abacatePay.billing().list(); - verify(abacatePayClient, atMostOnce()).list(); - Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); - } - - @Test - void shouldReturnCreateCustomerResponseOnSuccess() { - CreateCustomerResponse expectedResponse = new CreateCustomerResponse(); - CustomerMetadata request = CustomerMetadata.builder().build(); - - when(abacatePayClient.createCustomer(request)) - .thenReturn(expectedResponse); - - CreateCustomerResponse result = abacatePay.billing().createCustomer(request); - verify(abacatePayClient, atMostOnce()).createCustomer(request); - Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); - } - - @Test - void shouldCreateCustomerThrowsAnException() { - CreateCustomerResponse expectedResponse = new CreateCustomerResponse("Unauthorized"); - CustomerMetadata request = CustomerMetadata.builder().build(); - - when(abacatePayClient.createCustomer(request)) - .thenThrow(new IllegalArgumentException("Unauthorized")); - - CreateCustomerResponse result = abacatePay.billing().createCustomer(request); - verify(abacatePayClient, atMostOnce()).createCustomer(request); - Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); - } - - @Test - void shouldReturnListCustomersResponseOnSuccess() { - ListCustomerResponse expectedResponse = new ListCustomerResponse(); - - when(abacatePayClient.listCustomers()) - .thenReturn(expectedResponse); - - ListCustomerResponse result = abacatePay.billing().listCustomers(); - verify(abacatePayClient, atMostOnce()).listCustomers(); - Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); - } - - @Test - void shouldListCustomersThrowsAnException() { - ListCustomerResponse expectedResponse = new ListCustomerResponse("Unauthorized"); - - when(abacatePayClient.listCustomers()) - .thenThrow(new IllegalArgumentException("Unauthorized")); - - ListCustomerResponse result = abacatePay.billing().listCustomers(); - verify(abacatePayClient, atMostOnce()).listCustomers(); - Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); - } } diff --git a/src/test/java/com/abacatepay/model/customer/CreateCustomerResponseTest.java b/src/test/java/com/abacatepay/model/customer/CreateCustomerResponseTest.java index 02ba0a8..2a7443c 100644 --- a/src/test/java/com/abacatepay/model/customer/CreateCustomerResponseTest.java +++ b/src/test/java/com/abacatepay/model/customer/CreateCustomerResponseTest.java @@ -8,7 +8,7 @@ public class CreateCustomerResponseTest { @Test void testErrorConstructor() { - CreateCustomerResponse response = new CreateCustomerResponse("Error"); + CreateCustomerResponse response = new CreateCustomerResponse("Error occurred"); assertEquals("Error occurred", response.getError(), "Error field must be set correctly"); } diff --git a/src/test/java/com/abacatepay/model/customer/CustomerMetadataTest.java b/src/test/java/com/abacatepay/model/customer/CustomerMetadataTest.java index c40b9d0..acef215 100644 --- a/src/test/java/com/abacatepay/model/customer/CustomerMetadataTest.java +++ b/src/test/java/com/abacatepay/model/customer/CustomerMetadataTest.java @@ -7,11 +7,12 @@ class CustomerMetadataTest { @Test void testGettersAndSetters() { - CustomerMetadata customerMetadata = new CustomerMetadata(); - customerMetadata.setName("John Doe"); - customerMetadata.setCellphone("123456789"); - customerMetadata.setEmail("john.doe@example.com"); - customerMetadata.setTaxId("12345678901"); + CustomerMetadata customerMetadata = CustomerMetadata.builder() + .name("John Doe") + .cellphone("123456789") + .email("john.doe@example.com") + .taxId("12345678901") + .build(); assertEquals("John Doe", customerMetadata.getName(), "Name field must be set correctly"); assertEquals("123456789", customerMetadata.getCellphone(), "Cellphone field must be set correctly"); diff --git a/src/test/java/com/abacatepay/services/impl/AbacatePayBillingTest.java b/src/test/java/com/abacatepay/services/impl/AbacatePayBillingTest.java new file mode 100644 index 0000000..dbeb292 --- /dev/null +++ b/src/test/java/com/abacatepay/services/impl/AbacatePayBillingTest.java @@ -0,0 +1,75 @@ +package com.abacatepay.services.impl; + +import com.abacatepay.clients.AbacatePayClient; +import com.abacatepay.model.billing.CreateBillingData; +import com.abacatepay.model.billing.CreateBillingResponse; +import com.abacatepay.model.billing.ListBillingResponse; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.atMostOnce; + +public class AbacatePayBillingTest { + + @Mock + private AbacatePayClient abacatePayClient; + + @InjectMocks + private AbacatePayBilling service; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void shouldReturnCreateBillingResponseOnSuccess() { + CreateBillingData data = CreateBillingData.builder().build(); + CreateBillingResponse expectedResponse = new CreateBillingResponse(); + + when(abacatePayClient.create(data)).thenReturn(expectedResponse); + + CreateBillingResponse result = service.create(data); + verify(abacatePayClient, atMostOnce()).create(data); + Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); + } + + @Test + void shouldCreateBillingThrowsAnException() { + CreateBillingData data = CreateBillingData.builder().build(); + CreateBillingResponse expectedResponse = new CreateBillingResponse("API key not provided"); + + when(abacatePayClient.create(data)).thenThrow(new IllegalArgumentException("API key not provided")); + + CreateBillingResponse result = service.create(data); + verify(abacatePayClient, atMostOnce()).create(data); + Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); + } + + @Test + void shouldReturnBillingListResponseOnSucess() { + ListBillingResponse expectedResponse = new ListBillingResponse(); + + when(abacatePayClient.list()).thenReturn(expectedResponse); + + ListBillingResponse result = service.list(); + verify(abacatePayClient, atMostOnce()).list(); + Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); + } + + @Test + void shouldListBillingThrowsAnException() { + ListBillingResponse expectedResponse = new ListBillingResponse("API key not provided"); + + when(abacatePayClient.list()).thenThrow(new IllegalArgumentException("API key not provided")); + + ListBillingResponse result = service.list(); + verify(abacatePayClient, atMostOnce()).list(); + Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); + } +} diff --git a/src/test/java/com/abacatepay/services/impl/AbacatePayCustomerTest.java b/src/test/java/com/abacatepay/services/impl/AbacatePayCustomerTest.java new file mode 100644 index 0000000..3cd758d --- /dev/null +++ b/src/test/java/com/abacatepay/services/impl/AbacatePayCustomerTest.java @@ -0,0 +1,79 @@ +package com.abacatepay.services.impl; + +import com.abacatepay.clients.AbacatePayClient; +import com.abacatepay.model.customer.CreateCustomerResponse; +import com.abacatepay.model.customer.CustomerMetadata; +import com.abacatepay.model.customer.ListCustomerResponse; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.atMostOnce; + +public class AbacatePayCustomerTest { + + @Mock + private AbacatePayClient abacatePayClient; + + @InjectMocks + private AbacatePayCustomer abacatePayCustomer; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void shouldReturnCreateCustomerResponseOnSuccess() { + CreateCustomerResponse expectedResponse = new CreateCustomerResponse(); + CustomerMetadata request = CustomerMetadata.builder().build(); + + when(abacatePayClient.createCustomer(request)) + .thenReturn(expectedResponse); + + CreateCustomerResponse result = abacatePayCustomer.create(request); + verify(abacatePayClient, atMostOnce()).createCustomer(request); + Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); + } + + @Test + void shouldCreateCustomerThrowsAnException() { + CreateCustomerResponse expectedResponse = new CreateCustomerResponse("Unauthorized"); + CustomerMetadata request = CustomerMetadata.builder().build(); + + when(abacatePayClient.createCustomer(request)) + .thenThrow(new IllegalArgumentException("Unauthorized")); + + CreateCustomerResponse result = abacatePayCustomer.create(request); + verify(abacatePayClient, atMostOnce()).createCustomer(request); + Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); + } + + @Test + void shouldReturnListCustomersResponseOnSuccess() { + ListCustomerResponse expectedResponse = new ListCustomerResponse(); + + when(abacatePayClient.listCustomers()) + .thenReturn(expectedResponse); + + ListCustomerResponse result = abacatePayCustomer.list(); + verify(abacatePayClient, atMostOnce()).listCustomers(); + Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); + } + + @Test + void shouldListCustomersThrowsAnException() { + ListCustomerResponse expectedResponse = new ListCustomerResponse("Unauthorized"); + + when(abacatePayClient.listCustomers()) + .thenThrow(new IllegalArgumentException("Unauthorized")); + + ListCustomerResponse result = abacatePayCustomer.list(); + verify(abacatePayClient, atMostOnce()).listCustomers(); + Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); + } +} From 04bbd114b2299e0edddcbb63cdc68f7d803dd3dc Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 12:06:27 -0300 Subject: [PATCH 14/16] test: abacate pay instance --- .../java/com/abacatepay/AbacatePayTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/test/java/com/abacatepay/AbacatePayTest.java b/src/test/java/com/abacatepay/AbacatePayTest.java index 9efa22d..96d3ce9 100644 --- a/src/test/java/com/abacatepay/AbacatePayTest.java +++ b/src/test/java/com/abacatepay/AbacatePayTest.java @@ -1,7 +1,13 @@ package com.abacatepay; import com.abacatepay.clients.AbacatePayClient; +import com.abacatepay.services.IAbacatePayBilling; +import com.abacatepay.services.IAbacatePayCustomer; +import com.abacatepay.services.impl.AbacatePayBilling; +import com.abacatepay.services.impl.AbacatePayCustomer; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -29,4 +35,18 @@ private void setClientMock(AbacatePay abacatePay, AbacatePayClient mockClient) t clientField.setAccessible(true); clientField.set(abacatePay, mockClient); } + + @Test + void testBilling() { + IAbacatePayBilling billingService = abacatePay.billing(); + Assertions.assertNotNull(billingService); + Assertions.assertTrue(billingService instanceof AbacatePayBilling); + } + + @Test + void testCustomer() { + IAbacatePayCustomer customerService = abacatePay.customer(); + Assertions.assertNotNull(customerService); + Assertions.assertTrue(customerService instanceof AbacatePayCustomer); + } } From 5548d756787b7c3710001dd26229db377a8fd253 Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 12:14:48 -0300 Subject: [PATCH 15/16] refactor: abacate pay billing calls to feign client --- .../services/impl/AbacatePayBilling.java | 4 ++-- .../services/impl/AbacatePayBillingTest.java | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/abacatepay/services/impl/AbacatePayBilling.java b/src/main/java/com/abacatepay/services/impl/AbacatePayBilling.java index f9a4241..429f376 100644 --- a/src/main/java/com/abacatepay/services/impl/AbacatePayBilling.java +++ b/src/main/java/com/abacatepay/services/impl/AbacatePayBilling.java @@ -16,7 +16,7 @@ public class AbacatePayBilling implements IAbacatePayBilling { @Override public CreateBillingResponse create(CreateBillingData data) { try { - return client.create(data); + return client.createBilling(data); } catch (IllegalArgumentException | FeignException e) { return new CreateBillingResponse(e.getMessage()); } @@ -25,7 +25,7 @@ public CreateBillingResponse create(CreateBillingData data) { @Override public ListBillingResponse list() { try { - return client.list(); + return client.listBillings(); } catch (IllegalArgumentException | FeignException e) { return new ListBillingResponse(e.getMessage()); } diff --git a/src/test/java/com/abacatepay/services/impl/AbacatePayBillingTest.java b/src/test/java/com/abacatepay/services/impl/AbacatePayBillingTest.java index dbeb292..5ad98c7 100644 --- a/src/test/java/com/abacatepay/services/impl/AbacatePayBillingTest.java +++ b/src/test/java/com/abacatepay/services/impl/AbacatePayBillingTest.java @@ -32,10 +32,10 @@ void shouldReturnCreateBillingResponseOnSuccess() { CreateBillingData data = CreateBillingData.builder().build(); CreateBillingResponse expectedResponse = new CreateBillingResponse(); - when(abacatePayClient.create(data)).thenReturn(expectedResponse); + when(abacatePayClient.createBilling(data)).thenReturn(expectedResponse); CreateBillingResponse result = service.create(data); - verify(abacatePayClient, atMostOnce()).create(data); + verify(abacatePayClient, atMostOnce()).createBilling(data); Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); } @@ -44,10 +44,10 @@ void shouldCreateBillingThrowsAnException() { CreateBillingData data = CreateBillingData.builder().build(); CreateBillingResponse expectedResponse = new CreateBillingResponse("API key not provided"); - when(abacatePayClient.create(data)).thenThrow(new IllegalArgumentException("API key not provided")); + when(abacatePayClient.createBilling(data)).thenThrow(new IllegalArgumentException("API key not provided")); CreateBillingResponse result = service.create(data); - verify(abacatePayClient, atMostOnce()).create(data); + verify(abacatePayClient, atMostOnce()).createBilling(data); Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); } @@ -55,10 +55,10 @@ void shouldCreateBillingThrowsAnException() { void shouldReturnBillingListResponseOnSucess() { ListBillingResponse expectedResponse = new ListBillingResponse(); - when(abacatePayClient.list()).thenReturn(expectedResponse); + when(abacatePayClient.listBillings()).thenReturn(expectedResponse); ListBillingResponse result = service.list(); - verify(abacatePayClient, atMostOnce()).list(); + verify(abacatePayClient, atMostOnce()).listBillings(); Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); } @@ -66,10 +66,10 @@ void shouldReturnBillingListResponseOnSucess() { void shouldListBillingThrowsAnException() { ListBillingResponse expectedResponse = new ListBillingResponse("API key not provided"); - when(abacatePayClient.list()).thenThrow(new IllegalArgumentException("API key not provided")); + when(abacatePayClient.listBillings()).thenThrow(new IllegalArgumentException("API key not provided")); ListBillingResponse result = service.list(); - verify(abacatePayClient, atMostOnce()).list(); + verify(abacatePayClient, atMostOnce()).listBillings(); Assertions.assertEquals(expectedResponse, result, "Should return the expected response"); } } From 32cd198442b9c2fa25e73fd00a2560ba60d7ad30 Mon Sep 17 00:00:00 2001 From: Joel Filho Date: Wed, 11 Dec 2024 12:20:39 -0300 Subject: [PATCH 16/16] refactor: timezone in dateutils --- src/main/java/com/abacatepay/utils/DateUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/abacatepay/utils/DateUtils.java b/src/main/java/com/abacatepay/utils/DateUtils.java index ec9e231..bc77de5 100644 --- a/src/main/java/com/abacatepay/utils/DateUtils.java +++ b/src/main/java/com/abacatepay/utils/DateUtils.java @@ -2,5 +2,5 @@ public class DateUtils { public static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; - public static final String DATE_TIMEZONE_DEFAULT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; + public static final String DATE_TIMEZONE_DEFAULT = "America/Sao_Paulo"; }