package net.pterodactylus.sone.core;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.hamcrest.MockitoHamcrest.argThat;
import net.pterodactylus.sone.core.Core.MarkPostKnown;
import net.pterodactylus.sone.core.Core.MarkReplyKnown;
import net.pterodactylus.sone.core.event.PostRemovedEvent;
import net.pterodactylus.sone.core.event.PostReplyRemovedEvent;
import net.pterodactylus.sone.core.event.SoneRemovedEvent;
import net.pterodactylus.sone.data.Post;
import net.pterodactylus.sone.data.PostReply;
import net.pterodactylus.sone.data.Sone;
import net.pterodactylus.sone.database.Database;
import net.pterodactylus.sone.freenet.wot.Identity;
import net.pterodactylus.sone.freenet.wot.IdentityManager;
import net.pterodactylus.sone.freenet.wot.OwnIdentity;
import net.pterodactylus.sone.freenet.wot.event.IdentityRemovedEvent;
import net.pterodactylus.util.config.Configuration;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.eventbus.EventBus;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeDiagnosingMatcher;
import org.junit.Test;
import org.mockito.InOrder;
/**
* Unit test for {@link Core} and its subclasses.
*
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
public class CoreTest {
@Test
public void markPostKnownMarksPostAsKnown() {
Core core = mock(Core.class);
Post post = mock(Post.class);
MarkPostKnown markPostKnown = core.new MarkPostKnown(post);
markPostKnown.run();
verify(core).markPostKnown(eq(post));
}
@Test
public void markReplyKnownMarksReplyAsKnown() {
Core core = mock(Core.class);
PostReply postReply = mock(PostReply.class);
MarkReplyKnown markReplyKnown = core.new MarkReplyKnown(postReply);
markReplyKnown.run();
verify(core).markReplyKnown(eq(postReply));
}
@Test
public void removingAnIdentitySendsRemovalEventsForAllSoneElements() {
// given
Configuration configuration = mock(Configuration.class);
FreenetInterface freenetInterface = mock(FreenetInterface.class);
IdentityManager identityManager = mock(IdentityManager.class);
SoneDownloader soneDownloader = mock(SoneDownloader.class);
ImageInserter imageInserter = mock(ImageInserter.class);
UpdateChecker updateChecker = mock(UpdateChecker.class);
WebOfTrustUpdater webOfTrustUpdater = mock(WebOfTrustUpdater.class);
EventBus eventBus = mock(EventBus.class);
Database database = mock(Database.class);
Core core = new Core(configuration, freenetInterface, identityManager, soneDownloader, imageInserter, updateChecker, webOfTrustUpdater, eventBus, database);
OwnIdentity ownIdentity = mock(OwnIdentity.class);
Identity identity = mock(Identity.class);
when(identity.getId()).thenReturn("sone-id");
Sone sone = mock(Sone.class);
when(database.getSone("sone-id")).thenReturn(Optional.of(sone));
PostReply postReply1 = mock(PostReply.class);
PostReply postReply2 = mock(PostReply.class);
when(sone.getReplies()).thenReturn(ImmutableSet.of(postReply1, postReply2));
Post post1 = mock(Post.class);
Post post2 = mock(Post.class);
when(sone.getPosts()).thenReturn(ImmutableList.of(post1, post2));
// when
core.identityRemoved(new IdentityRemovedEvent(ownIdentity, identity));
// then
InOrder inOrder = inOrder(eventBus, database);
inOrder.verify(eventBus).post(argThat(isPostReplyRemoved(postReply1)));
inOrder.verify(eventBus).post(argThat(isPostReplyRemoved(postReply2)));
inOrder.verify(eventBus).post(argThat(isPostRemoved(post1)));
inOrder.verify(eventBus).post(argThat(isPostRemoved(post2)));
inOrder.verify(eventBus).post(argThat(isSoneRemoved(sone)));
inOrder.verify(database).removeSone(sone);
}
private Matcher<Object> isPostRemoved(final Post post) {
return new TypeSafeDiagnosingMatcher<Object>() {
@Override
protected boolean matchesSafely(Object item, Description mismatchDescription) {
if (!(item instanceof PostRemovedEvent)) {
mismatchDescription.appendText("is not PostRemovedEvent");
return false;
}
if (((PostRemovedEvent) item).post() != post) {
mismatchDescription.appendText("post is ").appendValue(((PostRemovedEvent) item).post());
return false;
}
return true;
}
@Override
public void describeTo(Description description) {
description.appendText("is PostRemovedEvent and post is ").appendValue(post);
}
};
}
private Matcher<Object> isPostReplyRemoved(final PostReply postReply) {
return new TypeSafeDiagnosingMatcher<Object>() {
@Override
protected boolean matchesSafely(Object item, Description mismatchDescription) {
if (!(item instanceof PostReplyRemovedEvent)) {
mismatchDescription.appendText("is not PostReplyRemovedEvent");
return false;
}
if (((PostReplyRemovedEvent) item).postReply() != postReply) {
mismatchDescription.appendText("post reply is ").appendValue(((PostReplyRemovedEvent) item).postReply());
return false;
}
return true;
}
@Override
public void describeTo(Description description) {
description.appendText("is PostReplyRemovedEvent and post is ").appendValue(postReply);
}
};
}
private Matcher<Object> isSoneRemoved(final Sone sone) {
return new TypeSafeDiagnosingMatcher<Object>() {
@Override
protected boolean matchesSafely(Object item, Description mismatchDescription) {
if (!(item instanceof SoneRemovedEvent)) {
mismatchDescription.appendText("is not SoneRemovedEvent");
return false;
}
if (((SoneRemovedEvent) item).sone() != sone) {
mismatchDescription.appendText("sone is ").appendValue(((SoneRemovedEvent) item).sone());
return false;
}
return true;
}
@Override
public void describeTo(Description description) {
description.appendText("is SoneRemovedEvent and sone is ").appendValue(sone);
}
};
}
}