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.

UserStateHandlerTest.kt 9.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package com.dmdirc.ktirc.events.handlers
  2. import com.dmdirc.ktirc.IrcClient
  3. import com.dmdirc.ktirc.TestConstants
  4. import com.dmdirc.ktirc.events.*
  5. import com.dmdirc.ktirc.io.CaseMapping
  6. import com.dmdirc.ktirc.model.*
  7. import io.mockk.every
  8. import io.mockk.mockk
  9. import org.junit.jupiter.api.Assertions.*
  10. import org.junit.jupiter.api.BeforeEach
  11. import org.junit.jupiter.api.Test
  12. internal class UserStateHandlerTest {
  13. private val fakeServerState = ServerState("", "")
  14. private val fakeUserState = UserState { CaseMapping.Rfc }
  15. private val ircClient = mockk<IrcClient> {
  16. every { serverState } returns fakeServerState
  17. every { userState } returns fakeUserState
  18. every { isLocalUser(any<User>()) } answers { arg<User>(0).nickname == "zeroCool" }
  19. every { isLocalUser(any<String>()) } answers { arg<String>(0) == "zeroCool" }
  20. }
  21. private val handler = UserStateHandler()
  22. @BeforeEach
  23. fun setUp() {
  24. fakeServerState.features[ServerFeature.ModePrefixes] = ModePrefixMapping("ov", "@+")
  25. }
  26. @Test
  27. fun `adds channel to user on join`() {
  28. fakeUserState += User("acidBurn")
  29. handler.processEvent(ircClient, ChannelJoined(EventMetadata(TestConstants.time), User("acidBurn", "libby", "root.localhost"), "#thegibson"))
  30. assertEquals(listOf("#thegibson"), fakeUserState["acidBurn"]?.channels?.toList())
  31. }
  32. @Test
  33. fun `updates user info on join`() {
  34. fakeUserState += User("acidBurn")
  35. handler.processEvent(ircClient, ChannelJoined(EventMetadata(TestConstants.time), User("acidBurn", "libby", "root.localhost"), "#thegibson"))
  36. val details = fakeUserState["acidBurn"]?.details!!
  37. assertEquals("libby", details.ident)
  38. assertEquals("root.localhost", details.hostname)
  39. }
  40. @Test
  41. fun `removes channel from user on part`() {
  42. fakeUserState += User("acidBurn")
  43. fakeUserState.addToChannel(User("acidBurn"), "#thegibson")
  44. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  45. handler.processEvent(ircClient, ChannelParted(EventMetadata(TestConstants.time), User("acidBurn", "libby", "root.localhost"), "#dumpsterdiving"))
  46. assertEquals(listOf("#thegibson"), fakeUserState["acidBurn"]?.channels?.toList())
  47. }
  48. @Test
  49. fun `removes user on part from last channel`() {
  50. fakeUserState += User("acidBurn")
  51. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  52. handler.processEvent(ircClient, ChannelParted(EventMetadata(TestConstants.time), User("acidBurn", "libby", "root.localhost"), "#dumpsterdiving"))
  53. assertNull(fakeUserState["acidBurn"])
  54. }
  55. @Test
  56. fun `removes channel from all users on local part`() {
  57. fakeUserState += User("acidBurn")
  58. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  59. fakeUserState.addToChannel(User("acidBurn"), "#thegibson")
  60. fakeUserState += User("zeroCool")
  61. fakeUserState.addToChannel(User("zeroCool"), "#dumpsterdiving")
  62. fakeUserState.addToChannel(User("zeroCool"), "#thegibson")
  63. handler.processEvent(ircClient, ChannelParted(EventMetadata(TestConstants.time), User("zeroCool", "dade", "root.localhost"), "#dumpsterdiving"))
  64. assertEquals(listOf("#thegibson"), fakeUserState["acidBurn"]?.channels?.toList())
  65. assertEquals(listOf("#thegibson"), fakeUserState["zeroCool"]?.channels?.toList())
  66. }
  67. @Test
  68. fun `removes remote users with no remaining channels on local part`() {
  69. fakeUserState += User("acidBurn")
  70. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  71. handler.processEvent(ircClient, ChannelParted(EventMetadata(TestConstants.time), User("zeroCool", "dade", "root.localhost"), "#dumpsterdiving"))
  72. assertNull(fakeUserState["acidBurn"])
  73. }
  74. @Test
  75. fun `keeps local user with no remaining channels after local part`() {
  76. fakeUserState += User("zeroCool")
  77. fakeUserState.addToChannel(User("zeroCool"), "#dumpsterdiving")
  78. handler.processEvent(ircClient, ChannelParted(EventMetadata(TestConstants.time), User("zeroCool", "dade", "root.localhost"), "#dumpsterdiving"))
  79. assertNotNull(fakeUserState["zeroCool"])
  80. }
  81. @Test
  82. fun `removes channel from user on kick`() {
  83. fakeUserState += User("acidBurn")
  84. fakeUserState.addToChannel(User("acidBurn"), "#thegibson")
  85. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  86. handler.processEvent(ircClient, ChannelUserKicked(EventMetadata(TestConstants.time), User("thePlague"), "#dumpsterdiving", "acidBurn"))
  87. assertEquals(listOf("#thegibson"), fakeUserState["acidBurn"]?.channels?.toList())
  88. }
  89. @Test
  90. fun `removes user on kick from last channel`() {
  91. fakeUserState += User("acidBurn")
  92. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  93. handler.processEvent(ircClient, ChannelUserKicked(EventMetadata(TestConstants.time), User("thePlague"), "#dumpsterdiving", "acidBurn"))
  94. assertNull(fakeUserState["acidBurn"])
  95. }
  96. @Test
  97. fun `removes channel from all users on local kick`() {
  98. fakeUserState += User("acidBurn")
  99. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  100. fakeUserState.addToChannel(User("acidBurn"), "#thegibson")
  101. fakeUserState += User("zeroCool")
  102. fakeUserState.addToChannel(User("zeroCool"), "#dumpsterdiving")
  103. fakeUserState.addToChannel(User("zeroCool"), "#thegibson")
  104. handler.processEvent(ircClient, ChannelUserKicked(EventMetadata(TestConstants.time), User("thePlague"), "#dumpsterdiving", "zeroCool"))
  105. assertEquals(listOf("#thegibson"), fakeUserState["acidBurn"]?.channels?.toList())
  106. assertEquals(listOf("#thegibson"), fakeUserState["zeroCool"]?.channels?.toList())
  107. }
  108. @Test
  109. fun `removes remote users with no remaining channels on local kick`() {
  110. fakeUserState += User("acidBurn")
  111. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  112. handler.processEvent(ircClient, ChannelUserKicked(EventMetadata(TestConstants.time), User("thePlague"), "#dumpsterdiving", "zeroCool"))
  113. assertNull(fakeUserState["acidBurn"])
  114. }
  115. @Test
  116. fun `keeps local user with no remaining channels after local kick`() {
  117. fakeUserState += User("zeroCool")
  118. fakeUserState.addToChannel(User("zeroCool"), "#dumpsterdiving")
  119. handler.processEvent(ircClient, ChannelUserKicked(EventMetadata(TestConstants.time), User("thePlague"), "#dumpsterdiving", "zeroCool"))
  120. assertNotNull(fakeUserState["zeroCool"])
  121. }
  122. @Test
  123. fun `removes user entirely on quit`() {
  124. fakeUserState += User("acidBurn")
  125. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  126. handler.processEvent(ircClient, UserQuit(EventMetadata(TestConstants.time), User("acidBurn", "libby", "root.localhost")))
  127. assertNull(fakeUserState["acidBurn"])
  128. }
  129. @Test
  130. fun `adds users to channels on names received`() {
  131. fakeUserState += User("acidBurn")
  132. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  133. handler.processEvent(ircClient, ChannelNamesReceived(EventMetadata(TestConstants.time), "#thegibson", listOf("@acidBurn")))
  134. assertEquals(listOf("#dumpsterdiving", "#thegibson"), fakeUserState["acidBurn"]?.channels?.toList())
  135. }
  136. @Test
  137. fun `updates user details on names received`() {
  138. fakeUserState += User("acidBurn")
  139. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  140. handler.processEvent(ircClient, ChannelNamesReceived(EventMetadata(TestConstants.time), "#thegibson", listOf("@acidBurn!libby@root.localhost")))
  141. val details = fakeUserState["acidBurn"]?.details!!
  142. assertEquals("libby", details.ident)
  143. assertEquals("root.localhost", details.hostname)
  144. }
  145. @Test
  146. fun `updates user info on account change`() {
  147. fakeUserState += User("acidBurn")
  148. handler.processEvent(ircClient, UserAccountChanged(EventMetadata(TestConstants.time), User("acidBurn", "libby", "root.localhost"), "acidBurn"))
  149. val details = fakeUserState["acidBurn"]?.details!!
  150. assertEquals("acidBurn", details.account)
  151. }
  152. @Test
  153. fun `updates local nickname for local nick changes`() {
  154. val user = User("zeroCool", "dade", "root.localhost")
  155. handler.processEvent(ircClient, UserNickChanged(EventMetadata(TestConstants.time), user, "crashOverride"))
  156. assertEquals("crashOverride", fakeServerState.localNickname)
  157. }
  158. @Test
  159. fun `updates nickname for remote nick changes`() {
  160. val user = User("acidBurn", "libby", "root.localhost")
  161. fakeUserState += User("AcidBurn")
  162. handler.processEvent(ircClient, UserNickChanged(EventMetadata(TestConstants.time), user, "acid~"))
  163. assertNotNull(fakeUserState["acid~"])
  164. assertNull(fakeUserState["AcidBurn"])
  165. assertEquals("acid~", fakeUserState["acid~"]?.details?.nickname)
  166. }
  167. @Test
  168. fun `updates details for remote host changes`() {
  169. val user = User("acidBurn", "libby", "root.localhost")
  170. fakeUserState += User("AcidBurn")
  171. handler.processEvent(ircClient, UserHostChanged(EventMetadata(TestConstants.time), user, "burn", "root.gibson"))
  172. assertEquals("burn", fakeUserState["acidBurn"]?.details?.ident)
  173. assertEquals("root.gibson", fakeUserState["acidBurn"]?.details?.hostname)
  174. }
  175. }