package com.sharethis.loopy.test; import android.content.Context; import android.content.Intent; import com.sharethis.loopy.sdk.ApiCallback; import com.sharethis.loopy.sdk.ApiClient; import com.sharethis.loopy.sdk.Loopy; import com.sharethis.loopy.sdk.LoopyAccess; import com.sharethis.loopy.sdk.LoopyState; import com.sharethis.loopy.sdk.MockLoopy; import com.sharethis.loopy.sdk.Session; import com.sharethis.loopy.test.util.Holder; import org.mockito.Mockito; /** * @author Jason Polites */ public class LoopyInstallTrackerTest extends LoopyAndroidTestCase { public void testTrackInstallSuccess() { String referrerString = "foobar"; Intent intent = new Intent(); intent.putExtra("referrer", referrerString); final Holder<String> referrer = new Holder<String>(); ApiClient apiClient = new ApiClient() { @Override public void referrer(String apiKey, String apiSecret, String referrerString, ApiCallback callback) { // Do nothing, just make sure it's called referrer.set(referrerString); } }; MockLoopy loopy = new MockLoopy(apiClient); loopy.trackInstall(getContext(), intent); assertEquals(referrerString, referrer.get()); } public void testTrackInstallFail() { String referrerString = "foobar"; Intent intent = new Intent(); intent.putExtra("referrer", referrerString); final Session session = Mockito.mock(Session.class); final LoopyState state = Mockito.mock(LoopyState.class); Mockito.when(session.isStarted()).thenReturn(true); Mockito.when(session.getState()).thenReturn(state); Mockito.when(session.waitForStart()).thenReturn(session); ApiClient apiClient = new ApiClient() { @Override public void referrer(String apiKey, String apiSecret, String referrerString, ApiCallback callback) { // Simulate fail callback.onError(new Exception("Dummy Exception - Ignore Me")); } }; MockLoopy loopy = new MockLoopy(apiClient) { @Override public Session getSession() { return session; } }; loopy.trackInstall(getLocalContext(), intent); Mockito.verify(state).setReferrer(referrerString); Mockito.verify(state).save(Mockito.eq(getLocalContext()), (ApiCallback) Mockito.any()); } /** * tests that the internal broadcast triggered on async install is correctly handled. */ public void testInstallTrackerBroadcast() throws InterruptedException { String referrerString = "foobar"; final Intent intent = new Intent(); intent.putExtra("referrer", referrerString); final Holder<Intent> installIntentHolder = new Holder<Intent>(); ApiClient apiClient = Mockito.mock(ApiClient.class); MockLoopy loopy = new MockLoopy(apiClient) { @Override public void trackInstall(Context context, Intent intent) { installIntentHolder.set(intent); } }; LoopyAccess.setLoopy(loopy); final Context context = getLocalContext(); // Setup the broadcast system Loopy.onStart(context); // Simualate a separate process to trigger the install new Thread() { @Override public void run() { Loopy.onInstall(context, intent); } }.start(); // We need to wait for the process to be returned Thread.sleep(1000); Loopy.onStop(context); // now check the result Intent result = installIntentHolder.get(); assertNotNull(result); assertEquals(referrerString, result.getStringExtra("referrer")); } }