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.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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.processors.MessageProcessor
  8. import com.dmdirc.ktirc.model.IrcMessage
  9. import io.mockk.*
  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 = mockk<IrcClient>()
  15. private val nickProcessor = mockk<MessageProcessor> {
  16. every { commands } returns arrayOf("FOO", "NICK")
  17. every { process(any()) } returns emptyList()
  18. }
  19. private val joinProcessor = mockk<MessageProcessor> {
  20. every { commands } returns arrayOf("BAR", "JOIN")
  21. every { process(any()) } returns emptyList()
  22. }
  23. private val eventHandler1 = mockk<EventHandler>()
  24. private val eventHandler2 = mockk<EventHandler>()
  25. @Test
  26. fun `passes message on to correct processor`() = runBlocking {
  27. val handler = MessageHandler(listOf(joinProcessor, nickProcessor), emptyList(), mutableListOf())
  28. val message = IrcMessage(emptyMap(), null, "JOIN", emptyList())
  29. with(Channel<IrcMessage>(1)) {
  30. send(message)
  31. close()
  32. handler.processMessages(ircClient, this)
  33. }
  34. verify {
  35. joinProcessor.process(message)
  36. }
  37. }
  38. @Test
  39. fun `reads multiple messages`() = runBlocking {
  40. val handler = MessageHandler(listOf(joinProcessor, nickProcessor), emptyList(), mutableListOf())
  41. val joinMessage = IrcMessage(emptyMap(), null, "JOIN", emptyList())
  42. val nickMessage = IrcMessage(emptyMap(), null, "NICK", emptyList())
  43. val otherMessage = IrcMessage(emptyMap(), null, "OTHER", emptyList())
  44. with(Channel<IrcMessage>(3)) {
  45. send(joinMessage)
  46. send(nickMessage)
  47. send(otherMessage)
  48. close()
  49. handler.processMessages(ircClient, this)
  50. }
  51. verifyOrder {
  52. joinProcessor.process(joinMessage)
  53. nickProcessor.process(nickMessage)
  54. }
  55. }
  56. @Test
  57. fun `invokes all event handler with all returned events`() = runBlocking {
  58. val handler = MessageHandler(listOf(joinProcessor, nickProcessor), emptyList(), mutableListOf(eventHandler1, eventHandler2))
  59. val joinMessage = IrcMessage(emptyMap(), null, "JOIN", emptyList())
  60. every { joinProcessor.process(any()) } returns listOf(ServerConnected(EventMetadata(TestConstants.time)), ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"))
  61. with(Channel<IrcMessage>(1)) {
  62. send(joinMessage)
  63. close()
  64. handler.processMessages(ircClient, this)
  65. }
  66. verify {
  67. eventHandler1.processEvent(refEq(ircClient), ofType<ServerConnected>())
  68. eventHandler1.processEvent(refEq(ircClient), ofType<ServerWelcome>())
  69. eventHandler2.processEvent(refEq(ircClient), ofType<ServerConnected>())
  70. eventHandler2.processEvent(refEq(ircClient), ofType<ServerWelcome>())
  71. }
  72. }
  73. @Test
  74. fun `sends custom events to all handlers`() {
  75. val handler = MessageHandler(emptyList(), emptyList(), mutableListOf(eventHandler1, eventHandler2))
  76. handler.handleEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"))
  77. verify {
  78. eventHandler1.processEvent(refEq(ircClient), ofType<ServerWelcome>())
  79. eventHandler2.processEvent(refEq(ircClient), ofType<ServerWelcome>())
  80. }
  81. }
  82. @Test
  83. fun `sends custom events to all emitters`() {
  84. val handler = MessageHandler(emptyList(), emptyList(), emptyList())
  85. val emitter1 = mockk<(IrcEvent) -> Unit> {
  86. every { this@mockk(any<IrcEvent>()) } just Runs
  87. }
  88. val emitter2 = mockk<(IrcEvent) -> Unit> {
  89. every { this@mockk(any<IrcEvent>()) } just Runs
  90. }
  91. handler.addEmitter(emitter1)
  92. handler.addEmitter(emitter2)
  93. handler.handleEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"))
  94. verify {
  95. emitter1(ofType<ServerWelcome>())
  96. emitter2(ofType<ServerWelcome>())
  97. }
  98. }
  99. @Test
  100. fun `sends events to handlers but not mutators or emitters if process only is true`() {
  101. val mutator = mockk<EventMutator>()
  102. val handler = MessageHandler(emptyList(), listOf(mutator), listOf(eventHandler1, eventHandler2))
  103. val emitter = mockk<(IrcEvent) -> Unit>()
  104. handler.addEmitter(emitter)
  105. handler.handleEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"), true)
  106. verify {
  107. eventHandler1.processEvent(refEq(ircClient), ofType<ServerWelcome>())
  108. eventHandler2.processEvent(refEq(ircClient), ofType<ServerWelcome>())
  109. }
  110. verify(inverse = true) {
  111. emitter.invoke(any())
  112. mutator.mutateEvent(any(), any(), any())
  113. }
  114. }
  115. @Test
  116. fun `mutates events in order`() {
  117. val eventMutator1 = mockk<EventMutator> {
  118. every { mutateEvent(any(), any(), ofType<ServerWelcome>()) } returns listOf(ServerReady(EventMetadata(TestConstants.time)))
  119. }
  120. val eventMutator2 = mockk<EventMutator> {
  121. every { mutateEvent(any(), any(), ofType<ServerReady>()) } returns listOf(ServerConnected(EventMetadata(TestConstants.time)))
  122. }
  123. val eventHandler = mockk<EventHandler>()
  124. val handler = MessageHandler(emptyList(), listOf(eventMutator1, eventMutator2), mutableListOf(eventHandler))
  125. handler.handleEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"))
  126. verifyAll {
  127. eventMutator1.mutateEvent(refEq(ircClient), refEq(handler), ofType<ServerWelcome>())
  128. eventMutator2.mutateEvent(refEq(ircClient), refEq(handler), ofType<ServerReady>())
  129. eventHandler.processEvent(refEq(ircClient), ofType<ServerConnected>())
  130. }
  131. }
  132. @Test
  133. fun `allows mutators to fan out events`() {
  134. val eventMutator1 = mockk<EventMutator> {
  135. every { mutateEvent(any(), any(), ofType<ServerWelcome>()) } returns listOf(
  136. ServerReady(EventMetadata(TestConstants.time)),
  137. ServerConnected(EventMetadata(TestConstants.time))
  138. )
  139. }
  140. val eventMutator2 = mockk<EventMutator> {
  141. every { mutateEvent(any(), any(), ofType<ServerReady>()) } returns listOf(ServerReady(EventMetadata(TestConstants.time)))
  142. every { mutateEvent(any(), any(), ofType<ServerConnected>()) } returns listOf(ServerConnected(EventMetadata(TestConstants.time)))
  143. }
  144. val eventHandler = mockk<EventHandler>()
  145. val handler = MessageHandler(emptyList(), listOf(eventMutator1, eventMutator2), mutableListOf(eventHandler))
  146. handler.handleEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"))
  147. verifyOrder {
  148. eventMutator2.mutateEvent(refEq(ircClient), refEq(handler), ofType<ServerReady>())
  149. eventMutator2.mutateEvent(refEq(ircClient), refEq(handler), ofType<ServerConnected>())
  150. eventHandler.processEvent(refEq(ircClient), ofType<ServerReady>())
  151. eventHandler.processEvent(refEq(ircClient), ofType<ServerConnected>())
  152. }
  153. }
  154. @Test
  155. fun `allows mutators to suppress events`() {
  156. val eventMutator1 = mockk<EventMutator> {
  157. every { mutateEvent(any(), any(), ofType<ServerWelcome>()) } returns emptyList()
  158. }
  159. val eventMutator2 = mockk<EventMutator>()
  160. val eventHandler = mockk<EventHandler>()
  161. val handler = MessageHandler(emptyList(), listOf(eventMutator1, eventMutator2), mutableListOf(eventHandler))
  162. handler.handleEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn"))
  163. verify(inverse = true) {
  164. eventMutator2.mutateEvent(any(), refEq(handler), any())
  165. eventHandler.processEvent(any(), any())
  166. }
  167. }
  168. }