package net.pterodactylus.sone.core; import static java.util.Arrays.asList; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.HashSet; import net.pterodactylus.sone.core.SoneChangeDetector.PostProcessor; import net.pterodactylus.sone.core.SoneChangeDetector.PostReplyProcessor; import net.pterodactylus.sone.data.Post; import net.pterodactylus.sone.data.PostReply; import net.pterodactylus.sone.data.Sone; import org.junit.Before; import org.junit.Test; /** * Unit test for {@link SoneChangeDetector}. * * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a> */ public class SoneChangeDetectorTest { private final Sone oldSone = mock(Sone.class); private final Sone newSone = mock(Sone.class); private final SoneChangeDetector soneChangeDetector = new SoneChangeDetector(oldSone); private final Post oldPost = mock(Post.class); private final Post removedPost = mock(Post.class); private final Post newPost = mock(Post.class); private final PostProcessor newPostProcessor = mock(PostProcessor.class); private final PostProcessor removedPostProcessor = mock(PostProcessor.class); private final PostReply oldPostReply = mock(PostReply.class); private final PostReply removedPostReply = mock(PostReply.class); private final PostReply newPostReply = mock(PostReply.class); private final PostReplyProcessor newPostReplyProcessor = mock(PostReplyProcessor.class); private final PostReplyProcessor removedPostReplyProcessor = mock(PostReplyProcessor.class); @Before public void setupPosts() { when(oldSone.getPosts()).thenReturn(asList(oldPost, removedPost)); when(newSone.getPosts()).thenReturn(asList(oldPost, newPost)); } @Before public void setupPostProcessors() { soneChangeDetector.onNewPosts(newPostProcessor); soneChangeDetector.onRemovedPosts(removedPostProcessor); } @Before public void setupPostReplies() { when(oldSone.getReplies()).thenReturn( new HashSet<PostReply>( asList(oldPostReply, removedPostReply))); when(newSone.getReplies()).thenReturn( new HashSet<PostReply>(asList(oldPostReply, newPostReply))); } @Before public void setupPostReplyProcessors() { soneChangeDetector.onNewPostReplies(newPostReplyProcessor); soneChangeDetector.onRemovedPostReplies(removedPostReplyProcessor); } @Test public void changeDetectorDetectsChanges() { soneChangeDetector.detectChanges(newSone); verify(newPostProcessor).processPost(newPost); verify(newPostProcessor, never()).processPost(oldPost); verify(newPostProcessor, never()).processPost(removedPost); verify(removedPostProcessor).processPost(removedPost); verify(removedPostProcessor, never()).processPost(oldPost); verify(removedPostProcessor, never()).processPost(newPost); verify(newPostReplyProcessor).processPostReply(newPostReply); verify(newPostReplyProcessor, never()).processPostReply(oldPostReply); verify(newPostReplyProcessor, never()).processPostReply( removedPostReply); verify(removedPostReplyProcessor).processPostReply(removedPostReply); verify(removedPostReplyProcessor, never()).processPostReply( oldPostReply); verify(removedPostReplyProcessor, never()).processPostReply( newPostReply); } @Test public void changeDetectorDoesNotNotifyAnyProcessorIfProcessorsUnset() { soneChangeDetector.onNewPosts(null); soneChangeDetector.onRemovedPosts(null); soneChangeDetector.onNewPostReplies(null); soneChangeDetector.onRemovedPostReplies(null); soneChangeDetector.detectChanges(newSone); verify(newPostProcessor, never()).processPost(any(Post.class)); verify(removedPostProcessor, never()).processPost(any(Post.class)); verify(newPostReplyProcessor, never()).processPostReply(any(PostReply.class)); verify(removedPostReplyProcessor, never()).processPostReply(any(PostReply.class)); } }