package com.dmdirc.ktirc.io import com.dmdirc.ktirc.IrcClient import com.dmdirc.ktirc.TestConstants import com.dmdirc.ktirc.handlers.EventHandler import com.dmdirc.ktirc.events.ServerConnected import com.dmdirc.ktirc.events.ServerReady import com.dmdirc.ktirc.events.ServerWelcome import com.dmdirc.ktirc.messages.MessageProcessor import com.dmdirc.ktirc.model.IrcMessage import com.nhaarman.mockitokotlin2.* import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.runBlocking import org.junit.jupiter.api.Test internal class MessageHandlerTest { private val ircClient = mock() private val nickProcessor = mock { on { commands } doReturn arrayOf("FOO", "NICK") } private val joinProcessor = mock { on { commands } doReturn arrayOf("BAR", "JOIN") } @Test fun `MessageHandler passes message on to correct processor`() = runBlocking { val handler = MessageHandler(listOf(joinProcessor, nickProcessor), mutableListOf()) val message = IrcMessage(emptyMap(), null, "JOIN", emptyList()) with(Channel(1)) { send(message) close() handler.processMessages(ircClient, this) } verify(joinProcessor).process(message) } @Test fun `MessageHandler reads multiple messages`() = runBlocking { val handler = MessageHandler(listOf(joinProcessor, nickProcessor), mutableListOf()) val joinMessage = IrcMessage(emptyMap(), null, "JOIN", emptyList()) val nickMessage = IrcMessage(emptyMap(), null, "NICK", emptyList()) val otherMessage = IrcMessage(emptyMap(), null, "OTHER", emptyList()) with(Channel(3)) { send(joinMessage) send(nickMessage) send(otherMessage) close() handler.processMessages(ircClient, this) } with(inOrder(joinProcessor, nickProcessor)) { verify(joinProcessor).process(joinMessage) verify(nickProcessor).process(nickMessage) } } @Test fun `MessageHandler invokes all event handler with all returned events`() = runBlocking { val eventHandler1 = mock() val eventHandler2 = mock() val handler = MessageHandler(listOf(joinProcessor, nickProcessor), mutableListOf(eventHandler1, eventHandler2)) val joinMessage = IrcMessage(emptyMap(), null, "JOIN", emptyList()) whenever(joinProcessor.process(any())).thenReturn(listOf(ServerConnected(TestConstants.time), ServerWelcome(TestConstants.time, "the.gibson", "acidBurn"))) with(Channel(1)) { send(joinMessage) close() handler.processMessages(ircClient, this) } verify(eventHandler1).processEvent(same(ircClient), isA()) verify(eventHandler1).processEvent(same(ircClient), isA()) verify(eventHandler2).processEvent(same(ircClient), isA()) verify(eventHandler2).processEvent(same(ircClient), isA()) } @Test fun `MessageHandler emits custom events to all handlers`() = runBlocking { val eventHandler1 = mock() val eventHandler2 = mock() val handler = MessageHandler(emptyList(), mutableListOf(eventHandler1, eventHandler2)) handler.emitEvent(ircClient, ServerWelcome(TestConstants.time, "the.gibson", "acidBurn")) verify(eventHandler1).processEvent(same(ircClient), isA()) verify(eventHandler2).processEvent(same(ircClient), isA()) } @Test fun `MessageHandler emits events returned from handler`() = runBlocking { val eventHandler1 = mock { on { processEvent(any(), isA()) } doReturn listOf(ServerReady(TestConstants.time)) } val eventHandler2 = mock() val handler = MessageHandler(emptyList(), mutableListOf(eventHandler1, eventHandler2)) handler.emitEvent(ircClient, ServerWelcome(TestConstants.time, "the.gibson", "acidBurn")) verify(eventHandler1).processEvent(same(ircClient), isA()) verify(eventHandler2).processEvent(same(ircClient), isA()) } }