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 4.4KB

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