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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package com.dmdirc.ktirc.io
  2. import com.dmdirc.ktirc.IrcClient
  3. import com.dmdirc.ktirc.TestConstants
  4. import com.dmdirc.ktirc.events.*
  5. import com.dmdirc.ktirc.events.handlers.EventHandler
  6. import com.dmdirc.ktirc.events.mutators.EventMutator
  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 `passes message on to correct processor`() = runBlocking<Unit> {
  23. val handler = MessageHandler(listOf(joinProcessor, nickProcessor), emptyList(), 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 `reads multiple messages`() = runBlocking<Unit> {
  34. val handler = MessageHandler(listOf(joinProcessor, nickProcessor), emptyList(), 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 `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), emptyList(), mutableListOf(eventHandler1, eventHandler2))
  55. val joinMessage = IrcMessage(emptyMap(), null, "JOIN", emptyList())
  56. whenever(joinProcessor.process(any())).thenReturn(listOf(ServerConnected(EventMetadata(TestConstants.time)), ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn")))
  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 `sends custom events to all handlers`() {
  69. val eventHandler1 = mock<EventHandler>()
  70. val eventHandler2 = mock<EventHandler>()
  71. val handler = MessageHandler(emptyList(), emptyList(), mutableListOf(eventHandler1, eventHandler2))
  72. handler.handleEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"))
  73. verify(eventHandler1).processEvent(same(ircClient), isA<ServerWelcome>())
  74. verify(eventHandler2).processEvent(same(ircClient), isA<ServerWelcome>())
  75. }
  76. @Test
  77. fun `sends custom events to all emitters`() {
  78. val handler = MessageHandler(emptyList(), emptyList(), emptyList())
  79. val emitter1 = mock<(IrcEvent) -> Unit>()
  80. val emitter2 = mock<(IrcEvent) -> Unit>()
  81. handler.addEmitter(emitter1)
  82. handler.addEmitter(emitter2)
  83. handler.handleEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"))
  84. verify(emitter1).invoke(isA<ServerWelcome>())
  85. verify(emitter2).invoke(isA<ServerWelcome>())
  86. }
  87. @Test
  88. fun `sends events to handlers but not mutators or emitters if process only is true`() {
  89. val mutator = mock<EventMutator>()
  90. val eventHandler1 = mock<EventHandler>()
  91. val eventHandler2 = mock<EventHandler>()
  92. val handler = MessageHandler(emptyList(), listOf(mutator), listOf(eventHandler1, eventHandler2))
  93. val emitter = mock<(IrcEvent) -> Unit>()
  94. handler.addEmitter(emitter)
  95. handler.handleEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"), true)
  96. verify(eventHandler1).processEvent(same(ircClient), isA<ServerWelcome>())
  97. verify(eventHandler2).processEvent(same(ircClient), isA<ServerWelcome>())
  98. verify(emitter, never()).invoke(any())
  99. verify(mutator, never()).mutateEvent(any(), any(), any())
  100. }
  101. @Test
  102. fun `mutates events in order`() {
  103. val eventMutator1 = mock<EventMutator> {
  104. on { mutateEvent(any(), any(), isA<ServerWelcome>()) } doReturn listOf(ServerReady(EventMetadata(TestConstants.time)))
  105. }
  106. val eventMutator2 = mock<EventMutator> {
  107. on { mutateEvent(any(), any(), isA<ServerReady>()) } doReturn listOf(ServerConnected(EventMetadata(TestConstants.time)))
  108. }
  109. val eventHandler = mock<EventHandler>()
  110. val handler = MessageHandler(emptyList(), listOf(eventMutator1, eventMutator2), mutableListOf(eventHandler))
  111. handler.handleEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"))
  112. verify(eventMutator1).mutateEvent(same(ircClient), same(handler), isA<ServerWelcome>())
  113. verify(eventMutator2).mutateEvent(same(ircClient), same(handler), isA<ServerReady>())
  114. verify(eventHandler).processEvent(same(ircClient), isA<ServerConnected>())
  115. verifyNoMoreInteractions(eventHandler)
  116. }
  117. @Test
  118. fun `allows mutators to fan out events`() {
  119. val eventMutator1 = mock<EventMutator> {
  120. on { mutateEvent(any(), any(), isA<ServerWelcome>()) } doReturn listOf(
  121. ServerReady(EventMetadata(TestConstants.time)),
  122. ServerConnected(EventMetadata(TestConstants.time))
  123. )
  124. }
  125. val eventMutator2 = mock<EventMutator> {
  126. on { mutateEvent(any(), any(), isA<ServerReady>()) } doReturn listOf(ServerReady(EventMetadata(TestConstants.time)))
  127. on { mutateEvent(any(), any(), isA<ServerConnected>()) } doReturn listOf(ServerConnected(EventMetadata(TestConstants.time)))
  128. }
  129. val eventHandler = mock<EventHandler>()
  130. val handler = MessageHandler(emptyList(), listOf(eventMutator1, eventMutator2), mutableListOf(eventHandler))
  131. handler.handleEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"))
  132. with(inOrder(eventMutator2, eventHandler)) {
  133. verify(eventMutator2).mutateEvent(same(ircClient), same(handler), isA<ServerReady>())
  134. verify(eventMutator2).mutateEvent(same(ircClient), same(handler), isA<ServerConnected>())
  135. verify(eventHandler).processEvent(same(ircClient), isA<ServerReady>())
  136. verify(eventHandler).processEvent(same(ircClient), isA<ServerConnected>())
  137. }
  138. }
  139. @Test
  140. fun `allows mutators to suppress events`() {
  141. val eventMutator1 = mock<EventMutator> {
  142. on { mutateEvent(any(), any(), isA<ServerWelcome>()) } doReturn emptyList()
  143. }
  144. val eventMutator2 = mock<EventMutator>()
  145. val eventHandler = mock<EventHandler>()
  146. val handler = MessageHandler(emptyList(), listOf(eventMutator1, eventMutator2), mutableListOf(eventHandler))
  147. handler.handleEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"))
  148. verify(eventMutator2, never()).mutateEvent(any(), same(handler), any())
  149. verify(eventHandler, never()).processEvent(any(), any())
  150. }
  151. }