package com.prasanna.android.stacknetwork.service;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.Matchers.anyMap;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.MockitoAnnotations;
import org.mockito.runners.MockitoJUnitRunner;
import com.prasanna.android.http.HttpContentTypes;
import com.prasanna.android.http.HttpGzipResponseInterceptor;
import com.prasanna.android.http.HttpHeaderParams;
import com.prasanna.android.http.SecureHttpHelper;
import com.prasanna.android.json.JsonUtil;
import com.prasanna.android.stacknetwork.model.Comment;
import com.prasanna.android.stacknetwork.service.AbstractBaseServiceHelper.JSONParser;
import com.prasanna.android.stacknetwork.utils.JSONObjectWrapper;
import com.prasanna.android.stacknetwork.utils.StackUri;
import com.prasanna.android.stacknetwork.utils.StackUri.QueryParamDefaultValues;
@RunWith(MockitoJUnitRunner.class)
public class WriteServiceHelperTest extends AbstractBaseServiceHelperTest {
private class WriteServiceHelperStub extends WriteServiceHelper {
@Override
protected SecureHttpHelper getHttpHelper() {
return httpHelper;
}
}
private WriteServiceHelperStub writeServiceHelper;
@Before
public void setup() {
MockitoAnnotations.initMocks(UserServiceHelperTest.class);
writeServiceHelper = new WriteServiceHelperStub();
setDefaultSite("Stack Overflow", "stackoverflow");
}
@SuppressWarnings("unchecked")
@Test
public void addComment() throws JSONException, UnsupportedEncodingException {
Comment expectedComment = getComment(1L, 1L);
JSONObjectWrapper jsonObjectWrapper = JsonUtil.commentToJsonObjectWrapper(expectedComment);
when(
httpHelper.executeHttpPost(anyString(), anyString(), (Map<String, String>) anyMap(),
(Map<String, String>) anyMap(), (UrlEncodedFormEntity) anyObject(), (HttpResponseInterceptor) anyObject(),
(JSONParser) anyObject())).thenReturn(jsonObjectWrapper);
assertAddedComment(expectedComment, writeServiceHelper.addComment(1L, "body"), "/posts/1/comments/add");
}
@SuppressWarnings("unchecked")
@Test
public void editComment() throws JSONException, UnsupportedEncodingException {
Comment expectedComment = getComment(1L, 1L);
JSONObjectWrapper jsonObjectWrapper = JsonUtil.commentToJsonObjectWrapper(expectedComment);
when(
httpHelper.executeHttpPost(anyString(), anyString(), (Map<String, String>) anyMap(),
(Map<String, String>) anyMap(), (UrlEncodedFormEntity) anyObject(), (HttpResponseInterceptor) anyObject(),
(JSONParser) anyObject())).thenReturn(jsonObjectWrapper);
assertAddedComment(expectedComment, writeServiceHelper.editComment(1L, "body"), "/comments/1/edit");
}
@Test
public void deleteComment() {
writeServiceHelper.deleteComment(1L);
assertDeletedComment("/comments/1/delete", getBasicNameValuePartListForWriteComment());
}
private void assertDeletedComment(String path, List<BasicNameValuePair> basicNameValuePartListForWriteComment) {
Map<String, String> requestHeaders = new HashMap<String, String>();
requestHeaders.put(HttpHeaderParams.CONTENT_TYPE, HttpContentTypes.APPLICATION_FROM_URL_ENCODED);
verifyHttpPostExecuteInvocation(path, requestHeaders, getBasicNameValuePartListForWriteComment());
}
private void assertAddedComment(Comment comment, Comment addedComment, String path) {
assertNotNull(addedComment);
assertCommentEquals(comment, addedComment);
verifyHttpPostExecuteInvocation(path, getExpectedRequestHeader(), getExpectedUrlEncodedNameValuePair(comment));
}
private List<BasicNameValuePair> getExpectedUrlEncodedNameValuePair(Comment comment) {
List<BasicNameValuePair> nameValuePair = getBasicNameValuePartListForWriteComment();
nameValuePair.add(new BasicNameValuePair(StackUri.QueryParams.FILTER, QueryParamDefaultValues.ITEM_DETAIL_FILTER));
nameValuePair.add(new BasicNameValuePair(StackUri.QueryParams.BODY, comment.body));
return nameValuePair;
}
private Map<String, String> getExpectedRequestHeader() {
Map<String, String> requestHeaders = new HashMap<String, String>();
requestHeaders.put(HttpHeaderParams.CONTENT_TYPE, HttpContentTypes.APPLICATION_FROM_URL_ENCODED);
requestHeaders.put(HttpHeaderParams.ACCEPT, HttpContentTypes.APPLICATION_JSON);
return requestHeaders;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private void verifyHttpPostExecuteInvocation(String expectedPath, Map<String, String> expectedRequestHeaders,
List<BasicNameValuePair> expectedNameValuePair) {
ArgumentCaptor<String> hostArgCaptor = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<String> pathArgCaptor = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<Map> requestHeadersArgCaptor = ArgumentCaptor.forClass(Map.class);
ArgumentCaptor<Map> queryParamsArgCaptor = ArgumentCaptor.forClass(Map.class);
ArgumentCaptor<UrlEncodedFormEntity> httpEntityArgCaptor = ArgumentCaptor.forClass(UrlEncodedFormEntity.class);
ArgumentCaptor<HttpGzipResponseInterceptor> interceptorArgCaptor =
ArgumentCaptor.forClass(HttpGzipResponseInterceptor.class);
ArgumentCaptor<JSONParser> parserArgCaptor = ArgumentCaptor.forClass(JSONParser.class);
verify(httpHelper, times(1)).executeHttpPost(hostArgCaptor.capture(), pathArgCaptor.capture(),
requestHeadersArgCaptor.capture(), queryParamsArgCaptor.capture(), httpEntityArgCaptor.capture(),
interceptorArgCaptor.capture(), parserArgCaptor.capture());
assertEquals(StackUri.STACKX_API_HOST, hostArgCaptor.getValue());
assertEquals(expectedPath, pathArgCaptor.getValue());
assertEquals(expectedRequestHeaders, requestHeadersArgCaptor.getValue());
assertNull(queryParamsArgCaptor.getValue());
assertEquals(SecureHttpHelper.HTTP_GZIP_RESPONSE_INTERCEPTOR, interceptorArgCaptor.getValue());
assertEquals(AbstractBaseServiceHelper.JSON_PARSER, parserArgCaptor.getValue());
}
}