package com.mopub.mobileads;
import com.mopub.common.test.support.SdkTestRunner;
import com.mopub.network.AdResponse;
import org.fest.assertions.core.Condition;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import java.util.HashMap;
import java.util.Map;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.mockito.Matchers.anyMapOf;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
@RunWith(SdkTestRunner.class)
public class AdLoaderTest {
@Mock
private AdViewController adViewController;
@Mock
private MoPubView moPubView;
private AdResponse adResponse;
private Map<String, String> serverExtras;
@Before
public void setup() {
adResponse = new AdResponse.Builder()
.setResponseBody("<html></html>")
.setClickTrackingUrl("clickthrough")
.setRedirectUrl("redirect")
.setScrollable(false)
.build();
serverExtras = new HashMap<String, String>();
serverExtras.put("test", "hi");
when(adViewController.getMoPubView()).thenReturn(moPubView);
}
@Test
public void fromAdResponse_whenCustomEvent_shouldCreateAdLoadTask() throws Exception {
adResponse = adResponse.toBuilder()
.setAdType("custom")
.setCustomEventClassName("custom event name")
.setServerExtras(serverExtras)
.build();
AdLoader.CustomEventAdLoader customEventTask = (AdLoader.CustomEventAdLoader) AdLoader.fromAdResponse(adResponse, adViewController);
assertThat(customEventTask).isNotNull();
assertThat(customEventTask.getServerExtras()).isEqualTo(serverExtras);
}
@Test
public void fromAdResponse_whenHtml_shouldBeModernAdLoadTask() {
adResponse = adResponse.toBuilder()
.setAdType("html")
.setCustomEventClassName("com.mopub.mobileads.HtmlBanner")
.setServerExtras(serverExtras)
.build();
AdLoader.CustomEventAdLoader customEventTask = (AdLoader.CustomEventAdLoader) AdLoader.fromAdResponse(adResponse, adViewController);
assertThat(customEventTask).isNotNull();
assertThat(customEventTask.getServerExtras()).has(new Condition<Map<String, String>>() {
@Override
public boolean matches(final Map<String, String> stringStringMap) {
return stringStringMap.containsKey("test");
}
});
}
@Test
public void fromAdResponse_whenCustomMethod_shouldReturnNull() {
adResponse = adResponse.toBuilder()
.setCustomEventClassName(null)
.build();
assertThat(AdLoader.fromAdResponse(adResponse, adViewController)).isNull();
}
@Test
public void load_shouldCallAdViewController() {
adResponse = adResponse.toBuilder()
.setAdType("custom")
.setCustomEventClassName("custom event name")
.setServerExtras(serverExtras)
.build();
AdLoader.CustomEventAdLoader customEventTask = (AdLoader.CustomEventAdLoader) AdLoader.fromAdResponse(adResponse, adViewController);
customEventTask.load();
verify(adViewController).getMoPubView();
verify(moPubView).loadCustomEvent(eq("custom event name"), anyMapOf(String.class, String.class));
}
@Test
public void load_controllerDestroyed_shouldDoNothing() {
when(adViewController.isDestroyed()).thenReturn(true);
adResponse = adResponse.toBuilder()
.setAdType("custom")
.setCustomEventClassName("custom event name")
.setServerExtras(serverExtras)
.build();
AdLoader.CustomEventAdLoader customEventTask = (AdLoader.CustomEventAdLoader) AdLoader.fromAdResponse(adResponse, adViewController);
customEventTask.load();
verify(adViewController).isDestroyed();
verifyNoMoreInteractions(adViewController);
verifyZeroInteractions(moPubView);
}
}