package com.mopub.nativeads;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import com.mopub.common.MoPubBrowser;
import com.mopub.common.test.support.SdkTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.robolectric.Robolectric;
import java.util.Iterator;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(SdkTestRunner.class)
public class ClickDestinationResolutionListenerTest {
private Activity context;
private Iterator mockIterator;
private SpinningProgressView mockSpinningProgressView;
private ClickDestinationResolutionListener subject;
@Before
public void setUp() throws Exception {
context = spy(Robolectric.buildActivity(Activity.class).create().get());
when(context.getApplicationContext()).thenReturn(context);
mockIterator = mock(Iterator.class);
mockSpinningProgressView = mock(SpinningProgressView.class);
subject = new ClickDestinationResolutionListener(context, mockIterator,
mockSpinningProgressView);
}
@Test
public void onSuccess_withMoPubNativeBrowserUrl_shouldOpenExternalBrowserAndHideProgressView() {
subject.onSuccess("mopubnativebrowser://navigate?url=https%3A%2F%2Fwww.example.com");
Intent intent = Robolectric.getShadowApplication().getNextStartedActivity();
assertThat(intent.getDataString()).isEqualTo("https://www.example.com");
assertThat(intent.getAction()).isEqualTo(Intent.ACTION_VIEW);
verify(mockSpinningProgressView).removeFromRoot();
}
@Test
public void onSuccess_withMalformedMoPubNativeBrowserUrl_shouldHideProgressViewButNotOpenExternalBrowser() {
// url2 is the wrong query parameter
subject.onSuccess("mopubnativebrowser://navigate?url2=https%3A%2F%2Fwww.example.com");
assertThat(Robolectric.getShadowApplication().getNextStartedActivity()).isNull();
verify(mockSpinningProgressView).removeFromRoot();
}
@Test
public void onSuccess_withDeepLinkThatIsResolvable_shouldStartActionViewIntent_shouldRemoveSpinningProgressView() {
String deepLinkUrl = "appscheme://host";
Robolectric.packageManager.addResolveInfoForIntent(new Intent(Intent.ACTION_VIEW,
Uri.parse(deepLinkUrl)), new ResolveInfo());
subject.onSuccess(deepLinkUrl);
Intent intent = Robolectric.getShadowApplication().getNextStartedActivity();
assertThat(intent.getAction()).isEqualTo(Intent.ACTION_VIEW);
assertThat(intent.getDataString()).isEqualTo("appscheme://host");
verify(mockSpinningProgressView).removeFromRoot();
}
@Test
public void onSuccess_withDeepLinkThatIsUnresolvable_shouldNotStartNewIntent_shouldRemoveSpinningProgressView() {
String deepLinkUrl = "appscheme://host";
// don't add any relevant ResolveInfos to the Robolectric packageManager
subject.onSuccess(deepLinkUrl);
assertThat(Robolectric.getShadowApplication().getNextStartedActivity()).isNull();
verify(mockSpinningProgressView).removeFromRoot();
}
@Test
public void onSuccess_withAppStoreUrl_shouldStartAppStoreIntent_shouldRemoveSpinningProgressView() {
String appStoreUrl = "play.google.com";
Robolectric.packageManager.addResolveInfoForIntent(new Intent(Intent.ACTION_VIEW,
Uri.parse(appStoreUrl)), new ResolveInfo());
subject.onSuccess(appStoreUrl);
Intent intent = Robolectric.getShadowApplication().getNextStartedActivity();
assertThat(intent.getAction()).isEqualTo(Intent.ACTION_VIEW);
assertThat(intent.getDataString()).isEqualTo("play.google.com");
verify(mockSpinningProgressView).removeFromRoot();
}
@Test
public void onSuccess_withHttpUrl_showOpenInMoPubBrowser_shouldRemoveSpinningProgressViewFromRoot() {
String httpUrl = "http://www.dotcom.com";
subject.onSuccess(httpUrl);
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(context).startActivity(intentCaptor.capture());
Intent intent = intentCaptor.getValue();
assertThat(intent.getComponent().getPackageName()).isEqualTo("com.mopub.mobileads");
assertThat(intent.getComponent().getClassName()).isEqualTo("com.mopub.common.MoPubBrowser");
assertThat(intent.getStringExtra(MoPubBrowser.DESTINATION_URL_KEY)).isEqualTo(httpUrl);
verify(mockSpinningProgressView).removeFromRoot();
}
@Test
public void onSuccess_withHttpsUrl_showOpenInMoPubBrowser_shouldRemoveSpinningProgressViewFromRoot() {
String httpsUrl = "https://www.comdot.com";
subject.onSuccess(httpsUrl);
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(context).startActivity(intentCaptor.capture());
Intent intent = intentCaptor.getValue();
assertThat(intent.getComponent().getPackageName()).isEqualTo("com.mopub.mobileads");
assertThat(intent.getComponent().getClassName()).isEqualTo("com.mopub.common.MoPubBrowser");
assertThat(intent.getStringExtra(MoPubBrowser.DESTINATION_URL_KEY)).isEqualTo(httpsUrl);
verify(mockSpinningProgressView).removeFromRoot();
}
}