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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  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 fakeLocalUser = User("?")
  16. private val ircClient = mockk<IrcClient> {
  17. every { serverState } returns fakeServerState
  18. every { userState } returns fakeUserState
  19. every { isLocalUser(any<User>()) } answers { arg<User>(0).nickname == "zeroCool" }
  20. every { isLocalUser(any<String>()) } answers { arg<String>(0) == "zeroCool" }
  21. every { localUser } returns fakeLocalUser
  22. }
  23. private val handler = UserStateHandler()
  24. @BeforeEach
  25. fun setUp() {
  26. fakeServerState.features[ServerFeature.ModePrefixes] = ModePrefixMapping("ov", "@+")
  27. }
  28. @Test
  29. fun `adds channel to user on join`() {
  30. fakeUserState += User("acidBurn")
  31. handler.processEvent(ircClient, ChannelJoined(EventMetadata(TestConstants.time), User("acidBurn", "libby", "root.localhost"), "#thegibson"))
  32. assertEquals(listOf("#thegibson"), fakeUserState["acidBurn"]?.channels?.toList())
  33. }
  34. @Test
  35. fun `updates user info on join`() {
  36. fakeUserState += User("acidBurn")
  37. handler.processEvent(ircClient, ChannelJoined(EventMetadata(TestConstants.time), User("acidBurn", "libby", "root.localhost"), "#thegibson"))
  38. val details = fakeUserState["acidBurn"]?.details!!
  39. assertEquals("libby", details.ident)
  40. assertEquals("root.localhost", details.hostname)
  41. }
  42. @Test
  43. fun `removes channel from user on part`() {
  44. fakeUserState += User("acidBurn")
  45. fakeUserState.addToChannel(User("acidBurn"), "#thegibson")
  46. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  47. handler.processEvent(ircClient, ChannelParted(EventMetadata(TestConstants.time), User("acidBurn", "libby", "root.localhost"), "#dumpsterdiving"))
  48. assertEquals(listOf("#thegibson"), fakeUserState["acidBurn"]?.channels?.toList())
  49. }
  50. @Test
  51. fun `removes user on part from last channel`() {
  52. fakeUserState += User("acidBurn")
  53. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  54. handler.processEvent(ircClient, ChannelParted(EventMetadata(TestConstants.time), User("acidBurn", "libby", "root.localhost"), "#dumpsterdiving"))
  55. assertNull(fakeUserState["acidBurn"])
  56. }
  57. @Test
  58. fun `removes channel from all users on local part`() {
  59. fakeUserState += User("acidBurn")
  60. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  61. fakeUserState.addToChannel(User("acidBurn"), "#thegibson")
  62. fakeUserState += User("zeroCool")
  63. fakeUserState.addToChannel(User("zeroCool"), "#dumpsterdiving")
  64. fakeUserState.addToChannel(User("zeroCool"), "#thegibson")
  65. handler.processEvent(ircClient, ChannelParted(EventMetadata(TestConstants.time), User("zeroCool", "dade", "root.localhost"), "#dumpsterdiving"))
  66. assertEquals(listOf("#thegibson"), fakeUserState["acidBurn"]?.channels?.toList())
  67. assertEquals(listOf("#thegibson"), fakeUserState["zeroCool"]?.channels?.toList())
  68. }
  69. @Test
  70. fun `removes remote users with no remaining channels on local part`() {
  71. fakeUserState += User("acidBurn")
  72. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  73. handler.processEvent(ircClient, ChannelParted(EventMetadata(TestConstants.time), User("zeroCool", "dade", "root.localhost"), "#dumpsterdiving"))
  74. assertNull(fakeUserState["acidBurn"])
  75. }
  76. @Test
  77. fun `keeps local user with no remaining channels after local part`() {
  78. fakeUserState += User("zeroCool")
  79. fakeUserState.addToChannel(User("zeroCool"), "#dumpsterdiving")
  80. handler.processEvent(ircClient, ChannelParted(EventMetadata(TestConstants.time), User("zeroCool", "dade", "root.localhost"), "#dumpsterdiving"))
  81. assertNotNull(fakeUserState["zeroCool"])
  82. }
  83. @Test
  84. fun `removes channel from user on kick`() {
  85. fakeUserState += User("acidBurn")
  86. fakeUserState.addToChannel(User("acidBurn"), "#thegibson")
  87. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  88. handler.processEvent(ircClient, ChannelUserKicked(EventMetadata(TestConstants.time), User("thePlague"), "#dumpsterdiving", "acidBurn"))
  89. assertEquals(listOf("#thegibson"), fakeUserState["acidBurn"]?.channels?.toList())
  90. }
  91. @Test
  92. fun `removes user on kick from last channel`() {
  93. fakeUserState += User("acidBurn")
  94. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  95. handler.processEvent(ircClient, ChannelUserKicked(EventMetadata(TestConstants.time), User("thePlague"), "#dumpsterdiving", "acidBurn"))
  96. assertNull(fakeUserState["acidBurn"])
  97. }
  98. @Test
  99. fun `removes channel from all users on local kick`() {
  100. fakeUserState += User("acidBurn")
  101. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  102. fakeUserState.addToChannel(User("acidBurn"), "#thegibson")
  103. fakeUserState += User("zeroCool")
  104. fakeUserState.addToChannel(User("zeroCool"), "#dumpsterdiving")
  105. fakeUserState.addToChannel(User("zeroCool"), "#thegibson")
  106. handler.processEvent(ircClient, ChannelUserKicked(EventMetadata(TestConstants.time), User("thePlague"), "#dumpsterdiving", "zeroCool"))
  107. assertEquals(listOf("#thegibson"), fakeUserState["acidBurn"]?.channels?.toList())
  108. assertEquals(listOf("#thegibson"), fakeUserState["zeroCool"]?.channels?.toList())
  109. }
  110. @Test
  111. fun `removes remote users with no remaining channels on local kick`() {
  112. fakeUserState += User("acidBurn")
  113. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  114. handler.processEvent(ircClient, ChannelUserKicked(EventMetadata(TestConstants.time), User("thePlague"), "#dumpsterdiving", "zeroCool"))
  115. assertNull(fakeUserState["acidBurn"])
  116. }
  117. @Test
  118. fun `keeps local user with no remaining channels after local kick`() {
  119. fakeUserState += User("zeroCool")
  120. fakeUserState.addToChannel(User("zeroCool"), "#dumpsterdiving")
  121. handler.processEvent(ircClient, ChannelUserKicked(EventMetadata(TestConstants.time), User("thePlague"), "#dumpsterdiving", "zeroCool"))
  122. assertNotNull(fakeUserState["zeroCool"])
  123. }
  124. @Test
  125. fun `removes user entirely on quit`() {
  126. fakeUserState += User("acidBurn")
  127. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  128. handler.processEvent(ircClient, UserQuit(EventMetadata(TestConstants.time), User("acidBurn", "libby", "root.localhost")))
  129. assertNull(fakeUserState["acidBurn"])
  130. }
  131. @Test
  132. fun `adds users to channels on names received`() {
  133. fakeUserState += User("acidBurn")
  134. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  135. handler.processEvent(ircClient, ChannelNamesReceived(EventMetadata(TestConstants.time), "#thegibson", listOf("@acidBurn")))
  136. assertEquals(listOf("#dumpsterdiving", "#thegibson"), fakeUserState["acidBurn"]?.channels?.toList())
  137. }
  138. @Test
  139. fun `updates user details on names received`() {
  140. fakeUserState += User("acidBurn")
  141. fakeUserState.addToChannel(User("acidBurn"), "#dumpsterdiving")
  142. handler.processEvent(ircClient, ChannelNamesReceived(EventMetadata(TestConstants.time), "#thegibson", listOf("@acidBurn!libby@root.localhost")))
  143. val details = fakeUserState["acidBurn"]?.details!!
  144. assertEquals("libby", details.ident)
  145. assertEquals("root.localhost", details.hostname)
  146. }
  147. @Test
  148. fun `updates user info on account change`() {
  149. fakeUserState += User("acidBurn")
  150. handler.processEvent(ircClient, UserAccountChanged(EventMetadata(TestConstants.time), User("acidBurn", "libby", "root.localhost"), "acidBurn"))
  151. val details = fakeUserState["acidBurn"]?.details!!
  152. assertEquals("acidBurn", details.account)
  153. }
  154. @Test
  155. fun `updates local nickname for local nick changes`() {
  156. val user = User("zeroCool", "dade", "root.localhost")
  157. handler.processEvent(ircClient, UserNickChanged(EventMetadata(TestConstants.time), user, "crashOverride"))
  158. assertEquals("crashOverride", fakeServerState.localNickname)
  159. }
  160. @Test
  161. fun `updates nickname for remote nick changes`() {
  162. val user = User("acidBurn", "libby", "root.localhost")
  163. fakeUserState += User("AcidBurn")
  164. handler.processEvent(ircClient, UserNickChanged(EventMetadata(TestConstants.time), user, "acid~"))
  165. assertNotNull(fakeUserState["acid~"])
  166. assertNull(fakeUserState["AcidBurn"])
  167. assertEquals("acid~", fakeUserState["acid~"]?.details?.nickname)
  168. }
  169. @Test
  170. fun `updates details for remote host changes`() {
  171. val user = User("acidBurn", "libby", "root.localhost")
  172. fakeUserState += User("AcidBurn")
  173. handler.processEvent(ircClient, UserHostChanged(EventMetadata(TestConstants.time), user, "burn", "root.gibson"))
  174. assertEquals("burn", fakeUserState["acidBurn"]?.details?.ident)
  175. assertEquals("root.gibson", fakeUserState["acidBurn"]?.details?.hostname)
  176. }
  177. @Test
  178. fun `updates details for user back events`() {
  179. val user = User("acidBurn", "libby", "root.localhost")
  180. fakeUserState += User("AcidBurn", awayMessage = "Hacking the planet")
  181. handler.processEvent(ircClient, UserAway(EventMetadata(TestConstants.time), user, null))
  182. assertNull(fakeUserState["acidBurn"]?.details?.awayMessage)
  183. }
  184. @Test
  185. fun `does not update away details for less detailed events`() {
  186. val user = User("acidBurn", "libby", "root.localhost")
  187. fakeUserState += User("AcidBurn", awayMessage = "Hacking the planet")
  188. handler.processEvent(ircClient, UserAway(EventMetadata(TestConstants.time), user, ""))
  189. assertEquals("Hacking the planet", fakeUserState["acidBurn"]?.details?.awayMessage)
  190. }
  191. @Test
  192. fun `updates away details for away message`() {
  193. val user = User("acidBurn", "libby", "root.localhost")
  194. fakeUserState += User("AcidBurn")
  195. handler.processEvent(ircClient, UserAway(EventMetadata(TestConstants.time), user, "Hacking the planet"))
  196. assertEquals("Hacking the planet", fakeUserState["acidBurn"]?.details?.awayMessage)
  197. }
  198. @Test
  199. fun `updates local nickname on server welcome`() {
  200. fakeUserState += User("AcidBurn")
  201. handler.processEvent(ircClient, ServerWelcome(EventMetadata(TestConstants.time), "the.gibson", "acidBurn2"))
  202. assertEquals("acidBurn2", fakeLocalUser.nickname)
  203. }
  204. }