package com.mopub.mraid;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.ImageButton;
import com.mopub.common.test.support.SdkTestRunner;
import com.mopub.mobileads.EventForwardingBroadcastReceiver;
import org.apache.http.HttpRequest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.shadows.ShadowImageButton;
import org.robolectric.shadows.ShadowLocalBroadcastManager;
import org.robolectric.shadows.ShadowVideoView;
import org.robolectric.tester.org.apache.http.RequestMatcher;
import org.robolectric.tester.org.apache.http.TestHttpResponse;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static com.mopub.mobileads.BaseVideoPlayerActivity.VIDEO_URL;
import static com.mopub.mobileads.BaseVideoViewController.BaseVideoViewControllerListener;
import static com.mopub.mobileads.EventForwardingBroadcastReceiver.getHtmlInterstitialIntentFilter;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.robolectric.Robolectric.shadowOf;
@RunWith(SdkTestRunner.class)
public class MraidVideoViewControllerTest {
private Context context;
private Bundle bundle;
private MraidVideoViewController subject;
private BaseVideoViewControllerListener baseVideoViewControllerListener;
private EventForwardingBroadcastReceiver broadcastReceiver;
@Before
public void setUp() throws Exception {
context = new Activity();
bundle = new Bundle();
baseVideoViewControllerListener = mock(BaseVideoViewControllerListener.class);
bundle.putString(VIDEO_URL, "http://video_url");
Robolectric.getUiThreadScheduler().pause();
Robolectric.getBackgroundScheduler().pause();
Robolectric.addHttpResponseRule(new RequestMatcher() {
@Override
public boolean matches(HttpRequest request) {
return true;
}
}, new TestHttpResponse(200, "body"));
ShadowLocalBroadcastManager.getInstance(context).registerReceiver(broadcastReceiver, getHtmlInterstitialIntentFilter());
}
@After
public void tearDown() throws Exception {
Robolectric.getUiThreadScheduler().reset();
Robolectric.getBackgroundScheduler().reset();
Robolectric.clearPendingHttpResponses();
ShadowLocalBroadcastManager.getInstance(context).unregisterReceiver(broadcastReceiver);
}
@Test
public void constructor_shouldSetListenersAndVideoPath() throws Exception {
initializeSubject();
ShadowVideoView shadowSubject = shadowOf(subject.getVideoView());
assertThat(shadowSubject.getOnCompletionListener()).isNotNull();
assertThat(shadowSubject.getOnErrorListener()).isNotNull();
assertThat(shadowSubject.getVideoPath()).isEqualTo("http://video_url");
assertThat(subject.getVideoView().hasFocus()).isTrue();
}
@Test
public void onCreate_shouldCreateAndHideCloseButton() throws Exception {
initializeSubject();
subject.onCreate();
ImageButton closeButton = getCloseButton();
assertThat(closeButton).isNotNull();
assertThat(getShadowImageButton(closeButton).getOnClickListener()).isNotNull();
assertThat(closeButton.getVisibility()).isEqualTo(GONE);
}
@Test
public void backButtonEnabled_shouldReturnTrue() throws Exception {
initializeSubject();
assertThat(subject.backButtonEnabled()).isTrue();
}
@Test
public void closeButton_onClick_shouldCallBaseVideoControllerListenerOnFinish() throws Exception {
initializeSubject();
subject.onCreate();
ImageButton closeButton = getCloseButton();
getShadowImageButton(closeButton).getOnClickListener().onClick(null);
verify(baseVideoViewControllerListener).onFinish();
}
@Test
public void onCompletionListener_shouldCallBaseVideoViewControllerListenerOnFinish() throws Exception {
initializeSubject();
subject.onCreate();
getShadowVideoView().getOnCompletionListener().onCompletion(null);
verify(baseVideoViewControllerListener).onFinish();
}
@Test
public void onCompletionListener_shouldShowCloseButton() throws Exception {
initializeSubject();
subject.onCreate();
getShadowVideoView().getOnCompletionListener().onCompletion(null);
assertThat(getCloseButton().getVisibility()).isEqualTo(VISIBLE);
}
@Test
public void onCompletionListener_withNullBaseVideoViewControllerListener_shouldNotCallOnFinish() throws Exception {
}
@Test
public void onErrorListener_shouldReturnFalseAndNotCallBaseVideoControllerListenerOnFinish() throws Exception {
initializeSubject();
subject.onCreate();
assertThat(getShadowVideoView().getOnErrorListener().onError(null, 0, 0)).isEqualTo(false);
verify(baseVideoViewControllerListener, never()).onFinish();
}
@Test
public void onErrorListener_shouldShowCloseButton() throws Exception {
initializeSubject();
subject.onCreate();
assertThat(getShadowVideoView().getOnErrorListener().onError(null, 0, 0)).isEqualTo(false);
assertThat(getCloseButton().getVisibility()).isEqualTo(VISIBLE);
}
private void initializeSubject() {
subject = new MraidVideoViewController(context, bundle, baseVideoViewControllerListener);
}
private ShadowVideoView getShadowVideoView() {
return shadowOf(subject.getVideoView());
}
ImageButton getCloseButton() {
return (ImageButton) subject.getLayout().getChildAt(1);
}
private ShadowImageButton getShadowImageButton(ImageButton imageButton) {
return (ShadowImageButton) shadowOf(imageButton);
}
}