package com.mopub.nativeads; import android.app.Activity; import android.view.View; import android.view.ViewGroup; import android.widget.Button; 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.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(SdkTestRunner.class) public class NativeAdViewHelperTest { private Activity context; private RelativeLayout relativeLayout; private ViewGroup viewGroup; private BaseForwardingNativeAd mNativeAd; private ViewBinder viewBinder; private TextView titleView; private TextView textView; private TextView callToActionView; @Mock private NativeResponse mockNativeResponse1; @Mock private NativeResponse mockNativeResponse2; @Mock private ImpressionTracker mockImpressionTracker; @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"); 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()); relativeLayout.addView(titleView); relativeLayout.addView(textView); relativeLayout.addView(callToActionView); viewBinder = new ViewBinder.Builder(relativeLayout.getId()) .titleId(titleView.getId()) .textId(textView.getId()) .callToActionId(callToActionView.getId()) .build(); when(mockNativeResponse1.isDestroyed()).thenReturn(false); when(mockNativeResponse2.isDestroyed()).thenReturn(false); } @Test public void getAdView_shouldReturnPopulatedView() throws Exception { when(mockNativeResponse1.getTitle()).thenReturn("test title"); when(mockNativeResponse1.getText()).thenReturn("test text"); when(mockNativeResponse1.getCallToAction()).thenReturn("test call to action"); View view = NativeAdViewHelper.getAdView(relativeLayout, viewGroup, context, mockNativeResponse1, viewBinder); assertThat(((TextView)view.findViewById(titleView.getId())).getText()).isEqualTo("test title"); assertThat(((TextView)view.findViewById(textView.getId())).getText()).isEqualTo("test text"); assertThat(((TextView)view.findViewById(callToActionView.getId())).getText()).isEqualTo("test call to action"); // not testing images due to testing complexity } @Test public void getAdView_withDestroyedNativeResponse_shouldReturnGONEConvertView() throws Exception { when(mockNativeResponse1.isDestroyed()).thenReturn(true); View view = NativeAdViewHelper.getAdView(relativeLayout, viewGroup, context, mockNativeResponse1, viewBinder); assertThat(view).isEqualTo(relativeLayout); assertThat(view.getVisibility()).isEqualTo(View.GONE); } @Test public void getAdView_shouldRemoveViewFromImpressionTracker_shouldClearPreviousNativeResponse() throws Exception { NativeAdViewHelper.sImpressionTrackerMap.put(context, mockImpressionTracker); NativeAdViewHelper.getAdView(relativeLayout, viewGroup, context, mockNativeResponse1, viewBinder); verify(mockImpressionTracker).removeView(relativeLayout); // Second call should clear the first NativeResponse NativeAdViewHelper.getAdView(relativeLayout, viewGroup, context, mockNativeResponse2, viewBinder); verify(mockImpressionTracker, times(2)).removeView(relativeLayout); verify(mockNativeResponse1).clear(relativeLayout); // Third call should clear the second NativeResponse NativeAdViewHelper.getAdView(relativeLayout, viewGroup, context, mockNativeResponse1, viewBinder); verify(mockImpressionTracker, times(3)).removeView(relativeLayout); verify(mockNativeResponse2).clear(relativeLayout); } @Test public void getAdView_withNetworkImpressionTracker_shouldNotAddViewToImpressionTracker_shouldPrepareNativeResponse() throws Exception { NativeAdViewHelper.sImpressionTrackerMap.put(context, mockImpressionTracker); when(mockNativeResponse1.isOverridingImpressionTracker()).thenReturn(true); NativeAdViewHelper.getAdView(relativeLayout, viewGroup, context, mockNativeResponse1, viewBinder); verify(mockImpressionTracker, never()).addView(any(View.class), any(NativeResponse.class)); verify(mockNativeResponse1).prepare(relativeLayout); } @Test public void getAdView_withoutNetworkImpressionTracker_shouldAddViewToImpressionTracker_shouldPrepareNativeResponse() throws Exception { NativeAdViewHelper.sImpressionTrackerMap.put(context, mockImpressionTracker); when(mockNativeResponse1.isOverridingImpressionTracker()).thenReturn(false); NativeAdViewHelper.getAdView(relativeLayout, viewGroup, context, mockNativeResponse1, viewBinder); verify(mockImpressionTracker).addView(relativeLayout, mockNativeResponse1); verify(mockNativeResponse1).prepare(relativeLayout); } }