Skip to content

Commit

Permalink
adds unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Evan Greer committed Jan 27, 2025
1 parent 9bac4e9 commit 6ef4030
Show file tree
Hide file tree
Showing 2 changed files with 131 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public class IterableApi {
private String _apiKey;
private String _email;
private String _userId;
private String _userIdAnon;
String _userIdAnon;
private String _authToken;
private boolean _debugMode;
private Bundle _payloadData;
Expand Down Expand Up @@ -404,7 +404,7 @@ public void onSwitchToForeground() {
public void onSwitchToBackground() {}
};

private void onForeground() {
void onForeground() {
if (!_firstForegroundHandled) {
_firstForegroundHandled = true;
if (sharedInstance.config.autoPushRegistration && sharedInstance.isInitialized()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.iterable.iterableapi;

import com.iterable.iterableapi.unit.PathBasedQueueDispatcher;
import com.iterable.iterableapi.util.DeviceInfoUtils;
import android.app.Activity;
import android.net.Uri;
Expand Down Expand Up @@ -55,13 +56,17 @@ public class IterableApiTest extends BaseTest {

public static final String PACKAGE_NAME = "com.iterable.iterableapi.test";
private MockWebServer server;

private PathBasedQueueDispatcher dispatcher;
private IterableApiClient originalApiClient;
private IterableApiClient mockApiClient;
private IterablePushRegistration.IterablePushRegistrationImpl originalPushRegistrationImpl;

@Before
public void setUp() {
server = new MockWebServer();
dispatcher = new PathBasedQueueDispatcher();
server.setDispatcher(dispatcher);
IterableApi.overrideURLEndpointPath(server.url("").toString());

reInitIterableApi();
Expand Down Expand Up @@ -89,6 +94,10 @@ private void reInitIterableApi() {
IterableApi.sharedInstance.apiClient = mockApiClient;
}

private void addResponse(String endPoint) {
dispatcher.enqueueResponse("/" + endPoint, new MockResponse().setResponseCode(200).setBody("{}"));
}

@Test
public void testSdkInitializedWithoutEmailOrUserId() throws Exception {
IterableApi.initialize(getContext(), "apiKey");
Expand Down Expand Up @@ -836,4 +845,124 @@ public void testFetchRemoteConfigurationCalledWhenInForeground() throws Exceptio
IterableActivityMonitor.instance = new IterableActivityMonitor();
}

@Test
public void testForegroundCriteriaFetchWhenConditionsMet() throws Exception {
// Clear any pending requests
while (server.takeRequest(1, TimeUnit.SECONDS) != null) {}

// Mock responses for expected endpoints
addResponse(IterableConstants.ENDPOINT_CRITERIA_LIST);

// Initialize with anon activation and foreground fetch enabled
IterableConfig config = new IterableConfig.Builder()
.setEnableAnonActivation(true)
.setForegroundCriteriaFetch(true)
.build();

IterableActivityMonitor.getInstance().unregisterLifecycleCallbacks(getContext());
IterableActivityMonitor.instance = new IterableActivityMonitor();

// Initialize API
IterableApi.initialize(getContext(), "apiKey", config);
IterableApi.getInstance().setVisitorUsageTracked(true);

// Simulate app coming to foreground
Robolectric.buildActivity(Activity.class).create().start().resume();
shadowOf(getMainLooper()).idle();

// Verify criteria fetch request was made
RecordedRequest criteriaRequest = server.takeRequest(1, TimeUnit.SECONDS);
assertNotNull("Criteria request should be made on foreground", criteriaRequest);
assertTrue("Request URL should contain getCriteria endpoint",
criteriaRequest.getPath().contains(IterableConstants.ENDPOINT_CRITERIA_LIST));

// Clean up
IterableActivityMonitor.getInstance().unregisterLifecycleCallbacks(getContext());
IterableActivityMonitor.instance = new IterableActivityMonitor();
}

@Test
public void testCriteriaFetchNotCalledWhenDisabled() throws Exception {
// Clear any pending requests
while (server.takeRequest(1, TimeUnit.SECONDS) != null) { }

// Mock response for remote configuration only
addResponse(IterableConstants.ENDPOINT_GET_REMOTE_CONFIGURATION);
addResponse(IterableConstants.ENDPOINT_CRITERIA_LIST);

// Initialize with foreground fetch disabled
IterableConfig config = new IterableConfig.Builder()
.setEnableAnonActivation(true)
.setForegroundCriteriaFetch(false)
.build();

IterableActivityMonitor.getInstance().unregisterLifecycleCallbacks(getContext());
IterableActivityMonitor.instance = new IterableActivityMonitor();

// Initialize API
IterableApi.initialize(getContext(), "apiKey", config);

// Simulate app coming to foreground
Robolectric.buildActivity(Activity.class).create().start().resume();
shadowOf(getMainLooper()).idle();

// Take the remote configuration request
RecordedRequest remoteConfigRequest = server.takeRequest(1, TimeUnit.SECONDS);
assertNotNull(remoteConfigRequest);
assertTrue(remoteConfigRequest.getPath().contains(IterableConstants.ENDPOINT_GET_REMOTE_CONFIGURATION));

// Verify no criteria fetch request was made
RecordedRequest criteriaRequest = server.takeRequest(1, TimeUnit.SECONDS);
assertNull("No criteria request should be made when feature is disabled", criteriaRequest);

// Clean up
IterableActivityMonitor.getInstance().unregisterLifecycleCallbacks(getContext());
IterableActivityMonitor.instance = new IterableActivityMonitor();
}

@Test
public void testForegroundCriteriaFetchWithCooldown() throws Exception {
// Clear any pending requests
while (server.takeRequest(1, TimeUnit.SECONDS) != null) { }

// Mock responses
addResponse(IterableConstants.ENDPOINT_CRITERIA_LIST);
addResponse(IterableConstants.ENDPOINT_GET_REMOTE_CONFIGURATION);

// Initialize with required config
IterableConfig config = new IterableConfig.Builder()
.setEnableAnonActivation(true)
.setForegroundCriteriaFetch(true)
.build();

IterableActivityMonitor.getInstance().unregisterLifecycleCallbacks(getContext());
IterableActivityMonitor.instance = new IterableActivityMonitor();

// Initialize API
IterableApi.initialize(getContext(), "apiKey", config);
IterableApi.getInstance().setVisitorUsageTracked(true);

// First foreground
Robolectric.buildActivity(Activity.class).create().start().resume();
shadowOf(getMainLooper()).idle();

// Verify first criteria fetch
RecordedRequest firstCriteriaRequest = server.takeRequest(1, TimeUnit.SECONDS);
assertNotNull("First criteria request should be made", firstCriteriaRequest);
assertTrue("First request URL should contain getCriteria endpoint",
firstCriteriaRequest.getPath().contains(IterableConstants.ENDPOINT_CRITERIA_LIST));

// Immediate second foreground
Robolectric.buildActivity(Activity.class).create().start().resume();
shadowOf(getMainLooper()).idle();

// Verify no criteria requests during cooldown period
RecordedRequest secondRequest = server.takeRequest(1, TimeUnit.SECONDS);
assertFalse("Second request should not be a criteria request",
secondRequest.getPath().contains(IterableConstants.ENDPOINT_CRITERIA_LIST));

// Clean up
IterableActivityMonitor.getInstance().unregisterLifecycleCallbacks(getContext());
IterableActivityMonitor.instance = new IterableActivityMonitor();
}
}

0 comments on commit 6ef4030

Please sign in to comment.