package com.mopub.nativeads; import android.app.Activity; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.mopub.common.test.support.SdkTestRunner; import com.mopub.common.util.Utils; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @RunWith(SdkTestRunner.class) public class MoPubNativeAdRendererTest { private MoPubNativeAdRenderer subject; private Activity context; private RelativeLayout relativeLayout; private ViewGroup viewGroup; private NativeResponse nativeResponse; private BaseForwardingNativeAd mNativeAd; private ViewBinder viewBinder; private TextView titleView; private TextView textView; private TextView callToActionView; private ImageView mainImageView; private ImageView iconImageView; private ImageView badView; @Before public void setUp() throws Exception { context = new Activity(); relativeLayout = new RelativeLayout(context); relativeLayout.setId((int) Utils.generateUniqueId()); viewGroup = new LinearLayout(context); mNativeAd = new BaseForwardingNativeAd() {}; mNativeAd.setTitle("test title"); mNativeAd.setText("test text"); mNativeAd.setCallToAction("test call to action"); mNativeAd.setClickDestinationUrl("destinationUrl"); nativeResponse = new NativeResponse(context, "impressionTrackerUrl", "clickTrackerUrl", "test ID", mNativeAd, mock(MoPubNative.MoPubNativeListener.class)); titleView = new TextView(context); titleView.setId((int) Utils.generateUniqueId()); textView = new TextView(context); textView.setId((int) Utils.generateUniqueId()); callToActionView = new Button(context); callToActionView.setId((int) Utils.generateUniqueId()); mainImageView = new ImageView(context); mainImageView.setId((int) Utils.generateUniqueId()); iconImageView = new ImageView(context); iconImageView.setId((int) Utils.generateUniqueId()); badView = new ImageView(context); badView.setId((int) Utils.generateUniqueId()); relativeLayout.addView(titleView); relativeLayout.addView(textView); relativeLayout.addView(callToActionView); relativeLayout.addView(mainImageView); relativeLayout.addView(iconImageView); relativeLayout.addView(badView); viewBinder = new ViewBinder.Builder(relativeLayout.getId()) .titleId(titleView.getId()) .textId(textView.getId()) .callToActionId(callToActionView.getId()) .mainImageId(mainImageView.getId()) .iconImageId(iconImageView.getId()) .build(); subject = new MoPubNativeAdRenderer(viewBinder); } @Test(expected = NullPointerException.class) public void createAdView_withNullContext_shouldThrowNPE() { subject.createAdView(null, viewGroup); } @Test(expected = NullPointerException.class) public void renderAdView_withNullView_shouldThrowNPE() { subject.renderAdView(null, nativeResponse); } @Test(expected = NullPointerException.class) public void renderAdView_withNullNativeResponse_shouldThrowNPE() { subject.renderAdView(relativeLayout, null); } @Rule public ExpectedException exception = ExpectedException.none(); public void renderAdView_withNullViewBinder_shouldThrowNPE() { subject = new MoPubNativeAdRenderer(null); exception.expect(NullPointerException.class); subject.renderAdView(relativeLayout, nativeResponse); } @Test public void renderAdView_shouldReturnPopulatedView() { subject.renderAdView(relativeLayout, nativeResponse); assertThat(((TextView)relativeLayout.findViewById(titleView.getId())).getText()).isEqualTo("test title"); assertThat(((TextView)relativeLayout.findViewById(textView.getId())).getText()).isEqualTo( "test text"); assertThat(((TextView)relativeLayout.findViewById(callToActionView.getId())).getText()).isEqualTo("test call to action"); // not testing images due to testing complexity } public void renderAdView_withFailedViewBinder_shouldReturnEmptyViews() { viewBinder = new ViewBinder.Builder(relativeLayout.getId()) .titleId(titleView.getId()) .textId(badView.getId()) .callToActionId(callToActionView.getId()) .mainImageId(mainImageView.getId()) .iconImageId(iconImageView.getId()) .build(); subject = new MoPubNativeAdRenderer(viewBinder); subject.renderAdView(relativeLayout, nativeResponse); assertThat(((TextView)relativeLayout.findViewById(titleView.getId())).getText()) .isEqualTo(""); assertThat(((TextView)relativeLayout.findViewById(textView.getId())).getText()) .isEqualTo(""); assertThat(((TextView)relativeLayout.findViewById(callToActionView.getId())).getText()) .isEqualTo(""); } @Test public void renderAdView_withNoViewHolder_shouldCreateNativeViewHolder() { subject.renderAdView(relativeLayout, nativeResponse); NativeViewHolder expectedViewHolder = NativeViewHolder.fromViewBinder(relativeLayout, viewBinder); NativeViewHolder viewHolder = subject.mViewHolderMap.get(relativeLayout); compareNativeViewHolders(expectedViewHolder, viewHolder); } @Test public void getOrCreateNativeViewHolder_withViewHolder_shouldNotReCreateNativeViewHolder() { subject.renderAdView(relativeLayout, nativeResponse); NativeViewHolder expectedViewHolder = subject.mViewHolderMap.get(relativeLayout); subject.renderAdView(relativeLayout, nativeResponse); NativeViewHolder viewHolder = subject.mViewHolderMap.get(relativeLayout); assertThat(viewHolder).isEqualTo(expectedViewHolder); } static private void compareNativeViewHolders(final NativeViewHolder actualViewHolder, final NativeViewHolder expectedViewHolder) { assertThat(actualViewHolder.titleView).isEqualTo(expectedViewHolder.titleView); assertThat(actualViewHolder.textView).isEqualTo(expectedViewHolder.textView); assertThat(actualViewHolder.callToActionView).isEqualTo(expectedViewHolder.callToActionView); assertThat(actualViewHolder.mainImageView).isEqualTo(expectedViewHolder.mainImageView); assertThat(actualViewHolder.iconImageView).isEqualTo(expectedViewHolder.iconImageView); } }