package com.mopub.mobileads; import android.app.Activity; import android.view.Gravity; import android.widget.FrameLayout; import com.mopub.common.test.support.SdkTestRunner; import com.mopub.mobileads.test.support.TestHtmlBannerWebViewFactory; import com.mopub.mobileads.test.support.TestMoPubViewFactory; import com.mopub.network.AdResponse; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import java.util.HashMap; import java.util.Map; import static com.mopub.common.DataKeys.CLICKTHROUGH_URL_KEY; import static com.mopub.common.DataKeys.HTML_RESPONSE_BODY_KEY; import static com.mopub.common.DataKeys.REDIRECT_URL_KEY; import static com.mopub.common.DataKeys.SCROLLABLE_KEY; import static com.mopub.mobileads.MoPubErrorCode.NETWORK_INVALID_STATE; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.stub; import static org.mockito.Mockito.verify; @RunWith(SdkTestRunner.class) public class HtmlBannerTest { private HtmlBanner subject; private HtmlBannerWebView htmlBannerWebView; private CustomEventBanner.CustomEventBannerListener customEventBannerListener; private Map<String, Object> localExtras; private Map<String, String> serverExtras; private Activity context; private String responseBody; @Before public void setup() { subject = new HtmlBanner(); htmlBannerWebView = TestHtmlBannerWebViewFactory.getSingletonMock(); customEventBannerListener = mock(CustomEventBanner.CustomEventBannerListener.class); context = new Activity(); localExtras = new HashMap<String, Object>(); serverExtras = new HashMap<String, String>(); responseBody = "expected response body"; serverExtras.put(HTML_RESPONSE_BODY_KEY, responseBody); serverExtras.put(SCROLLABLE_KEY, "false"); } @Test public void loadBanner_shouldPopulateTheHtmlWebViewWithHtml() throws Exception { subject.loadBanner(context, customEventBannerListener, localExtras, serverExtras); assertThat(TestHtmlBannerWebViewFactory.getLatestListener()).isSameAs(customEventBannerListener); assertThat(TestHtmlBannerWebViewFactory.getLatestIsScrollable()).isFalse(); assertThat(TestHtmlBannerWebViewFactory.getLatestRedirectUrl()).isNull(); assertThat(TestHtmlBannerWebViewFactory.getLatestClickthroughUrl()).isNull(); verify(htmlBannerWebView).loadHtmlResponse(responseBody); } @Test public void loadBanner_whenNoHtmlResponse_shouldNotifyBannerFailed() throws Exception { serverExtras.remove(HTML_RESPONSE_BODY_KEY); subject.loadBanner(context, customEventBannerListener, localExtras, serverExtras); verify(customEventBannerListener).onBannerFailed(eq(NETWORK_INVALID_STATE)); assertThat(TestHtmlBannerWebViewFactory.getLatestListener()).isNull(); assertThat(TestHtmlBannerWebViewFactory.getLatestIsScrollable()).isFalse(); assertThat(TestHtmlBannerWebViewFactory.getLatestRedirectUrl()).isNull(); assertThat(TestHtmlBannerWebViewFactory.getLatestClickthroughUrl()).isNull(); verify(htmlBannerWebView, never()).loadHtmlResponse(anyString()); } @Test public void loadBanner_shouldPassParametersThrough() throws Exception { serverExtras.put(SCROLLABLE_KEY, "true"); serverExtras.put(REDIRECT_URL_KEY, "redirectUrl"); serverExtras.put(CLICKTHROUGH_URL_KEY, "clickthroughUrl"); subject.loadBanner(context, customEventBannerListener, localExtras, serverExtras); assertThat(TestHtmlBannerWebViewFactory.getLatestListener()).isSameAs(customEventBannerListener); assertThat(TestHtmlBannerWebViewFactory.getLatestIsScrollable()).isTrue(); assertThat(TestHtmlBannerWebViewFactory.getLatestRedirectUrl()).isEqualTo("redirectUrl"); assertThat(TestHtmlBannerWebViewFactory.getLatestClickthroughUrl()).isEqualTo("clickthroughUrl"); verify(htmlBannerWebView).loadHtmlResponse(responseBody); } @Test public void onInvalidate_shouldDestroyTheHtmlWebView() throws Exception { subject.loadBanner(context, customEventBannerListener, localExtras, serverExtras); subject.onInvalidate(); verify(htmlBannerWebView).destroy(); } @Test public void loadBanner_shouldCauseServerDimensionsToBeHonoredWhenLayingOutView() throws Exception { subject.loadBanner(context, customEventBannerListener, localExtras, serverExtras); MoPubView moPubView = TestMoPubViewFactory.getSingletonMock(); stub(moPubView.getContext()).toReturn(context); AdViewController adViewController = new AdViewController(context, moPubView); AdResponse adResponse = new AdResponse.Builder().setDimensions(320, 50).build(); adViewController.onAdLoadSuccess(adResponse); adViewController.setAdContentView(htmlBannerWebView); ArgumentCaptor<FrameLayout.LayoutParams> layoutParamsCaptor = ArgumentCaptor.forClass(FrameLayout.LayoutParams.class); verify(moPubView).addView(eq(htmlBannerWebView), layoutParamsCaptor.capture()); FrameLayout.LayoutParams layoutParams = layoutParamsCaptor.getValue(); assertThat(layoutParams.width).isEqualTo(320); assertThat(layoutParams.height).isEqualTo(50); assertThat(layoutParams.gravity).isEqualTo(Gravity.CENTER); } }