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.

BatchMutatorTest.kt 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package com.dmdirc.ktirc.events.mutators
  2. import com.dmdirc.ktirc.IrcClient
  3. import com.dmdirc.ktirc.TestConstants
  4. import com.dmdirc.ktirc.events.*
  5. import com.dmdirc.ktirc.io.MessageEmitter
  6. import com.dmdirc.ktirc.model.Batch
  7. import com.dmdirc.ktirc.model.ServerState
  8. import com.dmdirc.ktirc.model.User
  9. import io.mockk.every
  10. import io.mockk.mockk
  11. import io.mockk.verify
  12. import org.junit.jupiter.api.Assertions.*
  13. import org.junit.jupiter.api.Test
  14. internal class BatchMutatorTest {
  15. private val mutator = BatchMutator()
  16. private val messageEmitter = mockk<MessageEmitter>()
  17. private val fakeServerState = ServerState("", "")
  18. private val ircClient = mockk<IrcClient> {
  19. every { serverState } returns fakeServerState
  20. }
  21. @Test
  22. fun `returns non-batched events unmodified`() {
  23. val event = ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn")
  24. val events = mutator.mutateEvent(ircClient, messageEmitter, event)
  25. assertEquals(1, events.size)
  26. assertSame(event, events[0])
  27. }
  28. @Test
  29. fun `starts a batch when BatchStarted event is received`() {
  30. val event = BatchStarted(EventMetadata(TestConstants.time), "abcdef", "netsplit", arrayOf("foo", "bar"))
  31. val events = mutator.mutateEvent(ircClient, messageEmitter, event)
  32. assertTrue(events.isEmpty())
  33. assertNotNull(fakeServerState.batches["abcdef"])
  34. fakeServerState.batches["abcdef"]?.let {
  35. assertEquals(listOf("foo", "bar"), it.arguments)
  36. assertEquals("netsplit", it.type)
  37. assertTrue(it.events.isEmpty())
  38. assertNull(it.metadata.batchId)
  39. }
  40. }
  41. @Test
  42. fun `adds to batch when event has a batch ID`() {
  43. fakeServerState.batches["abcdef"] = Batch("netsplit", emptyList(), EventMetadata(TestConstants.time))
  44. val event = UserNickChanged(EventMetadata(TestConstants.time, "abcdef"), User("zeroCool"), "crashOverride")
  45. mutator.mutateEvent(ircClient, messageEmitter, event)
  46. assertEquals(listOf(event), fakeServerState.batches["abcdef"]!!.events)
  47. }
  48. @Test
  49. fun `suppresses event when it has a batch ID`() {
  50. fakeServerState.batches["abcdef"] = Batch("netsplit", emptyList(), EventMetadata(TestConstants.time))
  51. val event = UserNickChanged(EventMetadata(TestConstants.time, "abcdef"), User("zeroCool"), "crashOverride")
  52. val events = mutator.mutateEvent(ircClient, messageEmitter, event)
  53. assertTrue(events.isEmpty())
  54. }
  55. @Test
  56. fun `passes event for processing only when it has a batch ID`() {
  57. fakeServerState.batches["abcdef"] = Batch("netsplit", emptyList(), EventMetadata(TestConstants.time))
  58. val event = UserNickChanged(EventMetadata(TestConstants.time, "abcdef"), User("zeroCool"), "crashOverride")
  59. mutator.mutateEvent(ircClient, messageEmitter, event)
  60. verify {
  61. messageEmitter.handleEvent(any(), refEq(event), eq(true))
  62. }
  63. }
  64. @Test
  65. fun `sends a batch when it finishes and the parent is null`() {
  66. fakeServerState.batches["abcdef"] = Batch("netsplit", listOf("p1", "p2"), EventMetadata(TestConstants.time), events = mutableListOf(ServerConnected(EventMetadata(TestConstants.time, "abcdef"))))
  67. val events = mutator.mutateEvent(ircClient, messageEmitter, BatchFinished(EventMetadata(TestConstants.time), "abcdef"))
  68. assertEquals(1, events.size)
  69. assertTrue(events[0] is BatchReceived)
  70. val event = events[0] as BatchReceived
  71. assertEquals("netsplit", event.type)
  72. assertArrayEquals(arrayOf("p1", "p2"), event.params)
  73. assertEquals(1, event.events.size)
  74. assertTrue(event.events[0] is ServerConnected)
  75. }
  76. @Test
  77. fun `adds a batch to its parent when it finishes`() {
  78. fakeServerState.batches["12345"] = Batch("history", emptyList(), EventMetadata(TestConstants.time))
  79. fakeServerState.batches["abcdef"] = Batch("netsplit", emptyList(), EventMetadata(TestConstants.time, batchId = "12345"), mutableListOf(ServerConnected(EventMetadata(TestConstants.time, "abcdef"))))
  80. val events = mutator.mutateEvent(ircClient, messageEmitter, BatchFinished(EventMetadata(TestConstants.time), "abcdef"))
  81. assertEquals(0, events.size)
  82. val parent = fakeServerState.batches["12345"]?.events
  83. assertEquals(1, parent?.size)
  84. val event = parent?.get(0) as BatchReceived
  85. assertEquals(1, event.events.size)
  86. assertTrue(event.events[0] is ServerConnected)
  87. }
  88. @Test
  89. fun `deletes batch when it finishes`() {
  90. fakeServerState.batches["abcdef"] = Batch("netsplit", emptyList(), EventMetadata(TestConstants.time), events = mutableListOf(ServerConnected(EventMetadata(TestConstants.time, "abcdef"))))
  91. mutator.mutateEvent(ircClient, messageEmitter, BatchFinished(EventMetadata(TestConstants.time), "abcdef"))
  92. assertNull(fakeServerState.batches["abcdef"])
  93. }
  94. }