import static com.google.common.collect.Maps.newHashMap;
import static com.google.common.collect.Ordering.from;
import static java.util.Collections.emptySet;
+import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import java.util.Set;
import net.pterodactylus.sone.core.Core;
+import net.pterodactylus.sone.core.Options;
+import net.pterodactylus.sone.core.Options.DefaultOption;
+import net.pterodactylus.sone.core.Preferences;
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.PostBuilder.PostCreated;
import net.pterodactylus.sone.database.PostReplyBuilder;
+import net.pterodactylus.sone.database.PostReplyBuilder.PostReplyCreated;
+import net.pterodactylus.sone.freenet.wot.OwnIdentity;
+import net.pterodactylus.sone.utils.IntegerRangePredicate;
+import net.pterodactylus.sone.web.WebInterface;
+import net.pterodactylus.sone.web.page.FreenetRequest;
+
+import freenet.clients.http.SessionManager.Session;
+import freenet.clients.http.ToadletContext;
+import freenet.support.api.HTTPRequest;
import com.google.common.base.Function;
import com.google.common.base.Optional;
+import com.google.common.base.Predicates;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
private final Multimap<Sone, Post> sonePosts = create();
private final Map<String, Sone> sones = newHashMap();
+ private Optional<Sone> currentSone = absent();
+ private final Map<String, Post> posts = 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) {
return (soneId == null) ? Optional.<Sone>absent() : fromNullable(sones.get(soneId));
}
});
+ Answer<Sone> returnCurrentSone = new Answer<Sone>() {
+ @Override
+ public Sone answer(InvocationOnMock invocation) throws Throwable {
+ return currentSone.orNull();
+ }
+ };
+ when(webInterface.getCurrentSone(any(ToadletContext.class))).then(returnCurrentSone);
+ when(webInterface.getCurrentSone(any(Session.class))).then(returnCurrentSone);
when(core.getSones()).then(new Answer<Collection<Sone>>() {
@Override
public Collection<Sone> answer(InvocationOnMock invocation) throws Throwable {
return sones.values();
}
});
+ when(core.getLocalSone(anyString())).then(new Answer<Optional<Sone>>() {
+ @Override
+ public Optional<Sone> answer(InvocationOnMock invocation) throws Throwable {
+ Sone localSone = sones.get(invocation.getArguments()[0]);
+ return ((localSone == null) || (!localSone.isLocal())) ? Optional.<Sone>absent() : of(localSone);
+ }
+ });
when(core.getLocalSones()).then(new Answer<Collection<Sone>>() {
@Override
public Collection<Sone> answer(InvocationOnMock invocation) throws Throwable {
return FluentIterable.from(sones.values()).filter(Sone.LOCAL_SONE_FILTER).toList();
}
});
+ when(core.postCreated()).thenReturn(Optional.<PostCreated>of(new PostCreated() {
+ @Override
+ public void postCreated(Post post) {
+ posts.put(post.getId(), post);
+ sonePosts.put(post.getSone(), post);
+ }
+ }));
+ when(core.postReplyCreated()).then(new Answer<Optional<PostReplyCreated>>() {
+ @Override
+ public Optional<PostReplyCreated> answer(InvocationOnMock invocation) throws Throwable {
+ return Optional.<PostReplyCreated>of(new PostReplyCreated() {
+ @Override
+ public void postReplyCreated(PostReply postReply) {
+ postReplies.put(postReply.getPost().get(), postReply);
+ }
+ });
+ }
+ });
+ Options options = createOptions();
+ when(core.getPreferences()).thenReturn(new Preferences(options));
when(database.getDirectedPosts(anyString())).then(new Answer<Collection<Post>>() {
@Override
public Collection<Post> answer(InvocationOnMock invocation) throws Throwable {
});
}
+ private Options createOptions() {
+ Options options = new Options();
+ options.addIntegerOption("InsertionDelay", new DefaultOption<Integer>(60, new IntegerRangePredicate(0, Integer.MAX_VALUE)));
+ options.addIntegerOption("PostsPerPage", new DefaultOption<Integer>(10, new IntegerRangePredicate(1, Integer.MAX_VALUE)));
+ options.addIntegerOption("ImagesPerPage", new DefaultOption<Integer>(9, new IntegerRangePredicate(1, Integer.MAX_VALUE)));
+ options.addIntegerOption("CharactersPerPost", new DefaultOption<Integer>(400, Predicates.<Integer>or(new IntegerRangePredicate(50, Integer.MAX_VALUE), Predicates.equalTo(-1))));
+ options.addIntegerOption("PostCutOffLength", new DefaultOption<Integer>(200, Predicates.<Integer>or(new IntegerRangePredicate(50, Integer.MAX_VALUE), Predicates.equalTo(-1))));
+ options.addBooleanOption("RequireFullAccess", new DefaultOption<Boolean>(false));
+ options.addIntegerOption("PositiveTrust", new DefaultOption<Integer>(75, new IntegerRangePredicate(0, 100)));
+ options.addIntegerOption("NegativeTrust", new DefaultOption<Integer>(-25, new IntegerRangePredicate(-100, 100)));
+ options.addStringOption("TrustComment", new DefaultOption<String>("Set from Sone Web Interface"));
+ options.addBooleanOption("ActivateFcpInterface", new DefaultOption<Boolean>(false));
+ options.addIntegerOption("FcpFullAccessRequired", new DefaultOption<Integer>(2));
+ return options;
+ }
+
private static Core mockCore(Database database) {
Core core = mock(Core.class);
when(core.getDatabase()).thenReturn(database);
return core;
}
- private static Database mockDatabase() {
+ private Database mockDatabase() {
Database database = mock(Database.class);
when(database.getSone(anyString())).thenReturn(Optional.<Sone>absent());
- when(database.getPost(anyString())).thenReturn(Optional.<Post>absent());
+ when(database.getPost(anyString())).then(new Answer<Optional<Post>>() {
+ @Override
+ public Optional<Post> answer(InvocationOnMock invocation) throws Throwable {
+ return fromNullable(posts.get(invocation.getArguments()[0]));
+ }
+ });
when(database.getPostReply(anyString())).thenReturn(Optional.<PostReply>absent());
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);
}
return new PostReplyMocker(replyId, sone);
}
+ public FreenetRequest mockRequest(String path) {
+ HTTPRequest httpRequest = mock(HTTPRequest.class);
+ when(httpRequest.getMethod()).thenReturn("GET");
+ when(httpRequest.getPath()).thenReturn(path);
+ FreenetRequest request = mock(FreenetRequest.class);
+ when(request.getHttpRequest()).thenReturn(httpRequest);
+ return request;
+ }
+
public class SoneMocker {
private final Sone mockedSone = mock(Sone.class);
private final String id;
+ private String insertUrI;
private boolean local;
+ private boolean current;
private Optional<String> name = absent();
private long time;
private Profile profile = new Profile(mockedSone);
return this;
}
+ public SoneMocker insertUri(String insertUri) {
+ this.insertUrI = insertUri;
+ return this;
+ }
+
+ public SoneMocker current() {
+ current = true;
+ return this;
+ }
+
public SoneMocker withName(String name) {
this.name = fromNullable(name);
return this;
public Sone create() {
when(mockedSone.getId()).thenReturn(id);
when(mockedSone.isLocal()).thenReturn(local);
+ if (local) {
+ OwnIdentity ownIdentity = mock(OwnIdentity.class);
+ when(ownIdentity.getInsertUri()).thenReturn(insertUrI);
+ when(mockedSone.getIdentity()).thenReturn(ownIdentity);
+ }
+ if (current) {
+ currentSone = of(mockedSone);
+ }
if (name.isPresent()) {
when(mockedSone.getName()).thenReturn(name.get());
}
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;
}
}