From f90fbe684c5646e11a8210c34de97b5f706fa07e Mon Sep 17 00:00:00 2001 From: Gaston Tulipani Date: Thu, 17 Oct 2019 11:23:06 -0300 Subject: [PATCH] PI-16686: Changed url to be dynamic when creating the OAuth1RetrofitWrapper --- .../AppmarketCommunicationConfiguration.java | 4 +- .../config/OAuth1RetrofitWrapper.java | 44 +++++++++++++------ .../service/MeteredUsageApiClientService.java | 12 +++-- .../MeteredUsageApiClientServiceImpl.java | 29 ++++++------ .../MeteredUsageApiClientServiceTest.java | 10 ++--- .../config/OAuth1RetrofitWrapperTest.java | 34 ++++++++++++++ 6 files changed, 95 insertions(+), 38 deletions(-) create mode 100644 src/test/java/com/appdirect/sdk/meteredusage/config/OAuth1RetrofitWrapperTest.java diff --git a/src/main/java/com/appdirect/sdk/appmarket/events/AppmarketCommunicationConfiguration.java b/src/main/java/com/appdirect/sdk/appmarket/events/AppmarketCommunicationConfiguration.java index 320734b6..d86e3480 100644 --- a/src/main/java/com/appdirect/sdk/appmarket/events/AppmarketCommunicationConfiguration.java +++ b/src/main/java/com/appdirect/sdk/appmarket/events/AppmarketCommunicationConfiguration.java @@ -49,8 +49,8 @@ public MeteredUsageApiClientService meteredUsageApiClientService(DeveloperSpecif } @Bean - public OAuth1RetrofitWrapper oAuth1RetrofitWrapper(@Value("${meteredUsage.baseUrl:http://metered-usage}") String baseUrl) { - return new OAuth1RetrofitWrapper(baseUrl); + public OAuth1RetrofitWrapper oAuth1RetrofitWrapper() { + return new OAuth1RetrofitWrapper(); } @Bean diff --git a/src/main/java/com/appdirect/sdk/meteredusage/config/OAuth1RetrofitWrapper.java b/src/main/java/com/appdirect/sdk/meteredusage/config/OAuth1RetrofitWrapper.java index 5248d442..f59eb74d 100644 --- a/src/main/java/com/appdirect/sdk/meteredusage/config/OAuth1RetrofitWrapper.java +++ b/src/main/java/com/appdirect/sdk/meteredusage/config/OAuth1RetrofitWrapper.java @@ -10,30 +10,46 @@ @Component public class OAuth1RetrofitWrapper { - private Retrofit.Builder builder; + private Retrofit.Builder retrofitBuilder; - public OAuth1RetrofitWrapper(String baseUrl) { - this.builder = new Retrofit.Builder() - .baseUrl(baseUrl) - .addConverterFactory(JacksonConverterFactory.create()); + public OAuth1RetrofitWrapper() { + this.retrofitBuilder = new Retrofit.Builder().addConverterFactory(JacksonConverterFactory.create()); } - public Retrofit sign(String key, String secret) { - return builder.client(getOkHttpOAuthConsumer(key, secret)) - .build(); + /** + * Method used to set the baseUrl for the requests + */ + public OAuth1RetrofitWrapper baseUrl(String baseUrl) { + retrofitBuilder = retrofitBuilder.baseUrl(baseUrl); + return this; } - private OkHttpClient getOkHttpOAuthConsumer(String key, String secret) { - final OkHttpClient.Builder builder = new OkHttpClient.Builder(); + /** + * Method used to sign with the given oauthConsumerKey and oauthConsumerSecret + */ + public OAuth1RetrofitWrapper sign(String oauthConsumerKey, String oauthConsumerSecret) { + configureOkHttpClient(oauthConsumerKey, oauthConsumerSecret); + return this; + } + + /** + * Method used to obtain the {@link Retrofit} class used for the API calls + */ + public Retrofit build() { + return retrofitBuilder.build(); + } + + private void configureOkHttpClient(String oauthConsumerKey, String oauthConsumerSecret) { + final OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder(); // Add a logging interceptor to capture incoming/outgoing calls. HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); - builder.addInterceptor(httpLoggingInterceptor); + okHttpClientBuilder.addInterceptor(httpLoggingInterceptor); - OkHttpOAuthConsumer consumer = new OkHttpOAuthConsumer(key, secret); + OkHttpOAuthConsumer consumer = new OkHttpOAuthConsumer(oauthConsumerKey, oauthConsumerSecret); - builder.addNetworkInterceptor(new ChainableSigningInterceptor(consumer)); - return builder.build(); + okHttpClientBuilder.addNetworkInterceptor(new ChainableSigningInterceptor(consumer)); + retrofitBuilder = retrofitBuilder.client(okHttpClientBuilder.build()); } } diff --git a/src/main/java/com/appdirect/sdk/meteredusage/service/MeteredUsageApiClientService.java b/src/main/java/com/appdirect/sdk/meteredusage/service/MeteredUsageApiClientService.java index 7eff109c..af002f0e 100644 --- a/src/main/java/com/appdirect/sdk/meteredusage/service/MeteredUsageApiClientService.java +++ b/src/main/java/com/appdirect/sdk/meteredusage/service/MeteredUsageApiClientService.java @@ -13,6 +13,7 @@ public interface MeteredUsageApiClientService { * Calls the Metered Usage API Endpoint to bill usages. * This should be used instead of {@link AppmarketBillingClient} as this replaces the old API version. * + * @param baseUrl from the request * @param secretKey to sign the request * @param idempotentKey to make unique calls * @param meteredUsageItem usage instance to be reported @@ -20,36 +21,39 @@ public interface MeteredUsageApiClientService { *

* throws an {@link MeteredUsageApiException} to the client with an error code and a status: */ - APIResult reportUsage(String secretKey, String idempotentKey, MeteredUsageItem meteredUsageItem); + APIResult reportUsage(String baseUrl, String secretKey, String idempotentKey, MeteredUsageItem meteredUsageItem); /** * Calls the Metered Usage API Endpoint to bill usages. * This should be used instead of {@link AppmarketBillingClient} as this replaces the old API version. * + * @param baseUrl from the request * @param secretKey to sign the request * @param meteredUsageItem usage instance to be reported * @return an {@link APIResult} instance representing the marketplace response *

* throws an {@link MeteredUsageApiException} to the client with an error code and a status: */ - APIResult reportUsage(String secretKey, MeteredUsageItem meteredUsageItem); + APIResult reportUsage(String baseUrl, String secretKey, MeteredUsageItem meteredUsageItem); /** * Calls the Metered Usage API Endpoint to bill usages. * This should be used instead of {@link AppmarketBillingClient} as this replaces the old API version. * + * @param baseUrl from the request * @param secretKey to sign the request * @param meteredUsageItems list of usages to be reported * @return an {@link APIResult} instance representing the marketplace response *

* throws an {@link MeteredUsageApiException} to the client with an error code and a status: */ - APIResult reportUsage(String secretKey, List meteredUsageItems); + APIResult reportUsage(String baseUrl, String secretKey, List meteredUsageItems); /** * Calls the Metered Usage API Endpoint to bill usages. * This should be used instead of {@link AppmarketBillingClient} as this replaces the old API version. * + * @param baseUrl from the request * @param key to sign the request * @param idempotentKey to make unique calls * @param meteredUsageItems list of usages to be reported @@ -57,5 +61,5 @@ public interface MeteredUsageApiClientService { *

* throws an {@link MeteredUsageApiException} to the client with an error code and a status: */ - APIResult reportUsage(String key, String idempotentKey, List meteredUsageItems); + APIResult reportUsage(String baseUrl, String key, String idempotentKey, List meteredUsageItems); } diff --git a/src/main/java/com/appdirect/sdk/meteredusage/service/MeteredUsageApiClientServiceImpl.java b/src/main/java/com/appdirect/sdk/meteredusage/service/MeteredUsageApiClientServiceImpl.java index 8463561b..98d4946e 100644 --- a/src/main/java/com/appdirect/sdk/meteredusage/service/MeteredUsageApiClientServiceImpl.java +++ b/src/main/java/com/appdirect/sdk/meteredusage/service/MeteredUsageApiClientServiceImpl.java @@ -38,32 +38,32 @@ public MeteredUsageApiClientServiceImpl(DeveloperSpecificAppmarketCredentialsSup } @Override - public APIResult reportUsage(String secretKey, String idempotentKey, MeteredUsageItem meteredUsageItem) { - return reportUsage(secretKey, idempotentKey, Lists.newArrayList(meteredUsageItem)); + public APIResult reportUsage(String baseUrl, String secretKey, String idempotentKey, MeteredUsageItem meteredUsageItem) { + return reportUsage(baseUrl, secretKey, idempotentKey, Lists.newArrayList(meteredUsageItem)); } @Override - public APIResult reportUsage(String secretKey, MeteredUsageItem meteredUsageItem) { - return reportUsage(secretKey, UUID.randomUUID().toString(), Lists.newArrayList(meteredUsageItem)); + public APIResult reportUsage(String baseUrl, String secretKey, MeteredUsageItem meteredUsageItem) { + return reportUsage(baseUrl, secretKey, UUID.randomUUID().toString(), Lists.newArrayList(meteredUsageItem)); } @Override - public APIResult reportUsage(String secretKey, List meteredUsageItems) { - return reportUsage(secretKey, UUID.randomUUID().toString(), meteredUsageItems); + public APIResult reportUsage(String baseUrl, String secretKey, List meteredUsageItems) { + return reportUsage(baseUrl, secretKey, UUID.randomUUID().toString(), meteredUsageItems); } @Override - public APIResult reportUsage(String secretKey, String idempotentKey, List meteredUsageItems) { - - Preconditions.checkArgument(!CollectionUtils.isEmpty(meteredUsageItems), "Usage data to report must not be empty"); - Preconditions.checkArgument(!StringUtils.isEmpty(idempotentKey), "IdempotentKey must not be empty"); + public APIResult reportUsage(String baseUrl, String secretKey, String idempotentKey, List meteredUsageItems) { + Preconditions.checkArgument(!StringUtils.isEmpty(baseUrl), "Base URL must not be empty"); Preconditions.checkArgument(!StringUtils.isEmpty(secretKey), "Secret Key must not be empty"); + Preconditions.checkArgument(!StringUtils.isEmpty(idempotentKey), "IdempotentKey must not be empty"); + Preconditions.checkArgument(!CollectionUtils.isEmpty(meteredUsageItems), "Usage data to report must not be empty"); // Create Request MeteredUsageRequest meteredUsageRequest = createMeteredUsageRequest(idempotentKey, meteredUsageItems); // Create API - MeteredUsageApi meteredUsageApi = createMeteredUsageApi(secretKey); + MeteredUsageApi meteredUsageApi = createMeteredUsageApi(baseUrl, secretKey); try { return processResponse(meteredUsageApi.meteredUsageCall(meteredUsageRequest).execute()); @@ -81,9 +81,12 @@ private APIResult processResponse(Response response) { return new APIResult(false, String.format("Failed to inform Usage with errorCode=%s, message=%s", response.code(), response.message())); } - public MeteredUsageApi createMeteredUsageApi(String key) { + public MeteredUsageApi createMeteredUsageApi(String baseUrl, String key) { String secret = credentialsSupplier.getConsumerCredentials(key).developerSecret; - return oAuth1RetrofitWrapper.sign(key, secret) + return oAuth1RetrofitWrapper + .baseUrl(baseUrl) + .sign(key, secret) + .build() .create(MeteredUsageApi.class); } diff --git a/src/test/java/com/appdirect/sdk/meteredusage/MeteredUsageApiClientServiceTest.java b/src/test/java/com/appdirect/sdk/meteredusage/MeteredUsageApiClientServiceTest.java index 1204e4a4..ac884d8f 100644 --- a/src/test/java/com/appdirect/sdk/meteredusage/MeteredUsageApiClientServiceTest.java +++ b/src/test/java/com/appdirect/sdk/meteredusage/MeteredUsageApiClientServiceTest.java @@ -42,7 +42,7 @@ public class MeteredUsageApiClientServiceTest { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - OAuth1RetrofitWrapper oAuth1RetrofitWrapper = new OAuth1RetrofitWrapper(ConstantUtils.BASE_URL); + OAuth1RetrofitWrapper oAuth1RetrofitWrapper = new OAuth1RetrofitWrapper(); meteredUsageApiClientService = spy(new MeteredUsageApiClientServiceImpl(credentialsSupplier, oAuth1RetrofitWrapper)); @@ -62,9 +62,9 @@ public void testBillUsage_noErrors() { List items = Lists.newArrayList(meteredUsageItem); doReturn(call).when(meteredUsageApi).meteredUsageCall(any()); - doReturn(meteredUsageApi).when(meteredUsageApiClientService).createMeteredUsageApi( any()); + doReturn(meteredUsageApi).when(meteredUsageApiClientService).createMeteredUsageApi(ConstantUtils.BASE_URL, ConstantUtils.CONSUMER_KEY); - APIResult result = meteredUsageApiClientService.reportUsage(ConstantUtils.CONSUMER_KEY, ConstantUtils.IDEMPOTENCY_KEY, items); + APIResult result = meteredUsageApiClientService.reportUsage(ConstantUtils.BASE_URL, ConstantUtils.CONSUMER_KEY, ConstantUtils.IDEMPOTENCY_KEY, items); assertThat(result.isSuccess()).isTrue(); } @@ -82,9 +82,9 @@ public void testBillUsage_unsuccessfulCall() { List items = Lists.newArrayList(meteredUsageItem); doReturn(call).when(meteredUsageApi).meteredUsageCall(any()); - doReturn(meteredUsageApi).when(meteredUsageApiClientService).createMeteredUsageApi( any()); + doReturn(meteredUsageApi).when(meteredUsageApiClientService).createMeteredUsageApi(ConstantUtils.BASE_URL, ConstantUtils.CONSUMER_KEY); - APIResult result = meteredUsageApiClientService.reportUsage(ConstantUtils.CONSUMER_KEY, ConstantUtils.IDEMPOTENCY_KEY, items); + APIResult result = meteredUsageApiClientService.reportUsage(ConstantUtils.BASE_URL, ConstantUtils.CONSUMER_KEY, ConstantUtils.IDEMPOTENCY_KEY, items); assertThat(result.isSuccess()).isFalse(); } diff --git a/src/test/java/com/appdirect/sdk/meteredusage/config/OAuth1RetrofitWrapperTest.java b/src/test/java/com/appdirect/sdk/meteredusage/config/OAuth1RetrofitWrapperTest.java new file mode 100644 index 00000000..9ba38bff --- /dev/null +++ b/src/test/java/com/appdirect/sdk/meteredusage/config/OAuth1RetrofitWrapperTest.java @@ -0,0 +1,34 @@ +package com.appdirect.sdk.meteredusage.config; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.spy; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.appdirect.sdk.utils.ConstantUtils; +import retrofit2.Retrofit; + +public class OAuth1RetrofitWrapperTest { + private OAuth1RetrofitWrapper oAuth1RetrofitWrapper; + + @BeforeMethod + public void setup() { + oAuth1RetrofitWrapper = spy(new OAuth1RetrofitWrapper()); + } + + @Test + public void testBaseUrl() { + assertThat(oAuth1RetrofitWrapper.baseUrl(ConstantUtils.BASE_URL)).isInstanceOf(OAuth1RetrofitWrapper.class); + } + + @Test + public void testSign() { + assertThat(oAuth1RetrofitWrapper.sign(ConstantUtils.CONSUMER_KEY, ConstantUtils.CONSUMER_SECRET)).isInstanceOf(OAuth1RetrofitWrapper.class); + } + + @Test + public void testBuild() { + assertThat(oAuth1RetrofitWrapper.baseUrl(ConstantUtils.BASE_URL).build()).isExactlyInstanceOf(Retrofit.class); + } +}