Skip to content

Commit

Permalink
Merge pull request #50 from button/najm/remove-track-order-implementa…
Browse files Browse the repository at this point in the history
…tions

Remove `trackOrder(~)` internal implementation
  • Loading branch information
najmsheikh committed Jul 28, 2020
2 parents 05299c2 + 306a82e commit a616300
Show file tree
Hide file tree
Showing 13 changed files with 13 additions and 394 deletions.
Expand Up @@ -46,11 +46,6 @@ PostInstallLink getPendingLink(String applicationId, @Nullable String advertisin
Map<String, String> signalsMap)
throws ButtonNetworkException;

@Nullable
@WorkerThread
Void postActivity(String applicationId, String sourceToken, String timestamp, Order order)
throws ButtonNetworkException;

@Nullable
@WorkerThread
Void postOrder(Order order, String applicationId, String sourceToken,
Expand Down
Expand Up @@ -112,36 +112,6 @@ public PostInstallLink getPendingLink(String applicationId, @Nullable String adv
return null;
}

@Override
public Void postActivity(String applicationId, String sourceToken, String timestamp,
Order order) throws ButtonNetworkException {

try {
// Create request body
JSONObject requestBody = new JSONObject();
requestBody.put("app_id", applicationId);
requestBody.put("user_local_time", timestamp);
requestBody.put("btn_ref", sourceToken);
requestBody.put("order_id", order.getId());
requestBody.put("total", order.getAmount());
requestBody.put("currency", order.getCurrencyCode());
requestBody.put("source", "merchant-library");

ApiRequest apiRequest = new ApiRequest.Builder(ApiRequest.RequestMethod.POST,
"/v1/activity/order")
.setBody(requestBody)
.build();

// Execute POST request and parse response
connectionManager.executeRequest(apiRequest);
} catch (JSONException e) {
Log.e(TAG, "Error creating request body", e);
throw new ButtonNetworkException(e);
}

return null;
}

@Nullable
@Override
public Void postOrder(Order order, String applicationId, String sourceToken,
Expand Down
Expand Up @@ -44,9 +44,6 @@ interface ButtonInternal {
void trackIncomingIntent(ButtonRepository buttonRepository, DeviceManager deviceManager,
Features features, Intent intent);

void trackOrder(ButtonRepository buttonRepository, DeviceManager manager,
@NonNull Order order, @Nullable UserActivityListener listener);

@Nullable
String getAttributionToken(ButtonRepository buttonRepository);

Expand Down
Expand Up @@ -100,52 +100,6 @@ public void trackIncomingIntent(ButtonRepository buttonRepository, DeviceManager
reportDeeplinkOpenEvent(buttonRepository, deviceManager, features, data);
}

@Override
public void trackOrder(ButtonRepository buttonRepository, DeviceManager manager,
@NonNull Order order, @Nullable final UserActivityListener listener) {
if (buttonRepository.getApplicationId() == null) {
if (listener != null) {
executor.execute(new Runnable() {
@Override
public void run() {
listener.onResult(new ApplicationIdNotFoundException());
}
});
}

return;
}

/// Create internal class that will forward callback to the UserActivityListener
Task.Listener taskListener = new Task.Listener() {
@Override
public void onTaskComplete(@Nullable Object object) {
if (listener != null) {
executor.execute(new Runnable() {
@Override
public void run() {
listener.onResult(null);
}
});
}
}

@Override
public void onTaskError(final Throwable throwable) {
if (listener != null) {
executor.execute(new Runnable() {
@Override
public void run() {
listener.onResult(throwable);
}
});
}
}
};

buttonRepository.postUserActivity(manager, order, taskListener);
}

@Nullable
@Override
public String getAttributionToken(ButtonRepository buttonRepository) {
Expand Down
Expand Up @@ -88,8 +88,11 @@ public static void trackIncomingIntent(@NonNull Context context, @NonNull Intent
@Deprecated
public static void trackOrder(@NonNull Context context, @NonNull Order order,
@Nullable UserActivityListener userActivityListener) {
buttonInternal.trackOrder(getButtonRepository(context), getDeviceManager(context), order,
userActivityListener);
if (userActivityListener != null) {
Throwable error = new Throwable("trackOrder(~) is no longer supported."
+ " You can safely remove your usage of this method.");
userActivityListener.onResult(error);
}
}

/**
Expand Down
Expand Up @@ -49,8 +49,6 @@ interface ButtonRepository {
void getPendingLink(DeviceManager deviceManager, Features features,
Task.Listener<PostInstallLink> listener);

void postUserActivity(DeviceManager deviceManager, Order order, Task.Listener listener);

boolean checkedDeferredDeepLink();

void updateCheckDeferredDeepLink(boolean checkedDeferredDeepLink);
Expand Down
Expand Up @@ -106,13 +106,6 @@ public void getPendingLink(DeviceManager deviceManager, Features features,
executorService.submit(getPendingLinkTask);
}

@Override
public void postUserActivity(DeviceManager deviceManager, Order order, Task.Listener listener) {
executorService.submit(
new UserActivityTask(listener, buttonApi, getApplicationId(), getSourceToken(),
deviceManager, order));
}

@Override
public boolean checkedDeferredDeepLink() {
return persistenceManager.checkedDeferredDeepLink();
Expand Down

This file was deleted.

Expand Up @@ -134,42 +134,6 @@ public void getPendingLink_returnsException_catchException() throws Exception {
Collections.<String, String>emptyMap());
}

@Test(expected = ButtonNetworkException.class)
public void postUserActivity_returnsException_catchException() throws Exception {
when(connectionManager.executeRequest(any(ApiRequest.class)))
.thenThrow(ButtonNetworkException.class);

Order order = new Order.Builder("123").setCurrencyCode("AUG").build();
buttonApi.postActivity("valid_application_id", "valid_aid", "valid_ts", order);
}

@Test
public void postUserActivity_validateRequest() throws Exception {
ArgumentCaptor<ApiRequest> argumentCaptor = ArgumentCaptor.forClass(ApiRequest.class);
JSONObject body = new JSONObject("{\"meta\":{\"status\":\"ok\"}}\n");
NetworkResponse response = new NetworkResponse(200, body);
when(connectionManager.executeRequest(argumentCaptor.capture()))
.thenReturn(response);

Order order = new Order.Builder("123").setAmount(999).setCurrencyCode("AUG").build();
buttonApi.postActivity("valid_application_id", "valid_aid", "valid_ts", order);

ApiRequest apiRequest = argumentCaptor.getValue();
JSONObject requestBody = apiRequest.getBody();

assertEquals(ApiRequest.RequestMethod.POST, apiRequest.getRequestMethod());
assertEquals("/v1/activity/order", apiRequest.getPath());

// request body
assertEquals("valid_application_id", requestBody.getString("app_id"));
assertEquals("valid_ts", requestBody.getString("user_local_time"));
assertEquals("valid_aid", requestBody.getString("btn_ref"));
assertEquals("123", requestBody.getString("order_id"));
assertEquals(999, requestBody.getLong("total"));
assertEquals("AUG", requestBody.getString("currency"));
assertEquals("merchant-library", requestBody.getString("source"));
}

@Test
public void postOrder_validateRequestMethodAndPath() throws Exception {
Order order = new Order.Builder("123", new Date(), Collections.<Order.LineItem>emptyList())
Expand Down
Expand Up @@ -36,8 +36,6 @@
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

import java.util.concurrent.Executor;

Expand All @@ -49,7 +47,6 @@
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
Expand Down Expand Up @@ -113,129 +110,6 @@ public void trackIncomingIntent_withNullIntentData_doNotPersist() {
verify(buttonRepository, never()).setSourceToken(anyString());
}

@Test
public void trackIncomingIntent_withValidIntentData_shouldReportDeeplinkOpenEvent() {
ButtonRepository buttonRepository = mock(ButtonRepository.class);
Intent intent = mock(Intent.class);
Uri uri = mock(Uri.class);
Uri.Builder builder = mock(Uri.Builder.class);
when(intent.getData()).thenReturn(uri);
when(uri.buildUpon()).thenReturn(builder);
when(uri.buildUpon().clearQuery()).thenReturn(builder);
when(builder.build()).thenReturn(uri);
when(uri.getQueryParameter("btn_ref")).thenReturn("valid_source_token");
ArgumentCaptor<Event> eventCaptor = ArgumentCaptor.forClass(Event.class);

buttonInternal.trackIncomingIntent(buttonRepository, mock(DeviceManager.class),
mock(Features.class), intent);

verify(buttonRepository).reportEvent(any(DeviceManager.class), any(Features.class),
eventCaptor.capture());
Event event = eventCaptor.getValue();

assertEquals(Event.Name.DEEPLINK_OPENED, event.getName());
}

@Test
public void trackIncomingIntent_withNullIntentData_shouldNotReportDeeplinkOpenEvent() {
ButtonRepository buttonRepository = mock(ButtonRepository.class);
Intent intent = mock(Intent.class);
when(intent.getData()).thenReturn(null);

buttonInternal.trackIncomingIntent(buttonRepository, mock(DeviceManager.class),
mock(Features.class), intent);

verify(buttonRepository, never()).reportEvent(any(DeviceManager.class),
any(Features.class), any(Event.class));
}

@Test
public void trackOrder_withValidParams_NonNullListener() {
ButtonRepository buttonRepository = mock(ButtonRepository.class);

when(buttonRepository.getApplicationId()).thenReturn("valid_id");
buttonInternal.trackOrder(buttonRepository, mock(DeviceManager.class), mock(Order.class),
mock(UserActivityListener.class));

verify(buttonRepository).postUserActivity(any(DeviceManager.class), any(Order.class),
any(Task.Listener.class));
}

@Test
public void trackOrder_nullApplicationId() {
ButtonRepository buttonRepository = mock(ButtonRepository.class);
UserActivityListener listener = mock(UserActivityListener.class);

when(buttonRepository.getApplicationId()).thenReturn(null);
buttonInternal.trackOrder(buttonRepository, mock(DeviceManager.class), mock(Order.class),
listener);

verify(listener).onResult(any(ApplicationIdNotFoundException.class));
verify(buttonRepository, never()).postUserActivity(any(DeviceManager.class),
any(Order.class),
any(Task.Listener.class));
}

@Test
public void trackOrder_nullApplicationIdAndListener() {
ButtonRepository buttonRepository = mock(ButtonRepository.class);

when(buttonRepository.getApplicationId()).thenReturn(null);
buttonInternal.trackOrder(buttonRepository, mock(DeviceManager.class), mock(Order.class),
null);

verify(buttonRepository, never()).postUserActivity(any(DeviceManager.class),
any(Order.class),
any(Task.Listener.class));
}

@Test
public void trackOrder_validateUserActivityListenerOnSuccess() {
ButtonRepository buttonRepository = mock(ButtonRepository.class);
final UserActivityListener listener = mock(UserActivityListener.class);

doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
final Task.Listener listener1 = invocation.getArgument(2);
listener1.onTaskComplete(null);
return null;
}
}).when(buttonRepository)
.postUserActivity(any(DeviceManager.class), any(Order.class),
any(Task.Listener.class));

when(buttonRepository.getApplicationId()).thenReturn("valid_id");

buttonInternal.trackOrder(buttonRepository, mock(DeviceManager.class), mock(Order.class),
listener);
verify(listener).onResult(null);
}

@Test
public void trackOrder_validateUserActivityListenerOnError() {
ButtonRepository buttonRepository = mock(ButtonRepository.class);
final UserActivityListener listener = mock(UserActivityListener.class);
final Throwable throwable = new ButtonNetworkException("");

doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
final Task.Listener listener1 = invocation.getArgument(2);
listener1.onTaskError(throwable);
return null;
}
}).when(buttonRepository)
.postUserActivity(any(DeviceManager.class), any(Order.class),
any(Task.Listener.class));

when(buttonRepository.getApplicationId()).thenReturn("valid_id");

buttonInternal.trackOrder(buttonRepository, mock(DeviceManager.class), mock(Order.class),
listener);
verify(listener).onResult(throwable);
}

@Test
public void setAttributionToken_ShouldNotifyListenersWithToken() {
String validToken = "valid_source_token";
Expand Down

0 comments on commit a616300

Please sign in to comment.