package com.prasanna.android.stacknetwork.service; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.http.message.BasicNameValuePair; import org.junit.Rule; import org.junit.rules.ExpectedException; import org.mockito.Mock; import android.content.Context; import com.prasanna.android.http.SecureHttpHelper; import com.prasanna.android.stacknetwork.model.Account; import com.prasanna.android.stacknetwork.model.Answer; import com.prasanna.android.stacknetwork.model.Comment; import com.prasanna.android.stacknetwork.model.Question; import com.prasanna.android.stacknetwork.model.Site; import com.prasanna.android.stacknetwork.model.User; import com.prasanna.android.stacknetwork.model.User.UserType; import com.prasanna.android.stacknetwork.utils.AppUtils; import com.prasanna.android.stacknetwork.utils.JSONObjectWrapper; import com.prasanna.android.stacknetwork.utils.OperatingSite; import com.prasanna.android.stacknetwork.utils.StackUri; import com.prasanna.android.stacknetwork.utils.StackUri.QueryParamDefaultValues; public abstract class AbstractBaseServiceHelperTest { @Mock protected SecureHttpHelper httpHelper; @Mock protected Context context; @Rule public ExpectedException expectedException = ExpectedException.none(); protected Site site; protected void setDefaultSite(String name, String apiSiteParameter) { site = new Site(); site.apiSiteParameter = "stackoverflow"; site.name = "Stack Overflow"; OperatingSite.setSite(site); } protected void setupForAuthUser() { AppUtils.setAccessToken(context, "accessToken"); } protected HashMap<String, String> getMinimumExpectedQueryParams() { HashMap<String, String> expectedQueryParams = new HashMap<String, String>(); expectedQueryParams.put(StackUri.QueryParams.SITE, site.apiSiteParameter); expectedQueryParams.put(StackUri.QueryParams.CLIENT_ID, StackUri.QueryParamDefaultValues.CLIENT_ID); return expectedQueryParams; } protected HashMap<String, String> getMinimumExpectedQueryParams(String site) { HashMap<String, String> expectedQueryParams = new HashMap<String, String>(); expectedQueryParams.put(StackUri.QueryParams.SITE, site); expectedQueryParams.put(StackUri.QueryParams.CLIENT_ID, StackUri.QueryParamDefaultValues.CLIENT_ID); return expectedQueryParams; } protected HashMap<String, String> getMinimumExpectedQueryParamsForAuthUser() { HashMap<String, String> expectedQueryParams = getMinimumExpectedQueryParams(); expectedQueryParams.put(StackUri.QueryParams.ACCESS_TOKEN, "accessToken"); expectedQueryParams.put(StackUri.QueryParams.KEY, StackUri.QueryParamDefaultValues.KEY); return expectedQueryParams; } protected List<BasicNameValuePair> getBasicNameValuePartListForWriteComment() { List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>(); parameters.add(new BasicNameValuePair(StackUri.QueryParams.ACCESS_TOKEN, AppUtils.loadAccessToken(null))); parameters.add(new BasicNameValuePair(StackUri.QueryParams.KEY, StackUri.QueryParamDefaultValues.KEY)); parameters.add(new BasicNameValuePair(StackUri.QueryParams.CLIENT_ID, QueryParamDefaultValues.CLIENT_ID)); parameters.add(new BasicNameValuePair(StackUri.QueryParams.SITE, OperatingSite.getSite().apiSiteParameter)); return parameters; } protected ArrayList<Site> getSites(int num) { ArrayList<Site> sites = new ArrayList<Site>(); for (int i = 0; i < num; i++) sites.add(getSite(i)); return sites; } private Site getSite(int i) { Site site = new Site(); site.apiSiteParameter = "apiSiteParamter" + i; site.name = "name" + i; site.audience = "audience" + i; site.iconUrl = "iconUrl" + i; site.logoUrl = "logoUrl" + i; site.faviconUrl = "faviconUrl" + i; site.link = "link" + i; return site; } protected ArrayList<Account> getAccounts(int num) { ArrayList<Account> accounts = new ArrayList<Account>(); for (int i = 0; i < num; i++) accounts.add(getAccount(i)); return accounts; } private Account getAccount(int i) { Account account = new Account(); account.id = i; account.userId = 100 + i; account.siteName = "siteName" + i; account.siteUrl = "http://siteUrl/" + i; account.userType = UserType.values()[i % UserType.values().length]; return account; } protected ArrayList<Question> getQuestions(int num) { ArrayList<Question> questions = new ArrayList<Question>(); for (int i = 0; i < num; i++) questions.add(getQuestion(false, i % 2 == 0)); return questions; } protected Question getQuestion(boolean body, boolean acceptedAnswer) { Question question = new Question(); question.id = System.currentTimeMillis(); question.title = "question title " + question.id; question.answerCount = 0; question.hasAcceptedAnswer = acceptedAnswer; if (body) question.body = "body"; question.creationDate = System.currentTimeMillis(); question.link = "http://link/1"; question.score = 1; question.tags = new String[] { "tag1", "tag2" }; question.answered = false; question.viewCount = 10; question.votes = 2; question.owner = getShallowUser(); return question; } protected ArrayList<Answer> getAnswers(int num, boolean body) { ArrayList<Answer> answers = new ArrayList<Answer>(); for (int i = 0; i < num; i++) answers.add(getAnswer(i, body, i % 3 == 0)); return answers; } protected Answer getAnswer(long questionId, boolean body, boolean isAccepted) { Answer answer = new Answer(); answer.id = System.currentTimeMillis(); if (body) answer.body = "body" + answer.id; answer.title = "question title " + System.currentTimeMillis(); answer.creationDate = System.currentTimeMillis(); answer.questionId = questionId; answer.score = 1; answer.owner = getShallowUser(); return answer; } protected ArrayList<Comment> getComments(long postId) { ArrayList<Comment> comments = new ArrayList<Comment>(); comments.add(getComment(postId, 1)); comments.add(getComment(postId, 2)); return comments; } protected Comment getComment(long postId, long id) { Comment comment = new Comment(); comment.id = id; comment.body = "body" + id; comment.creationDate = System.currentTimeMillis(); comment.post_id = postId; comment.score = 1; comment.owner = getShallowUser(); return comment; } protected User getDetailedUser() { User user = new User(); user.id = 199; user.displayName = "displayName"; user.acceptRate = 50; user.accountId = 299; user.reputation = 500; user.profileViews = 100; user.badgeCounts = new int[3]; user.badgeCounts[0] = 1; user.badgeCounts[1] = 10; user.badgeCounts[2] = 20; user.questionCount = 10; user.answerCount = 5; user.upvoteCount = 25; user.downvoteCount = 2; user.lastAccessTime = System.currentTimeMillis(); return user; } protected User getShallowUser() { User user = new User(); user.id = System.currentTimeMillis(); user.displayName = "fyodor-" + user.id; user.acceptRate = (int) (user.id % 51); user.reputation = (int) (user.id % 101); user.profileImageLink = "http://profile/" + user.id + "/image.png"; return user; } protected void assertDetailUserEquals(User expectedUser, User user) { assertNotNull(user); assertEquals(expectedUser.id, user.id); assertEquals(expectedUser.displayName, user.displayName); assertEquals(expectedUser.reputation, user.reputation); assertEquals(expectedUser.acceptRate, user.acceptRate); assertEquals(expectedUser.profileViews, user.profileViews); assertArrayEquals(expectedUser.badgeCounts, user.badgeCounts); assertEquals(expectedUser.questionCount, user.questionCount); assertEquals(expectedUser.answerCount, user.answerCount); assertEquals(expectedUser.upvoteCount, user.upvoteCount); assertEquals(expectedUser.downvoteCount, user.downvoteCount); assertEquals(expectedUser.lastAccessTime, user.lastAccessTime); } protected void assertSiteEquals(Site expectedSite, Site site) { assertNotNull(site); assertEquals(expectedSite.name, site.name); assertEquals(expectedSite.apiSiteParameter, site.apiSiteParameter); assertEquals(expectedSite.audience, site.audience); assertEquals(expectedSite.link, site.link); assertEquals(expectedSite.iconUrl, site.iconUrl); assertEquals(expectedSite.logoUrl, site.logoUrl); assertEquals(expectedSite.faviconUrl, site.faviconUrl); } protected void assertAccountEquals(Account expectedAccount, Account account) { assertNotNull(site); assertEquals(expectedAccount.id, account.id); assertEquals(expectedAccount.siteName, account.siteName); assertEquals(expectedAccount.siteUrl, account.siteUrl); assertEquals(expectedAccount.userId, account.userId); assertEquals(expectedAccount.userId, account.userId); assertEquals(expectedAccount.userType, account.userType); } protected void assertQuestionsEquals(ArrayList<Question> expectedQuestions, ArrayList<Question> questions) { assertNotNull(questions); assertEquals(expectedQuestions.size(), questions.size()); for (int i = 0; i < questions.size(); i++) assertQuestionEquals(expectedQuestions.get(0), questions.get(0)); } protected void assertQuestionEquals(Question expectedQuestion, Question question) { assertNotNull(question); assertEquals(expectedQuestion.id, question.id); assertEquals(expectedQuestion.title, question.title); assertEquals(expectedQuestion.answerCount, question.answerCount); assertEquals(expectedQuestion.answered, question.answered); assertEquals(expectedQuestion.hasAcceptedAnswer, question.hasAcceptedAnswer); assertEquals(expectedQuestion.score, question.score); assertEquals(expectedQuestion.viewCount, question.viewCount); assertEquals(expectedQuestion.link, question.link); assertEquals(expectedQuestion.creationDate, question.creationDate); assertArrayEquals(expectedQuestion.tags, question.tags); assertShallowUserEquals(expectedQuestion.owner, question.owner); } protected void assertAnswersEquals(ArrayList<Answer> expectedAnswers, ArrayList<Answer> answers) { assertNotNull(answers); assertEquals(expectedAnswers.size(), answers.size()); for (int i = 0; i < answers.size(); i++) assertAnswerEquals(expectedAnswers.get(0), answers.get(0)); } protected void assertAnswerEquals(Answer expectedAnswer, Answer answer) { assertNotNull(answer); assertEquals(expectedAnswer.id, answer.id); assertEquals(expectedAnswer.title, answer.title); assertEquals(expectedAnswer.body, answer.body); assertEquals(expectedAnswer.score, answer.score); assertEquals(expectedAnswer.accepted, answer.accepted); assertEquals(expectedAnswer.creationDate, answer.creationDate); assertShallowUserEquals(expectedAnswer.owner, answer.owner); } protected void assertCommentsEquals(ArrayList<Comment> expectedComments, ArrayList<Comment> comments) { assertNotNull(comments); assertEquals(expectedComments.size(), comments.size()); for (int i = 0; i < comments.size(); i++) assertCommentEquals(expectedComments.get(0), comments.get(0)); } protected void assertCommentEquals(Comment expectedComment, Comment comment) { assertEquals(expectedComment.id, comment.id); assertEquals(expectedComment.post_id, comment.post_id); assertEquals(expectedComment.body, comment.body); assertEquals(expectedComment.score, comment.score); assertEquals(expectedComment.creationDate, comment.creationDate); assertShallowUserEquals(expectedComment.owner, comment.owner); } protected void assertShallowUserEquals(User expectedOwner, User owner) { assertNotNull(owner); assertEquals(expectedOwner.id, owner.id); assertEquals(expectedOwner.displayName, owner.displayName); assertEquals(expectedOwner.reputation, owner.reputation); assertEquals(expectedOwner.acceptRate, owner.acceptRate); } protected void mockRestCall(String expectedRestEndpoint, HashMap<String, String> expectedQueryParams, JSONObjectWrapper returnJsonObjectWrapper) { when( httpHelper.executeHttpGet(StackUri.STACKX_API_HOST, expectedRestEndpoint, expectedQueryParams, SecureHttpHelper.HTTP_GZIP_RESPONSE_INTERCEPTOR, AbstractBaseServiceHelper.JSON_PARSER)).thenReturn( returnJsonObjectWrapper); } }