package com.mopub.mobileads; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import com.mopub.common.MoPubBrowser; import com.mopub.common.test.support.SdkTestRunner; import com.mopub.mobileads.util.vast.VastVideoConfiguration; import com.mopub.mraid.MraidVideoViewController; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.shadows.ShadowActivity; import static com.mopub.common.DataKeys.BROADCAST_IDENTIFIER_KEY; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.robolectric.Robolectric.shadowOf; @RunWith(SdkTestRunner.class) public class MraidVideoPlayerActivityTest { private static final String VAST = "vast"; private static final String MRAID = "mraid"; private MraidVideoPlayerActivity subject; private long testBroadcastIdentifier; private Intent intent; private Context context; private BaseVideoViewController baseVideoViewController; @Before public void setup() { context = new Activity(); intent = new Intent(context, MraidVideoPlayerActivity.class); testBroadcastIdentifier = 1001; intent.putExtra(BROADCAST_IDENTIFIER_KEY, testBroadcastIdentifier); baseVideoViewController = mock(BaseVideoViewController.class); } @Test public void onCreate_withVastExtraKey_shouldUseVastVideoViewController() throws Exception { initializeSubjectForVast(); assertThat(subject.getBaseVideoViewController()).isInstanceOf(VastVideoViewController.class); } @Test public void onCreate_withMraidExtraKey_shouldUseMraidVideoViewController() throws Exception { initializeSubjectForMraid(); assertThat(subject.getBaseVideoViewController()).isInstanceOf(MraidVideoViewController.class); } @Ignore("pending: this is currently impossible to write") @Test public void onCreate_shouldForwardOnCreateToViewController() throws Exception { initializeSubjectWithMockViewController(); } @Test public void onPause_shouldForwardOnPauseToViewController() throws Exception { initializeSubjectWithMockViewController(); subject.onPause(); verify(baseVideoViewController).onPause(); } @Test public void onResume_shouldForwardOnResumeToViewController() throws Exception { initializeSubjectWithMockViewController(); subject.onResume(); verify(baseVideoViewController).onResume(); } @Test public void onDestroy_shouldForwardOnDestroyToViewController() throws Exception { initializeSubjectWithMockViewController(); subject.onDestroy(); verify(baseVideoViewController).onDestroy(); } @Test public void onActivityResult_shouldForwardOnActivityResultToViewController() throws Exception { initializeSubjectWithMockViewController(); int expectedRequestCode = -100; int expectedResultCode = 200; Intent expectedData = new Intent("arbitrary_data"); subject.onActivityResult(expectedRequestCode, expectedResultCode, expectedData); verify(baseVideoViewController).onActivityResult( eq(expectedRequestCode), eq(expectedResultCode), eq(expectedData) ); } @Test public void onSetContentView_shouldActuallySetContentView() throws Exception { initializeSubjectWithMockViewController(); final View expectedView = new ImageView(context); subject.onSetContentView(expectedView); assertThat(shadowOf(subject).getContentView()).isEqualTo(expectedView); } @Test public void onSetRequestedOrientation_shouldActuallySetRequestedOrientation() throws Exception { initializeSubjectWithMockViewController(); subject.onSetRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); assertThat(subject.getRequestedOrientation()).isEqualTo(ActivityInfo.SCREEN_ORIENTATION_SENSOR); } @Test public void onFinish_shouldActuallyCallFinish() throws Exception { initializeSubjectWithMockViewController(); subject.onFinish(); assertThat(subject.isFinishing()); } @Test public void onStartActivityForResult_shouldStartAnActivityWithRelevantRequestCodeAndExtras() throws Exception { initializeSubjectWithMockViewController(); final Bundle expectedExtras = new Bundle(); expectedExtras.putString("hello", "goodbye"); subject.onStartActivityForResult(MoPubBrowser.class, 100, expectedExtras); final ShadowActivity.IntentForResult intentForResult = shadowOf(subject).getNextStartedActivityForResult(); assertThat(intentForResult.intent.getComponent().getClassName()).isEqualTo("com.mopub.common.MoPubBrowser"); assertThat(intentForResult.intent.getExtras()).isEqualTo(expectedExtras); assertThat(intentForResult.requestCode).isEqualTo(100); } @Test public void onStartActivityForResult_withNullClass_shouldNotStartAnActivity() throws Exception { initializeSubjectWithMockViewController(); subject.onStartActivityForResult(null, 100, new Bundle()); final ShadowActivity.IntentForResult intentForResult = shadowOf(subject).getNextStartedActivityForResult(); assertThat(intentForResult).isNull(); } private void initializeSubjectForMraid() { intent.putExtra(BaseVideoPlayerActivity.VIDEO_CLASS_EXTRAS_KEY, "mraid"); subject = Robolectric.buildActivity(MraidVideoPlayerActivity.class) .withIntent(intent) .create() .get(); } private void initializeSubjectForVast() { intent.putExtra(BaseVideoPlayerActivity.VIDEO_CLASS_EXTRAS_KEY, "vast"); VastVideoConfiguration vastVideoConfiguration = new VastVideoConfiguration(); vastVideoConfiguration.setDiskMediaFileUrl("video_path"); intent.putExtra(VastVideoViewController.VAST_VIDEO_CONFIGURATION, vastVideoConfiguration); subject = Robolectric.buildActivity(MraidVideoPlayerActivity.class) .withIntent(intent) .create() .get(); } private void initializeSubjectWithMockViewController() { initializeSubjectForMraid(); subject.setBaseVideoViewController(baseVideoViewController); } }