You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MessageHandlerTest.kt 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package com.dmdirc.ktirc.io
  2. import com.dmdirc.ktirc.IrcClient
  3. import com.dmdirc.ktirc.TestConstants
  4. import com.dmdirc.ktirc.events.EventHandler
  5. import com.dmdirc.ktirc.events.ServerConnected
  6. import com.dmdirc.ktirc.events.ServerWelcome
  7. import com.dmdirc.ktirc.messages.MessageProcessor
  8. import com.dmdirc.ktirc.model.IrcMessage
  9. import com.nhaarman.mockitokotlin2.*
  10. import kotlinx.coroutines.channels.Channel
  11. import kotlinx.coroutines.runBlocking
  12. import org.junit.jupiter.api.Test
  13. internal class MessageHandlerTest {
  14. private val ircClient = mock<IrcClient>()
  15. private val nickProcessor = mock<MessageProcessor> {
  16. on { commands } doReturn arrayOf("FOO", "NICK")
  17. }
  18. private val joinProcessor = mock<MessageProcessor> {
  19. on { commands } doReturn arrayOf("BAR", "JOIN")
  20. }
  21. @Test
  22. fun `MessageHandler passes message on to correct processor`() = runBlocking<Unit> {
  23. val handler = MessageHandler(listOf(joinProcessor, nickProcessor), mutableListOf())
  24. val message = IrcMessage(emptyMap(), null, "JOIN", emptyList())
  25. with(Channel<IrcMessage>(1)) {
  26. send(message)
  27. close()
  28. handler.processMessages(ircClient, this)
  29. }
  30. verify(joinProcessor).process(message)
  31. }
  32. @Test
  33. fun `MessageHandler reads multiple messages`() = runBlocking<Unit> {
  34. val handler = MessageHandler(listOf(joinProcessor, nickProcessor), mutableListOf())
  35. val joinMessage = IrcMessage(emptyMap(), null, "JOIN", emptyList())
  36. val nickMessage = IrcMessage(emptyMap(), null, "NICK", emptyList())
  37. val otherMessage = IrcMessage(emptyMap(), null, "OTHER", emptyList())
  38. with(Channel<IrcMessage>(3)) {
  39. send(joinMessage)
  40. send(nickMessage)
  41. send(otherMessage)
  42. close()
  43. handler.processMessages(ircClient, this)
  44. }
  45. with(inOrder(joinProcessor, nickProcessor)) {
  46. verify(joinProcessor).process(joinMessage)
  47. verify(nickProcessor).process(nickMessage)
  48. }
  49. }
  50. @Test
  51. fun `MessageHandler invokes all event handler with all returned events`() = runBlocking {
  52. val eventHandler1 = mock<EventHandler>()
  53. val eventHandler2 = mock<EventHandler>()
  54. val handler = MessageHandler(listOf(joinProcessor, nickProcessor), mutableListOf(eventHandler1, eventHandler2))
  55. val joinMessage = IrcMessage(emptyMap(), null, "JOIN", emptyList())
  56. whenever(joinProcessor.process(any())).thenReturn(listOf(ServerConnected(TestConstants.time), ServerWelcome(TestConstants.time, "abc")))
  57. with(Channel<IrcMessage>(1)) {
  58. send(joinMessage)
  59. close()
  60. handler.processMessages(ircClient, this)
  61. }
  62. verify(eventHandler1).processEvent(same(ircClient), isA<ServerConnected>())
  63. verify(eventHandler1).processEvent(same(ircClient), isA<ServerWelcome>())
  64. verify(eventHandler2).processEvent(same(ircClient), isA<ServerConnected>())
  65. verify(eventHandler2).processEvent(same(ircClient), isA<ServerWelcome>())
  66. }
  67. @Test
  68. fun `MessageHandler emits custom events to all handlers`() = runBlocking {
  69. val eventHandler1 = mock<EventHandler>()
  70. val eventHandler2 = mock<EventHandler>()
  71. val handler = MessageHandler(emptyList(), mutableListOf(eventHandler1, eventHandler2))
  72. handler.emitEvent(ircClient, ServerWelcome(TestConstants.time, "abc"))
  73. verify(eventHandler1).processEvent(same(ircClient), isA<ServerWelcome>())
  74. verify(eventHandler2).processEvent(same(ircClient), isA<ServerWelcome>())
  75. }
  76. }