Skip to content

Commit

Permalink
PI-16686: Changed url to be dynamic when creating the OAuth1RetrofitW…
Browse files Browse the repository at this point in the history
…rapper
  • Loading branch information
gastontulipani authored and naponce committed Oct 17, 2019
1 parent a9a757a commit f90fbe6
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,49 +13,53 @@ 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
* @return an {@link APIResult} instance representing the marketplace response
* <p>
* 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
* <p>
* 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
* <p>
* throws an {@link MeteredUsageApiException} to the client with an error code and a status:
*/
APIResult reportUsage(String secretKey, List<MeteredUsageItem> meteredUsageItems);
APIResult reportUsage(String baseUrl, String secretKey, List<MeteredUsageItem> 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
* @return an {@link APIResult} instance representing the marketplace response
* <p>
* throws an {@link MeteredUsageApiException} to the client with an error code and a status:
*/
APIResult reportUsage(String key, String idempotentKey, List<MeteredUsageItem> meteredUsageItems);
APIResult reportUsage(String baseUrl, String key, String idempotentKey, List<MeteredUsageItem> meteredUsageItems);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<MeteredUsageItem> meteredUsageItems) {
return reportUsage(secretKey, UUID.randomUUID().toString(), meteredUsageItems);
public APIResult reportUsage(String baseUrl, String secretKey, List<MeteredUsageItem> meteredUsageItems) {
return reportUsage(baseUrl, secretKey, UUID.randomUUID().toString(), meteredUsageItems);
}

@Override
public APIResult reportUsage(String secretKey, String idempotentKey, List<MeteredUsageItem> 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<MeteredUsageItem> 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());
Expand All @@ -81,9 +81,12 @@ private APIResult processResponse(Response<MeteredUsageResponse> 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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand All @@ -62,9 +62,9 @@ public void testBillUsage_noErrors() {
List<MeteredUsageItem> 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();
}
Expand All @@ -82,9 +82,9 @@ public void testBillUsage_unsuccessfulCall() {
List<MeteredUsageItem> 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();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}

0 comments on commit f90fbe6

Please sign in to comment.