🎨 Replace CoreTest with Kotlin version
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / core / CoreTest.kt
diff --git a/src/test/kotlin/net/pterodactylus/sone/core/CoreTest.kt b/src/test/kotlin/net/pterodactylus/sone/core/CoreTest.kt
new file mode 100644 (file)
index 0000000..ff997aa
--- /dev/null
@@ -0,0 +1,138 @@
+package net.pterodactylus.sone.core
+
+import com.google.common.collect.*
+import com.google.common.eventbus.*
+import net.pterodactylus.sone.core.event.*
+import net.pterodactylus.sone.data.*
+import net.pterodactylus.sone.database.*
+import net.pterodactylus.sone.freenet.wot.*
+import net.pterodactylus.sone.freenet.wot.event.*
+import net.pterodactylus.sone.test.*
+import net.pterodactylus.util.config.*
+import org.hamcrest.*
+import org.junit.*
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.Mockito.inOrder
+import org.mockito.Mockito.verify
+import org.mockito.hamcrest.MockitoHamcrest.*
+
+/**
+ * Unit test for [Core] and its subclasses.
+ */
+class CoreTest {
+
+       @Test
+       fun `mark post known marks post as known`() {
+               val core = mock<Core>()
+               val post = mock<Post>()
+               core.MarkPostKnown(post).run()
+               verify(core).markPostKnown(eq(post))
+       }
+
+       @Test
+       fun `mark reply known marks reply as known`() {
+               val core = mock<Core>()
+               val postReply = mock<PostReply>()
+               core.MarkReplyKnown(postReply).run()
+               verify(core).markReplyKnown(eq(postReply))
+       }
+
+       @Test
+       fun `removing an identity sends removal events for all sone elements`() {
+               // given
+               val configuration = mock<Configuration>()
+               val freenetInterface = mock<FreenetInterface>()
+               val identityManager = mock<IdentityManager>()
+               val soneDownloader = mock<SoneDownloader>()
+               val imageInserter = mock<ImageInserter>()
+               val updateChecker = mock<UpdateChecker>()
+               val webOfTrustUpdater = mock<WebOfTrustUpdater>()
+               val eventBus = mock<EventBus>()
+               val database = mock<Database>()
+               val core = Core(configuration, freenetInterface, identityManager, soneDownloader, imageInserter, updateChecker, webOfTrustUpdater, eventBus, database)
+               val ownIdentity = mock<OwnIdentity>()
+               val identity = mock<Identity>()
+               whenever(identity.id).thenReturn("sone-id")
+               val sone = mock<Sone>()
+               whenever(database.getSone("sone-id")).thenReturn(sone)
+               val postReply1 = mock<PostReply>()
+               val postReply2 = mock<PostReply>()
+               whenever(sone.replies).thenReturn(ImmutableSet.of(postReply1, postReply2))
+               val post1 = mock<Post>()
+               val post2 = mock<Post>()
+               whenever(sone.posts).thenReturn(ImmutableList.of(post1, post2))
+
+               // when
+               core.identityRemoved(IdentityRemovedEvent(ownIdentity, identity))
+
+               // then
+               val 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 fun isPostRemoved(post: Post): Matcher<Any> {
+               return object : TypeSafeDiagnosingMatcher<Any>() {
+                       override fun matchesSafely(item: Any, mismatchDescription: Description): Boolean {
+                               if (item !is PostRemovedEvent) {
+                                       mismatchDescription.appendText("is not PostRemovedEvent")
+                                       return false
+                               }
+                               if (item.post !== post) {
+                                       mismatchDescription.appendText("post is ").appendValue(item.post)
+                                       return false
+                               }
+                               return true
+                       }
+
+                       override fun describeTo(description: Description) {
+                               description.appendText("is PostRemovedEvent and post is ").appendValue(post)
+                       }
+               }
+       }
+
+       private fun isPostReplyRemoved(postReply: PostReply): Matcher<Any> {
+               return object : TypeSafeDiagnosingMatcher<Any>() {
+                       override fun matchesSafely(item: Any, mismatchDescription: Description): Boolean {
+                               if (item !is PostReplyRemovedEvent) {
+                                       mismatchDescription.appendText("is not PostReplyRemovedEvent")
+                                       return false
+                               }
+                               if (item.postReply !== postReply) {
+                                       mismatchDescription.appendText("post reply is ").appendValue(item.postReply)
+                                       return false
+                               }
+                               return true
+                       }
+
+                       override fun describeTo(description: Description) {
+                               description.appendText("is PostReplyRemovedEvent and post is ").appendValue(postReply)
+                       }
+               }
+       }
+
+       private fun isSoneRemoved(sone: Sone): Matcher<Any> {
+               return object : TypeSafeDiagnosingMatcher<Any>() {
+                       override fun matchesSafely(item: Any, mismatchDescription: Description): Boolean {
+                               if (item !is SoneRemovedEvent) {
+                                       mismatchDescription.appendText("is not SoneRemovedEvent")
+                                       return false
+                               }
+                               if (item.sone !== sone) {
+                                       mismatchDescription.appendText("sone is ").appendValue(item.sone)
+                                       return false
+                               }
+                               return true
+                       }
+
+                       override fun describeTo(description: Description) {
+                               description.appendText("is SoneRemovedEvent and sone is ").appendValue(sone)
+                       }
+               }
+       }
+
+}