package com.mopub.network;
import com.mopub.common.AdFormat;
import com.mopub.common.AdType;
import com.mopub.common.DataKeys;
import com.mopub.common.test.support.SdkTestRunner;
import com.mopub.common.util.ResponseHeader;
import com.mopub.volley.NetworkResponse;
import com.mopub.volley.Response;
import org.json.JSONException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.mockito.Mockito.verify;
@RunWith(SdkTestRunner.class)
public class AdRequestTest {
@Mock
private AdRequest.Listener mockListener;
@Mock
private AdResponse mockAdResponse;
private AdRequest subject;
private HashMap<String, String> defaultHeaders;
@Before
public void setup() {
subject = new AdRequest("testUrl", AdFormat.NATIVE, mockListener);
defaultHeaders = new HashMap<String, String>();
defaultHeaders.put(ResponseHeader.SCROLLABLE.getKey(), "0");
defaultHeaders.put(ResponseHeader.REDIRECT_URL.getKey(), "redirect");
defaultHeaders.put(ResponseHeader.CLICK_TRACKING_URL.getKey(), "click_tracking");
defaultHeaders.put(ResponseHeader.IMPRESSION_URL.getKey(), "impression");
defaultHeaders.put(ResponseHeader.FAIL_URL.getKey(), "fail_url");
defaultHeaders.put(ResponseHeader.REFRESH_TIME.getKey(), "30");
}
@Test
public void parseNetworkResponse_stringBody_shouldSucceed() throws Exception {
defaultHeaders.put(ResponseHeader.AD_TYPE.getKey(), AdType.HTML);
NetworkResponse testResponse =
new NetworkResponse(200, "abc".getBytes(Charset.defaultCharset()), defaultHeaders, false);
final Response<AdResponse> response = subject.parseNetworkResponse(testResponse);
assertThat(response.result).isNotNull();
assertThat(response.result.getStringBody()).isEqualTo("abc");
}
@Test
public void parseNetworkResponse_withServerExtrasInResponseBody_shouldSucceed() throws Exception {
defaultHeaders.put(ResponseHeader.AD_TYPE.getKey(), AdType.HTML);
defaultHeaders.put(ResponseHeader.FULL_AD_TYPE.getKey(), "anything");
NetworkResponse testResponse =
new NetworkResponse(200, "abc".getBytes(Charset.defaultCharset()), defaultHeaders, false);
final Response<AdResponse> response = subject.parseNetworkResponse(testResponse);
// Check the server extras
final Map<String, String> serverExtras = response.result.getServerExtras();
assertThat(serverExtras).isNotNull();
assertThat(serverExtras).isNotEmpty();
assertThat(serverExtras.get(DataKeys.SCROLLABLE_KEY)).isEqualToIgnoringCase("false");
assertThat(serverExtras.get(DataKeys.REDIRECT_URL_KEY)).isEqualToIgnoringCase("redirect");
assertThat(serverExtras.get(DataKeys.CLICKTHROUGH_URL_KEY)).isEqualToIgnoringCase("click_tracking");
}
@Test
public void parseNetworkResponse_nonJsonStringBodyForNative_jsonParseShouldFail() {
defaultHeaders.put(ResponseHeader.AD_TYPE.getKey(), AdType.NATIVE);
NetworkResponse testResponse =
new NetworkResponse(200, "abc".getBytes(Charset.defaultCharset()), defaultHeaders, false);
final Response<AdResponse> response = subject.parseNetworkResponse(testResponse);
assertThat(response.error).isNotNull();
assertThat(response.error).isExactlyInstanceOf(MoPubNetworkError.class);
assertThat(((MoPubNetworkError) response.error).getReason()).isEqualTo(MoPubNetworkError.Reason.BAD_BODY);
}
@Test
public void parseNetworkResponse_withWarmupHeaderTrue_shouldError() {
defaultHeaders.put(ResponseHeader.AD_TYPE.getKey(), AdType.NATIVE);
defaultHeaders.put(ResponseHeader.WARMUP.getKey(), "1");
NetworkResponse testResponse =
new NetworkResponse(200, "abc".getBytes(Charset.defaultCharset()), defaultHeaders, false);
final Response<AdResponse> response = subject.parseNetworkResponse(testResponse);
assertThat(response.error).isNotNull();
assertThat(response.error).isInstanceOf(MoPubNetworkError.class);
assertThat(((MoPubNetworkError) response.error).getReason()).isEqualTo(MoPubNetworkError.Reason.WARMING_UP);
}
@Test
public void parseNetworkResponse_withClearAdType_shouldError() {
defaultHeaders.put(ResponseHeader.AD_TYPE.getKey(), AdType.CLEAR);
NetworkResponse testResponse =
new NetworkResponse(200, "abc".getBytes(Charset.defaultCharset()), defaultHeaders, false);
final Response<AdResponse> response = subject.parseNetworkResponse(testResponse);
assertThat(response.error).isNotNull();
assertThat(response.error).isInstanceOf(MoPubNetworkError.class);
assertThat(((MoPubNetworkError) response.error).getReason()).isEqualTo(MoPubNetworkError.Reason.NO_FILL);
}
@Test
public void deliverResponse_shouldCallListenerOnSuccess() throws Exception {
subject.deliverResponse(mockAdResponse);
verify(mockListener).onSuccess(mockAdResponse);
}
@Test
public void parseNetworkResponse_withBadJSON_shouldReturnError() {
defaultHeaders.put(ResponseHeader.AD_TYPE.getKey(), AdType.NATIVE);
NetworkResponse badNativeNetworkResponse = new NetworkResponse(200,
"{[abc}".getBytes(Charset.defaultCharset()),
defaultHeaders, false);
subject = new AdRequest("testUrl", AdFormat.NATIVE, mockListener);
final Response<AdResponse> response = subject.parseNetworkResponse(badNativeNetworkResponse);
assertThat(response.error).isNotNull();
assertThat(response.error.getCause()).isExactlyInstanceOf(JSONException.class);
}
}