X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Ftest%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2Fnotification%2FNotificationHandlerModuleTest.kt;h=27f396f25bcea22803eb0657aae505d3a7ce97d8;hp=a06123071649f7341cc0090af1cbbbfe7b78c747;hb=79ef6e4644845290d9feb45a06f8588864dd0a83;hpb=b31f0234988a509ca831785c87433ab264374d0a diff --git a/src/test/kotlin/net/pterodactylus/sone/web/notification/NotificationHandlerModuleTest.kt b/src/test/kotlin/net/pterodactylus/sone/web/notification/NotificationHandlerModuleTest.kt index a061230..27f396f 100644 --- a/src/test/kotlin/net/pterodactylus/sone/web/notification/NotificationHandlerModuleTest.kt +++ b/src/test/kotlin/net/pterodactylus/sone/web/notification/NotificationHandlerModuleTest.kt @@ -25,15 +25,21 @@ import net.pterodactylus.sone.core.event.* import net.pterodactylus.sone.data.* import net.pterodactylus.sone.data.Post.* import net.pterodactylus.sone.data.impl.* +import net.pterodactylus.sone.database.* +import net.pterodactylus.sone.freenet.wot.* import net.pterodactylus.sone.main.* import net.pterodactylus.sone.notify.* import net.pterodactylus.sone.test.* +import net.pterodactylus.sone.text.* import net.pterodactylus.sone.utils.* import net.pterodactylus.util.notify.* import org.hamcrest.MatcherAssert.* import org.hamcrest.Matchers.* +import org.mockito.* import org.mockito.Mockito.* -import java.io.* +import java.util.concurrent.* +import java.util.concurrent.TimeUnit.* +import java.util.function.* import kotlin.test.* /** @@ -42,12 +48,18 @@ import kotlin.test.* class NotificationHandlerModuleTest { private val core = mock() + private val webOfTrustConnector = mock() + private val ticker = mock() private val notificationManager = NotificationManager() private val loaders = TestLoaders() private val injector: Injector = createInjector( Core::class.isProvidedBy(core), NotificationManager::class.isProvidedBy(notificationManager), Loaders::class.isProvidedBy(loaders), + WebOfTrustConnector::class.isProvidedBy(webOfTrustConnector), + ScheduledExecutorService::class.withNameIsProvidedBy(ticker, "notification"), + SoneTextParser::class.isProvidedByMock(), + PostReplyProvider::class.isProvidedByMock(), NotificationHandlerModule() ) @@ -63,9 +75,7 @@ class NotificationHandlerModuleTest { @Test fun `mark-post-known-during-first-start handler is created with correct action`() { - notificationManager.addNotification(object : AbstractNotification("first-start-notification") { - override fun render(writer: Writer?) = Unit - }) + notificationManager.firstStart() val handler = injector.getInstance() val post = mock() handler.newPostFound(NewPostFoundEvent(post)) @@ -73,6 +83,20 @@ class NotificationHandlerModuleTest { } @Test + fun `mark-post-reply-known-during-first-start handler is created as singleton`() { + injector.verifySingletonInstance() + } + + @Test + fun `mark-post-reply-known-during-first-start handler is created with correct action`() { + notificationManager.firstStart() + val handler = injector.getInstance() + val postReply = mock() + handler.newPostReply(NewPostReplyFoundEvent(postReply)) + verify(core).markReplyKnown(postReply) + } + + @Test fun `sone-locked-on-startup handler is created as singleton`() { injector.verifySingletonInstance() } @@ -158,6 +182,35 @@ class NotificationHandlerModuleTest { } @Test + fun `remote-post handler is created as singleton`() { + injector.verifySingletonInstance() + } + + @Test + fun `new-remote-post-reply notification is created as singleton`() { + injector.verifySingletonInstance>(named("newRemotePostReply")) + } + + @Test + fun `new-remote-post-reply notification has correct ID`() { + assertThat(injector.getInstance>(named("newRemotePostReply")).id, equalTo("new-reply-notification")) + } + + @Test + fun `new-remote-post-reply notification is not dismissable`() { + assertThat(injector.getInstance>(named("newRemotePostReply")).isDismissable, equalTo(false)) + } + + @Test + fun `new-remote-post-reply notification has correct key and template`() { + loaders.templates += "/templates/notify/newReplyNotification.html" to "<% replies>".asTemplate() + val notification = injector.getInstance>(named("newRemotePostReply")) + val postReplies = listOf(emptyPostReply(), emptyPostReply()) + postReplies.forEach(notification::add) + assertThat(notification.render(), equalTo(postReplies.toString())) + } + + @Test fun `sone-locked notification is created as singleton`() { injector.verifySingletonInstance>(named("soneLocked")) } @@ -216,6 +269,35 @@ class NotificationHandlerModuleTest { } @Test + fun `local-reply notification is not dismissable`() { + assertThat(injector.getInstance>(named("localReply")).isDismissable, equalTo(false)) + } + + @Test + fun `local-reply notification has correct ID`() { + assertThat(injector.getInstance>(named("localReply")).id, equalTo("local-reply-notification")) + } + + @Test + fun `local-reply notification has correct key and template`() { + loaders.templates += "/templates/notify/newReplyNotification.html" to "<% replies>".asTemplate() + val notification = injector.getInstance>(named("localReply")) + val replies = listOf(emptyPostReply("reply1"), emptyPostReply("reply2")) + replies.forEach(notification::add) + assertThat(notification.render(), equalTo(replies.toString())) + } + + @Test + fun `local-reply notification is created as singleton`() { + injector.verifySingletonInstance>(named("localReply")) + } + + @Test + fun `local-reply handler is created as singleton`() { + injector.verifySingletonInstance() + } + + @Test fun `new-version notification is created as singleton`() { injector.verifySingletonInstance(named("newVersion")) } @@ -370,4 +452,114 @@ class NotificationHandlerModuleTest { injector.verifySingletonInstance() } + @Test + fun `startup notification can be created`() { + injector.verifySingletonInstance(named("startup")) + } + + @Test + fun `startup notification has correct ID`() { + assertThat(injector.getInstance(named("startup")).id, equalTo("startup-notification")) + } + + @Test + fun `startup notification is dismissable`() { + assertThat(injector.getInstance(named("startup")).isDismissable, equalTo(true)) + } + + @Test + fun `startup notification loads correct template`() { + loaders.templates += "/templates/notify/startupNotification.html" to "1".asTemplate() + val notification = injector.getInstance(named("startup")) + assertThat(notification.render(), equalTo("1")) + } + + @Test + fun `startup handler is created as singleton`() { + injector.verifySingletonInstance() + } + + @Test + fun `web-of-trust notification is created as singleton`() { + injector.verifySingletonInstance(named("webOfTrust")) + } + + @Test + fun `web-of-trust notification has correct ID`() { + assertThat(injector.getInstance(named("webOfTrust")).id, equalTo("wot-missing-notification")) + } + + @Test + fun `web-of-trust notification is dismissable`() { + assertThat(injector.getInstance(named("webOfTrust")).isDismissable, equalTo(true)) + } + + @Test + fun `web-of-trust notification loads correct template`() { + loaders.templates += "/templates/notify/wotMissingNotification.html" to "1".asTemplate() + val notification = injector.getInstance(named("webOfTrust")) + assertThat(notification.render(), equalTo("1")) + } + + @Test + fun `web-of-trust handler is created as singleton`() { + injector.verifySingletonInstance(named("webOfTrust")) + } + + @Test + fun `web-of-trust reacher is created as singleton`() { + injector.verifySingletonInstance(named("webOfTrustReacher")) + } + + @Test + fun `web-of-trust reacher access the wot connector`() { + injector.getInstance(named("webOfTrustReacher")).run() + verify(webOfTrustConnector).ping() + } + + @Test + fun `web-of-trust reschedule is created as singleton`() { + injector.verifySingletonInstance>(named("webOfTrustReschedule")) + } + + @Test + fun `web-of-trust reschedule schedules at the correct delay`() { + val webOfTrustPinger = injector.getInstance() + injector.getInstance>(named("webOfTrustReschedule"))(webOfTrustPinger) + verify(ticker).schedule(ArgumentMatchers.eq(webOfTrustPinger), ArgumentMatchers.eq(15L), ArgumentMatchers.eq(SECONDS)) + } + + @Test + fun `sone mention detector is created as singleton`() { + assertThat(injector.getInstance(), notNullValue()) + } + + @Test + fun `sone-mentioned notification is created as singleton`() { + injector.verifySingletonInstance>(named("soneMentioned")) + } + + @Test + fun `sone-mentioned notification has correct ID`() { + assertThat(injector.getInstance>(named("soneMentioned")).id, equalTo("mention-notification")) + } + + @Test + fun `sone-mentioned notification is not dismissable`() { + assertThat(injector.getInstance>(named("soneMentioned")).isDismissable, equalTo(false)) + } + + @Test + fun `sone-mentioned notification loads correct template`() { + loaders.templates += "/templates/notify/mentionNotification.html" to "<% posts>".asTemplate() + val notification = injector.getInstance>(named("soneMentioned")) + val posts = listOf(EmptyPost("1"), EmptyPost("2")).onEach(notification::add) + assertThat(notification.render(), equalTo(posts.toString())) + } + + @Test + fun `sone-mentioned handler is created as singleton`() { + injector.verifySingletonInstance() + } + }