Refactor test, move mocks and verifiers to their respective classes.
[Sone.git] / src / test / java / net / pterodactylus / sone / data / Mocks.java
index 8c8c93a..ff52581 100644 (file)
@@ -26,24 +26,36 @@ import static com.google.common.collect.Ordering.from;
 import static java.util.Collections.emptySet;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import net.pterodactylus.sone.core.Core;
 import net.pterodactylus.sone.data.impl.DefaultPostBuilder;
 import net.pterodactylus.sone.data.impl.DefaultPostReplyBuilder;
 import net.pterodactylus.sone.database.Database;
 import net.pterodactylus.sone.database.PostReplyBuilder;
+import net.pterodactylus.sone.web.WebInterface;
+import net.pterodactylus.sone.web.page.FreenetRequest;
+
+import freenet.clients.http.HTTPRequestImpl;
+import freenet.support.api.HTTPRequest;
 
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.common.collect.FluentIterable;
+import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Ordering;
+import com.google.common.collect.SetMultimap;
+import org.mockito.Matchers;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
@@ -58,12 +70,16 @@ public class Mocks {
        private final Map<String, Sone> sones = newHashMap();
        private final Multimap<Post, PostReply> postReplies = create();
        private final Multimap<String, Post> directedPosts = create();
+       private final SetMultimap<Post, Sone> postLikingSones = HashMultimap.create();
+       private final SetMultimap<PostReply, Sone> postReplyLikingSones = HashMultimap.create();
        public final Database database;
        public final Core core;
+       public final WebInterface webInterface;
 
        public Mocks() {
                database = mockDatabase();
                core = mockCore(database);
+               webInterface = mockWebInterface(core);
                when(database.getSone()).thenReturn(new Function<String, Optional<Sone>>() {
                        @Override
                        public Optional<Sone> apply(String soneId) {
@@ -105,6 +121,12 @@ public class Mocks {
                return database;
        }
 
+       private static WebInterface mockWebInterface(Core core) {
+               WebInterface webInterface = mock(WebInterface.class);
+               when(webInterface.getCore()).thenReturn(core);
+               return webInterface;
+       }
+
        public SoneMocker mockSone(String id) {
                return new SoneMocker(id);
        }
@@ -117,6 +139,13 @@ public class Mocks {
                return new PostReplyMocker(replyId, sone);
        }
 
+       public FreenetRequest mockRequest(String path) throws URISyntaxException {
+               HTTPRequest httpRequest = new HTTPRequestImpl(new URI(path), "GET");
+               FreenetRequest request = mock(FreenetRequest.class);
+               when(request.getHttpRequest()).thenReturn(httpRequest);
+               return request;
+       }
+
        public class SoneMocker {
 
                private final Sone mockedSone = mock(Sone.class);
@@ -252,6 +281,26 @@ public class Mocks {
                                        return Ordering.from(Reply.TIME_COMPARATOR).sortedCopy(postReplies.get(post));
                                }
                        });
+                       doAnswer(new Answer<Void>() {
+                               @Override
+                               public Void answer(InvocationOnMock invocation) throws Throwable {
+                                       postLikingSones.put(post, (Sone) invocation.getArguments()[0]);
+                                       return null;
+                               }
+                       }).when(post).like(Matchers.<Sone>any());
+                       doAnswer(new Answer<Void>() {
+                               @Override
+                               public Void answer(InvocationOnMock invocation) throws Throwable {
+                                       postLikingSones.remove(post, (Sone) invocation.getArguments()[0]);
+                                       return null;
+                               }
+                       }).when(post).unlike(Matchers.<Sone>any());
+                       when(post.getLikes()).thenAnswer(new Answer<Set<Sone>>() {
+                               @Override
+                               public Set<Sone> answer(InvocationOnMock invocation) throws Throwable {
+                                       return postLikingSones.get(post);
+                               }
+                       });
                        return post;
                }
 
@@ -297,6 +346,26 @@ public class Mocks {
                        if (text.isPresent()) {
                                when(postReply.getText()).thenReturn(text.get());
                        }
+                       doAnswer(new Answer<Void>() {
+                               @Override
+                               public Void answer(InvocationOnMock invocation) throws Throwable {
+                                       postReplyLikingSones.put(postReply, (Sone) invocation.getArguments()[0]);
+                                       return null;
+                               }
+                       }).when(postReply).like(Matchers.<Sone>any());
+                       doAnswer(new Answer<Void>() {
+                               @Override
+                               public Void answer(InvocationOnMock invocation) throws Throwable {
+                                       postReplyLikingSones.remove(postReply, invocation.getArguments()[0]);
+                                       return null;
+                               }
+                       }).when(postReply).unlike(Matchers.<Sone>any());
+                       when(postReply.getLikes()).thenAnswer(new Answer<Set<Sone>>() {
+                               @Override
+                               public Set<Sone> answer(InvocationOnMock invocation) throws Throwable {
+                                       return postReplyLikingSones.get(postReply);
+                               }
+                       });
                        return postReply;
                }
        }