X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ftest%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdata%2FMocks.java;h=f1b0a09b2bf877b6306095a399d73d479b4acd7b;hb=953c41bc82b474680d84266fd7227ce08480883c;hp=07ca567dbd0ebb8f6e3f741464edfa21ebe013fa;hpb=79f8a4ca967da3a0e9c53640117576ea92601d15;p=Sone.git diff --git a/src/test/java/net/pterodactylus/sone/data/Mocks.java b/src/test/java/net/pterodactylus/sone/data/Mocks.java index 07ca567..f1b0a09 100644 --- a/src/test/java/net/pterodactylus/sone/data/Mocks.java +++ b/src/test/java/net/pterodactylus/sone/data/Mocks.java @@ -17,17 +17,23 @@ package net.pterodactylus.sone.data; +import static com.google.common.base.Optional.absent; +import static com.google.common.base.Optional.fromNullable; import static com.google.common.base.Optional.of; import static com.google.common.collect.ArrayListMultimap.create; +import static com.google.common.collect.Maps.newHashMap; import static com.google.common.collect.Ordering.from; -import static com.google.common.collect.Sets.newHashSet; +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.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; @@ -35,9 +41,14 @@ import net.pterodactylus.sone.data.impl.DefaultPostReplyBuilder; import net.pterodactylus.sone.database.Database; import net.pterodactylus.sone.database.PostReplyBuilder; +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; @@ -49,17 +60,39 @@ import org.mockito.stubbing.Answer; public class Mocks { private final Multimap sonePosts = create(); - private final Collection sones = newHashSet(); + private final Map sones = newHashMap(); + private final Multimap postReplies = create(); + private final Multimap directedPosts = create(); + private final SetMultimap postLikingSones = HashMultimap.create(); + private final SetMultimap postReplyLikingSones = HashMultimap.create(); public final Database database; public final Core core; public Mocks() { database = mockDatabase(); core = mockCore(database); + when(database.getSone()).thenReturn(new Function>() { + @Override + public Optional apply(String soneId) { + return (soneId == null) ? Optional.absent() : fromNullable(sones.get(soneId)); + } + }); + when(core.getSones()).then(new Answer>() { + @Override + public Collection answer(InvocationOnMock invocation) throws Throwable { + return sones.values(); + } + }); when(core.getLocalSones()).then(new Answer>() { @Override public Collection answer(InvocationOnMock invocation) throws Throwable { - return FluentIterable.from(sones).filter(Sone.LOCAL_SONE_FILTER).toList(); + return FluentIterable.from(sones.values()).filter(Sone.LOCAL_SONE_FILTER).toList(); + } + }); + when(database.getDirectedPosts(anyString())).then(new Answer>() { + @Override + public Collection answer(InvocationOnMock invocation) throws Throwable { + return directedPosts.get((String) invocation.getArguments()[0]); } }); } @@ -87,12 +120,8 @@ public class Mocks { return new PostMocker(postId, sone); } - public PostReply mockPostReply(Sone sone, String replyId) { - PostReply postReply = mock(PostReply.class); - when(postReply.getId()).thenReturn(replyId); - when(postReply.getSone()).thenReturn(sone); - when(database.getPostReply(eq(replyId))).thenReturn(of(postReply)); - return postReply; + public PostReplyMocker mockPostReply(Sone sone, String replyId) { + return new PostReplyMocker(replyId, sone); } public class SoneMocker { @@ -100,7 +129,10 @@ public class Mocks { private final Sone mockedSone = mock(Sone.class); private final String id; private boolean local; + private Optional name = absent(); + private long time; private Profile profile = new Profile(mockedSone); + private Collection friends = emptySet(); private SoneMocker(String id) { this.id = id; @@ -111,9 +143,38 @@ public class Mocks { return this; } + public SoneMocker withName(String name) { + this.name = fromNullable(name); + return this; + } + + public SoneMocker withTime(long time) { + this.time = time; + return this; + } + + public SoneMocker withProfileName(String firstName, String middleName, String lastName) { + profile.modify().setFirstName(firstName).setMiddleName(middleName).setLastName(lastName).update(); + return this; + } + + public SoneMocker addProfileField(String fieldName, String fieldValue) { + profile.setField(profile.addField(fieldName), fieldValue); + return this; + } + + public SoneMocker withFriends(Collection friends) { + this.friends = friends; + return this; + } + public Sone create() { when(mockedSone.getId()).thenReturn(id); when(mockedSone.isLocal()).thenReturn(local); + if (name.isPresent()) { + when(mockedSone.getName()).thenReturn(name.get()); + } + when(mockedSone.getTime()).thenReturn(time); when(mockedSone.getProfile()).thenReturn(profile); if (local) { when(mockedSone.newPostBuilder()).thenReturn(new DefaultPostBuilder(database, id)); @@ -123,6 +184,14 @@ public class Mocks { return new DefaultPostReplyBuilder(database, id, (String) invocation.getArguments()[0]); } }); + when(mockedSone.hasFriend(anyString())).thenReturn(false); + when(mockedSone.getFriends()).thenReturn(friends); + when(mockedSone.hasFriend(anyString())).then(new Answer() { + @Override + public Boolean answer(InvocationOnMock invocation) throws Throwable { + return friends.contains(invocation.getArguments()[0]); + } + }); } else { when(mockedSone.newPostBuilder()).thenThrow(IllegalStateException.class); when(mockedSone.newPostReplyBuilder(anyString())).thenThrow(IllegalStateException.class); @@ -136,7 +205,7 @@ public class Mocks { } }); when(mockedSone.toString()).thenReturn(String.format("Sone[%s]", id)); - sones.add(mockedSone); + sones.put(id, mockedSone); return mockedSone; } @@ -147,20 +216,136 @@ public class Mocks { private final Post post = mock(Post.class); private final String id; private final Sone sone; + private Optional recipientId = absent(); + private long time; + private Optional text = absent(); public PostMocker(String id, Sone sone) { this.id = id; this.sone = sone; } + public PostMocker withRecipient(String recipientId) { + this.recipientId = fromNullable(recipientId); + return this; + } + + public PostMocker withTime(long time) { + this.time = time; + return this; + } + + public PostMocker withText(String text) { + this.text = fromNullable(text); + return this; + } + public Post create() { when(post.getId()).thenReturn(id); when(post.getSone()).thenReturn(sone); + when(post.getRecipientId()).thenReturn(recipientId); + if (recipientId.isPresent()) { + directedPosts.put(recipientId.get(), post); + } + when(post.getTime()).thenReturn(time); + if (text.isPresent()) { + when(post.getText()).thenReturn(text.get()); + } when(database.getPost(eq(id))).thenReturn(of(post)); sonePosts.put(sone, post); + when(post.getReplies()).then(new Answer>() { + @Override + public List answer(InvocationOnMock invocation) throws Throwable { + return Ordering.from(Reply.TIME_COMPARATOR).sortedCopy(postReplies.get(post)); + } + }); + doAnswer(new Answer() { + @Override + public Void answer(InvocationOnMock invocation) throws Throwable { + postLikingSones.put(post, (Sone) invocation.getArguments()[0]); + return null; + } + }).when(post).like(Matchers.any()); + doAnswer(new Answer() { + @Override + public Void answer(InvocationOnMock invocation) throws Throwable { + postLikingSones.remove(post, (Sone) invocation.getArguments()[0]); + return null; + } + }).when(post).unlike(Matchers.any()); + when(post.getLikes()).thenAnswer(new Answer>() { + @Override + public Set answer(InvocationOnMock invocation) throws Throwable { + return postLikingSones.get(post); + } + }); return post; } } + public class PostReplyMocker { + + private final PostReply postReply = mock(PostReply.class); + private final String id; + private final Sone sone; + private Optional post = absent(); + private long time; + private Optional text = absent(); + + public PostReplyMocker(String id, Sone sone) { + this.id = id; + this.sone = sone; + } + + public PostReplyMocker inReplyTo(Post post) { + this.post = fromNullable(post); + return this; + } + + public PostReplyMocker withTime(long time) { + this.time = time; + return this; + } + + public PostReplyMocker withText(String text) { + this.text = fromNullable(text); + return this; + } + + public PostReply create() { + when(postReply.getId()).thenReturn(id); + when(postReply.getSone()).thenReturn(sone); + when(postReply.getTime()).thenReturn(time); + when(database.getPostReply(eq(id))).thenReturn(of(postReply)); + if (post.isPresent()) { + postReplies.put(post.get(), postReply); + } + if (text.isPresent()) { + when(postReply.getText()).thenReturn(text.get()); + } + doAnswer(new Answer() { + @Override + public Void answer(InvocationOnMock invocation) throws Throwable { + postReplyLikingSones.put(postReply, (Sone) invocation.getArguments()[0]); + return null; + } + }).when(postReply).like(Matchers.any()); + doAnswer(new Answer() { + @Override + public Void answer(InvocationOnMock invocation) throws Throwable { + postReplyLikingSones.remove(postReply, invocation.getArguments()[0]); + return null; + } + }).when(postReply).unlike(Matchers.any()); + when(postReply.getLikes()).thenAnswer(new Answer>() { + @Override + public Set answer(InvocationOnMock invocation) throws Throwable { + return postReplyLikingSones.get(postReply); + } + }); + return postReply; + } + } + }