package com.mopub.mraid;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import com.mopub.common.test.support.SdkTestRunner;
import com.mopub.mobileads.test.support.TestMraidControllerFactory;
import com.mopub.mraid.MraidController.MraidListener;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import java.util.HashMap;
import java.util.Map;
import static com.mopub.common.DataKeys.HTML_RESPONSE_BODY_KEY;
import static com.mopub.mobileads.CustomEventBanner.CustomEventBannerListener;
import static com.mopub.mobileads.MoPubErrorCode.MRAID_LOAD_ERROR;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
@RunWith(SdkTestRunner.class)
public class MraidBannerTest {
private static final String INPUT_HTML_DATA = "%3Chtml%3E%3C%2Fhtml%3E";
MraidController mockMraidController;
@Mock CustomEventBannerListener mockBannerListener;
private Context context;
private Map<String, Object> localExtras;
private Map<String, String> serverExtras;
private MraidBanner subject;
@Before
public void setUp() {
subject = new MraidBanner();
mockMraidController = TestMraidControllerFactory.getSingletonMock();
context = new Activity();
localExtras = new HashMap<String, Object>();
localExtras.put("broadcastIdentifier", 123L);
serverExtras = new HashMap<String, String>();
serverExtras.put(HTML_RESPONSE_BODY_KEY, INPUT_HTML_DATA);
}
@Test
public void loadBanner_whenExtrasAreMalformed_shouldNotifyBannerListenerFailureAndReturn() {
serverExtras.remove(HTML_RESPONSE_BODY_KEY);
subject.loadBanner(context, mockBannerListener, localExtras, serverExtras);
verify(mockBannerListener).onBannerFailed(eq(MRAID_LOAD_ERROR));
}
@Test
public void invalidate_shouldDestroyMraidController() {
subject.loadBanner(context, mockBannerListener, localExtras, serverExtras);
subject.onInvalidate();
verify(mockMraidController).destroy();
}
@Test
public void bannerMraidListener_onReady_shouldNotifyBannerLoaded() {
MraidListener mraidListener = captureMraidListener();
mraidListener.onLoaded(null);
verify(mockBannerListener).onBannerLoaded(any(View.class));
}
@Test
public void bannerMraidListener_onFailure_shouldNotifyBannerFailed() {
MraidListener mraidListener = captureMraidListener();
mraidListener.onFailedToLoad();
verify(mockBannerListener).onBannerFailed(eq(MRAID_LOAD_ERROR));
}
@Test
public void bannerMraidListener_onExpand_shouldNotifyBannerExpandedAndClicked() {
MraidListener mraidListener = captureMraidListener();
mraidListener.onExpand();
verify(mockBannerListener).onBannerExpanded();
verify(mockBannerListener).onBannerClicked();
}
@Test
public void bannerMraidListener_onOpen_shouldNotifyBannerClicked() {
MraidListener mraidListener = captureMraidListener();
mraidListener.onOpen();
verify(mockBannerListener).onBannerClicked();
}
@Test
public void bannerMraidListener_onClose_shouldNotifyBannerCollapsed() {
MraidListener mraidListener = captureMraidListener();
mraidListener.onClose();
verify(mockBannerListener).onBannerCollapsed();
}
private MraidListener captureMraidListener() {
subject.loadBanner(context, mockBannerListener, localExtras, serverExtras);
ArgumentCaptor<MraidListener> listenerCaptor = ArgumentCaptor.forClass(MraidListener.class);
verify(mockMraidController).setMraidListener(listenerCaptor.capture());
return listenerCaptor.getValue();
}
}