package com.socialize.test.comment.ui; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.view.ViewGroup; import android.widget.RelativeLayout; import com.socialize.SocializeService; import com.socialize.api.action.comment.CommentOptions; import com.socialize.api.action.comment.CommentUtilsProxy; import com.socialize.api.action.comment.SocializeCommentUtils; import com.socialize.entity.Comment; import com.socialize.entity.Entity; import com.socialize.entity.ListResult; import com.socialize.error.SocializeException; import com.socialize.listener.comment.CommentAddListener; import com.socialize.listener.comment.CommentListListener; import com.socialize.networks.SocialNetwork; import com.socialize.test.SocializeActivityTest; import com.socialize.ui.comment.CommentAdapter; import com.socialize.ui.comment.CommentAddButtonListener; import com.socialize.ui.comment.CommentEditField; import com.socialize.ui.comment.CommentListView; import com.socialize.ui.comment.CommentScrollListener; import com.socialize.ui.dialog.SimpleDialogFactory; import com.socialize.ui.header.SocializeHeader; import com.socialize.ui.view.LoadingListView; import org.mockito.Mockito; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; public class CommentListViewTest extends SocializeActivityTest { Entity entity = Entity.newInstance("foobar", null); public void testGetCommentScrollListener() { PublicCommentListView view = new PublicCommentListView(getContext()) { @Override public void getNextSet() { addResult(true); } }; view.setLoading(true); CommentScrollListener commentScrollListener = view.getCommentScrollListener(); assertNotNull(commentScrollListener.getCallback()); commentScrollListener.getCallback().onGetNextSet(); assertTrue(commentScrollListener.getCallback().isLoading()); Boolean nextResult = getNextResult(); assertNotNull(nextResult); assertTrue(nextResult); } public void testGetCommentAddListener() throws Throwable { final CountDownLatch latch = new CountDownLatch(1); PublicCommentListView view = new PublicCommentListView(getContext()) { @Override public void showError(Context context, Exception message) { addResult(1, message); } }; SocializeCommentUtils mockCommentUtils = new SocializeCommentUtils() { @Override public void addComment(Activity context, Entity entity, String text, CommentOptions commentOptions, CommentAddListener listener, SocialNetwork... networks) { addResult(0, text); latch.countDown(); } }; view.setCommentUtils(mockCommentUtils); final CommentAddButtonListener commentScrollListener = view.getCommentAddButtonListener(); assertNotNull(commentScrollListener.getCallback()); runTestOnUiThread(new Runnable() { @Override public void run() { commentScrollListener.getCallback().onComment("foobar", true, false); commentScrollListener.getCallback().onError(getContext(), new SocializeException("foobar_error")); } }); assertTrue(latch.await(20, TimeUnit.SECONDS)); String comment = getResult(0); Exception message = getResult(1); assertNotNull(comment); assertNotNull(message); assertEquals("foobar", comment); assertEquals("foobar_error", message.getMessage()); } @SuppressWarnings("unchecked") public void testPostCommentSuccess() { final String title = "socialize_comment_dialog"; final String message = "socialize_please_wait"; final int totalCount = 69; final int startIndex = 0; final int endIndex = 10; final String commentString = "foobar_comment"; boolean shareLocation = true; final Comment comment = Mockito.mock(Comment.class); final ProgressDialog dialog = Mockito.mock(ProgressDialog.class); final SimpleDialogFactory<ProgressDialog> progressDialogFactory = Mockito.mock(SimpleDialogFactory.class); final CommentAdapter commentAdapter = Mockito.mock(CommentAdapter.class); final List<Comment> comments = Mockito.mock(List.class); final CommentEditField field = Mockito.mock(CommentEditField.class); final SocializeHeader header = Mockito.mock(SocializeHeader.class); final LoadingListView content = Mockito.mock(LoadingListView.class); final Entity entity = Mockito.mock(Entity.class); Mockito.when(progressDialogFactory.show(getContext(), title, message)).thenReturn(dialog); Mockito.when(comment.getText()).thenReturn(commentString); Mockito.when(commentAdapter.getComments()).thenReturn(comments); Mockito.when(commentAdapter.getTotalCount()).thenReturn(totalCount); final CommentUtilsProxy mockCommentUtilsProxy = new SocializeCommentUtils() { @Override public void addComment(Activity context, Entity entity, String text, CommentOptions commentOptions, CommentAddListener listener, SocialNetwork... networks) { assertEquals(commentString, comment.getText()); listener.onCreate(comment); } }; PublicCommentListView view = new PublicCommentListView(getContext()) { @Override public Comment newComment() { return comment; } }; view.setCommentAdapter(commentAdapter); view.setProgressDialogFactory(progressDialogFactory); view.setHeader(header); view.setCommentEntryField(field); view.setContent(content); view.setStartIndex(startIndex); view.setEndIndex(endIndex); view.setEntity(entity); view.setCommentUtils(mockCommentUtilsProxy); view.getCommentAddButtonListener().onComment(commentString, shareLocation, false); Mockito.verify(comments).add(0, comment); Mockito.verify(header).setText((totalCount) + " Comments"); Mockito.verify(commentAdapter).setTotalCount((totalCount+1)); Mockito.verify(commentAdapter).notifyDataSetChanged(); Mockito.verify(content).scrollToTop(); Mockito.verify(dialog).dismiss(); // Make sure indexes were updated assertEquals(1, view.getStartIndex()); assertEquals(endIndex+1, view.getEndIndex()); } @SuppressWarnings("unchecked") public void testPostCommentFail() { final String title = "socialize_comment_dialog"; final String message = "socialize_please_wait"; final String comment = "foobar"; final String entityKey = "foobar_entity_key"; final String entityName = "foobar_entity_name"; final Entity entity = new Entity(); entity.setName(entityName); entity.setKey(entityKey); final SocializeException error = Mockito.mock(SocializeException.class); final ProgressDialog dialog = Mockito.mock(ProgressDialog.class); final SimpleDialogFactory<ProgressDialog> progressDialogFactory = Mockito.mock(SimpleDialogFactory.class); Mockito.when(progressDialogFactory.show(getContext(), title, message)).thenReturn(dialog); final CommentUtilsProxy mockCommentUtilsProxy = new SocializeCommentUtils() { @Override public void addComment(Activity context, Entity entity, String text, CommentOptions commentOptions, CommentAddListener listener, SocialNetwork... networks) { // call onError manually for the test. listener.onError(error); } }; PublicCommentListView view = new PublicCommentListView(getContext()) { @Override public void showError(Context context, Exception message) { // Expect this addResult(message); } }; view.setProgressDialogFactory(progressDialogFactory); view.setEntity(entity); view.setCommentUtils(mockCommentUtilsProxy); view.getCommentAddButtonListener().onComment(comment, true, false); Mockito.verify(dialog).dismiss(); Exception result = getNextResult(); assertNotNull(result); } public void testGetNextSetIsLast() { final int totalCount = 69; final CommentAdapter commentAdapter = Mockito.mock(CommentAdapter.class); Mockito.when(commentAdapter.getTotalCount()).thenReturn(totalCount); PublicCommentListView view = new PublicCommentListView(getContext()) { @Override protected SocializeService getSocialize() { fail(); // Shouldn't be called return null; } }; // Orchestrate the completion state final int endIndex = 70; final int startIndex = 60; final int grabLength = 10; view.setCommentAdapter(commentAdapter); view.setStartIndex(startIndex); view.setEndIndex(endIndex); view.setDefaultGrabLength(grabLength); view.getNextSet(); Mockito.verify(commentAdapter).notifyDataSetChanged(); Mockito.verify(commentAdapter).setLast(true); assertEquals(totalCount, view.getEndIndex()); assertEquals(startIndex+grabLength, view.getStartIndex()); assertFalse(view.isLoading()); } @SuppressWarnings("unchecked") public void testGetNextSet() { final int startIndex = 0; final int endIndex = 70; final CommentAdapter commentAdapter = Mockito.mock(CommentAdapter.class); final List<Comment> comments = Mockito.mock(List.class); final List<Comment> listResultComments = Mockito.mock(List.class); final ListResult<Comment> entities = Mockito.mock(ListResult.class); Mockito.when(commentAdapter.getComments()).thenReturn(comments); Mockito.when(entities.getItems()).thenReturn(listResultComments); Mockito.when(comments.addAll(listResultComments)).thenReturn(true); Mockito.when(commentAdapter.getTotalCount()).thenReturn(79); final CommentUtilsProxy mockCommentUtilsProxy = new SocializeCommentUtils() { @Override public void getCommentsByEntity(Activity context, String entityKey, int start, int end, CommentListListener listener) { listener.onList(entities); } }; PublicCommentListView view = new PublicCommentListView(getContext()) { @Override protected void preLoadImages(List<Comment> comments) { // Do nothing. } }; view.setCommentAdapter(commentAdapter); view.setStartIndex(startIndex); view.setEndIndex(endIndex); view.setDefaultGrabLength(10); view.setCommentUtils(mockCommentUtilsProxy); view.getNextSet(); Mockito.verify(commentAdapter).setComments(comments); Mockito.verify(commentAdapter).notifyDataSetChanged(); assertFalse(view.isLoading()); } @SuppressWarnings("unchecked") public void testDoListCommentsSuccessEmptyCommentsWithoutUpdate() { final int totalCount = 69; final int startIndex = 0; final int endIndex = 70; final CommentAdapter commentAdapter = Mockito.mock(CommentAdapter.class); final List<Comment> comments = Mockito.mock(List.class); final List<Comment> listResultComments = Mockito.mock(List.class); final SocializeHeader header = Mockito.mock(SocializeHeader.class); final LoadingListView content = Mockito.mock(LoadingListView.class); final ListResult<Comment> entities = Mockito.mock(ListResult.class); Mockito.when(commentAdapter.getComments()).thenReturn(comments); Mockito.when(comments.size()).thenReturn(0); // Empty comments Mockito.when(entities.getItems()).thenReturn(listResultComments); Mockito.when(entities.getTotalCount()).thenReturn(totalCount); Mockito.when(commentAdapter.getTotalCount()).thenReturn(totalCount); final CommentUtilsProxy mockCommentUtilsProxy = new SocializeCommentUtils() { @Override public void getCommentsByEntity(Activity context, String entityKey, int start, int end, CommentListListener listener) { listener.onList(entities); } }; PublicCommentListView view = new PublicCommentListView(getContext()) { // @Override protected void preLoadImages(List<Comment> comments) { // Do nothing. } }; view.setCommentAdapter(commentAdapter); view.setHeader(header); view.setContent(content); view.setStartIndex(startIndex); view.setDefaultGrabLength(endIndex); view.setCommentUtils(mockCommentUtilsProxy); view.doListComments(false); assertEquals(totalCount, view.getTotalCount()); assertFalse(view.isLoading()); Mockito.verify(content).scrollToTop(); Mockito.verify(commentAdapter).setComments(listResultComments); Mockito.verify(commentAdapter).setLast(true); Mockito.verify(commentAdapter).setTotalCount(totalCount); Mockito.verify(commentAdapter).notifyDataSetChanged(); Mockito.verify(header).setText(totalCount + " Comments"); Mockito.verify(content).showList(); } @SuppressWarnings("unchecked") public void testDoListCommentsFailEmptyCommentsWithoutUpdate() { final SocializeException error = Mockito.mock(SocializeException.class); final CommentAdapter commentAdapter = Mockito.mock(CommentAdapter.class); final List<Comment> comments = Mockito.mock(List.class); final LoadingListView content = Mockito.mock(LoadingListView.class); Mockito.when(commentAdapter.getComments()).thenReturn(comments); Mockito.when(comments.size()).thenReturn(0); // Empty comments final CommentUtilsProxy mockCommentUtilsProxy = new SocializeCommentUtils() { @Override public void getCommentsByEntity(Activity context, String entityKey, int start, int end, CommentListListener listener) { listener.onError(error); } }; PublicCommentListView view = new PublicCommentListView(getContext()) { @Override public void showError(Context context, Exception error) { addResult(error); } }; view.setCommentAdapter(commentAdapter); view.setContent(content); view.setCommentUtils(mockCommentUtilsProxy); view.doListComments(false); Mockito.verify(content).showList(); Exception result = getNextResult(); assertNotNull(result); } @SuppressWarnings("unchecked") public void testDoListCommentsSuccessPopulatedCommentsWithoutUpdate() { final CommentAdapter commentAdapter = Mockito.mock(CommentAdapter.class); final List<Comment> comments = Mockito.mock(List.class); final LoadingListView content = Mockito.mock(LoadingListView.class); final SocializeHeader header = Mockito.mock(SocializeHeader.class); Mockito.when(commentAdapter.getComments()).thenReturn(comments); Mockito.when(comments.size()).thenReturn(10); // Populated comments Mockito.when(commentAdapter.getTotalCount()).thenReturn(10); // Populated comments PublicCommentListView view = new PublicCommentListView(getContext()); view.setCommentAdapter(commentAdapter); view.setContent(content); view.setHeader(header); view.doListComments(false); Mockito.verify(commentAdapter).notifyDataSetChanged(); Mockito.verify(content).showList(); Mockito.verify(header).setText(10 + " Comments"); assertFalse(view.isLoading()); } public void testOnViewLoadSuccess() { final SocializeService socialize = Mockito.mock(SocializeService.class); Mockito.when(socialize.isAuthenticated()).thenReturn(true); PublicCommentListView view = new PublicCommentListView(getContext()) { @Override protected SocializeService getSocialize() { return socialize; } @Override public void doListComments(boolean update) { addResult(update); } }; view.onViewRendered(10, 10); Boolean update = getNextResult(); assertNotNull(update); assertFalse(update); } public void testOnViewLoadFail() { final SocializeService socialize = Mockito.mock(SocializeService.class); final LoadingListView content = Mockito.mock(LoadingListView.class); Mockito.when(socialize.isAuthenticated()).thenReturn(false); PublicCommentListView view = new PublicCommentListView(getContext()) { @Override protected SocializeService getSocialize() { return socialize; } @Override public void doListComments(boolean update) { fail(); } @Override public void showError(Context context, Exception error) { addResult(error); } }; view.setContent(content); view.onViewRendered(10,10); Exception error = getNextResult(); assertNotNull(error); assertEquals("Socialize not authenticated", error.getMessage()); Mockito.verify(content).showList(); } class PublicCommentListView extends CommentListView { public PublicCommentListView(Context context) { super(context); setEntity(entity); } @Override public CommentScrollListener getCommentScrollListener() { return super.getCommentScrollListener(); } @Override public CommentAddButtonListener getCommentAddButtonListener() { return super.getCommentAddButtonListener(); } @Override public void setLoading(boolean loading) { super.setLoading(loading); } @Override protected void setCommentEntryField(CommentEditField field) { super.setCommentEntryField(field); } @Override public void setHeader(SocializeHeader header) { super.setHeader(header); } @Override public void setContent(LoadingListView content) { super.setContent(content); } @Override public void setStartIndex(int startIndex) { super.setStartIndex(startIndex); } @Override public void setEndIndex(int endIndex) { super.setEndIndex(endIndex); } @Override public void getNextSet() { super.getNextSet(); } @Override public void onAttachedToWindow() { super.onAttachedToWindow(); } @Override public void onViewUpdate() { super.onViewUpdate(); } @Override public void onViewLoad() { super.onViewLoad(); } @Override public void onViewRendered(int width, int height) { super.onViewRendered(width, height); } @Override public CommentOptions newShareOptions() { return super.newShareOptions(); } @Override public Comment newComment() { return super.newComment(); } @Override public void doNotificationStatusSave() { super.doNotificationStatusSave(); } @Override public void doNotificationStatusLoad() { super.doNotificationStatusLoad(); } @Override public RelativeLayout getLayoutAnchor() { return super.getLayoutAnchor(); } @Override public ViewGroup getSliderAnchor() { return super.getSliderAnchor(); } } }