MessagingTest.kt 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. /*
  2. * Copyright 2019-2023 Mamoe Technologies and contributors.
  3. *
  4. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  5. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
  6. *
  7. * https://github.com/mamoe/mirai/blob/dev/LICENSE
  8. */
  9. package net.mamoe.mirai.mock.test.mock
  10. import kotlinx.coroutines.flow.toList
  11. import net.mamoe.mirai.contact.MemberPermission
  12. import net.mamoe.mirai.event.events.*
  13. import net.mamoe.mirai.message.data.*
  14. import net.mamoe.mirai.message.data.MessageSource.Key.recall
  15. import net.mamoe.mirai.mock.MockActions.mockFireRecalled
  16. import net.mamoe.mirai.mock.test.MockBotTestBase
  17. import net.mamoe.mirai.mock.userprofile.MockMemberInfoBuilder
  18. import net.mamoe.mirai.mock.utils.broadcastMockEvents
  19. import net.mamoe.mirai.mock.utils.simpleMemberInfo
  20. import org.junit.jupiter.api.DynamicNode
  21. import org.junit.jupiter.api.Nested
  22. import org.junit.jupiter.api.Test
  23. import org.junit.jupiter.api.TestFactory
  24. import kotlin.test.*
  25. internal class MessagingTest : MockBotTestBase() {
  26. @Test
  27. internal fun testMessageEventBroadcast() = runTest {
  28. runAndReceiveEventBroadcast {
  29. bot.addGroup(5597122, "testing!")
  30. .addMember(simpleMemberInfo(5971, "test", permission = MemberPermission.OWNER))
  31. .says("Hello World")
  32. bot.addFriend(9815, "tester").says("Msg By TestFriend")
  33. bot.addStranger(987166, "sudo").says("How are you")
  34. bot.getGroupOrFail(5597122).sendMessage("Testing message")
  35. bot.getFriendOrFail(9815).sendMessage("Hi my friend")
  36. bot.getStrangerOrFail(987166).sendMessage("How are you")
  37. }.let { events ->
  38. assertEquals(9, events.size)
  39. assertIsInstance<GroupMessageEvent>(events[0]) {
  40. assertEquals("Hello World", message.contentToString())
  41. assertEquals("test", senderName)
  42. assertEquals(5971, sender.id)
  43. assertEquals(5597122, group.id)
  44. assertIsInstance<OnlineMessageSource.Incoming.FromGroup>(message.source)
  45. }
  46. assertIsInstance<FriendMessageEvent>(events[1]) {
  47. assertEquals("Msg By TestFriend", message.contentToString())
  48. assertEquals("tester", senderName)
  49. assertEquals(9815, sender.id)
  50. assertIsInstance<OnlineMessageSource.Incoming.FromFriend>(message.source)
  51. }
  52. assertIsInstance<StrangerMessageEvent>(events[2]) {
  53. assertEquals("How are you", message.contentToString())
  54. assertEquals("sudo", senderName)
  55. assertEquals(987166, sender.id)
  56. assertIsInstance<OnlineMessageSource.Incoming.FromStranger>(message.source)
  57. }
  58. assertIsInstance<GroupMessagePreSendEvent>(events[3])
  59. assertIsInstance<GroupMessagePostSendEvent>(events[4]) {
  60. assertIsInstance<OnlineMessageSource.Outgoing.ToGroup>(receipt!!.source)
  61. }
  62. assertIsInstance<FriendMessagePreSendEvent>(events[5])
  63. assertIsInstance<FriendMessagePostSendEvent>(events[6]) {
  64. assertIsInstance<OnlineMessageSource.Outgoing.ToFriend>(receipt!!.source)
  65. }
  66. assertIsInstance<StrangerMessagePreSendEvent>(events[7])
  67. assertIsInstance<StrangerMessagePostSendEvent>(events[8]) {
  68. assertIsInstance<OnlineMessageSource.Outgoing.ToStranger>(receipt!!.source)
  69. }
  70. }
  71. }
  72. @Test
  73. internal fun testNudge() = runTest {
  74. val group = bot.addGroup(1, "1")
  75. val nudgeSender = group.addMember(simpleMemberInfo(3, "3", permission = MemberPermission.MEMBER))
  76. val nudged = group.addMember(simpleMemberInfo(4, "4", permission = MemberPermission.MEMBER))
  77. val myFriend = bot.addFriend(1, "514")
  78. val myStranger = bot.addStranger(2, "awef")
  79. runAndReceiveEventBroadcast {
  80. nudged.nudgedBy(nudgeSender)
  81. nudged.nudge().sendTo(group)
  82. myFriend.nudges(bot)
  83. myStranger.nudges(bot)
  84. myFriend.nudgedBy(bot)
  85. myStranger.nudgedBy(bot)
  86. }.let { events ->
  87. assertEquals(6, events.size)
  88. assertIsInstance<NudgeEvent>(events[0]) {
  89. assertSame(nudgeSender, this.from)
  90. assertSame(nudged, this.target)
  91. assertSame(group, this.subject)
  92. }
  93. assertIsInstance<NudgeEvent>(events[1]) {
  94. assertSame(bot, this.from)
  95. assertSame(nudged, this.target)
  96. assertSame(group, this.subject)
  97. }
  98. assertIsInstance<NudgeEvent>(events[2]) {
  99. assertSame(myFriend, this.from)
  100. assertSame(bot, this.target)
  101. assertSame(myFriend, this.subject)
  102. }
  103. assertIsInstance<NudgeEvent>(events[3]) {
  104. assertSame(myStranger, this.from)
  105. assertSame(bot, this.target)
  106. assertSame(myStranger, this.subject)
  107. }
  108. assertIsInstance<NudgeEvent>(events[4]) {
  109. assertSame(bot, this.from)
  110. assertSame(myFriend, this.target)
  111. assertSame(myFriend, this.subject)
  112. }
  113. assertIsInstance<NudgeEvent>(events[5]) {
  114. assertSame(bot, this.from)
  115. assertSame(myStranger, this.target)
  116. assertSame(myStranger, this.subject)
  117. }
  118. }
  119. }
  120. @Test
  121. internal fun testRoamingMessages() = runTest {
  122. val mockFriend = bot.addFriend(1, "1")
  123. val allSent = mutableListOf<MessageSource>()
  124. fun MutableList<MessageSource>.add(msg: MessageChain) {
  125. add(msg.source)
  126. }
  127. fun MutableList<MessageSource>.convertToOffline() {
  128. replaceAll { src ->
  129. bot.buildMessageSource(src.kind) { allFrom(src) }
  130. }
  131. }
  132. broadcastMockEvents {
  133. allSent.add(mockFriend says { append("Testing!") })
  134. allSent.add(mockFriend says { append("Test2!") })
  135. }
  136. allSent.add(mockFriend.sendMessage("Pong!").source)
  137. allSent.convertToOffline()
  138. mockFriend.roamingMessages.getAllMessages().toList().let { messages ->
  139. assertEquals(3, messages.size)
  140. assertEquals(messageChainOf(allSent[0] + PlainText("Testing!")), messages[0])
  141. assertEquals(messageChainOf(allSent[1] + PlainText("Test2!")), messages[1])
  142. assertEquals(messageChainOf(allSent[2] + PlainText("Pong!")), messages[2])
  143. }
  144. allSent.clear()
  145. val mockGroup = bot.addGroup(2, "2")
  146. val mockGroupMember1 = mockGroup.addMember(123, "123")
  147. val mockGroupMember2 = mockGroup.addMember(124, "124")
  148. val mockGroupMember3 = mockGroup.addMember(125, "125")
  149. broadcastMockEvents {
  150. allSent.add(mockGroupMember1 says { append("msg1") })
  151. allSent.add(mockGroupMember2 says { append("msg2") })
  152. allSent.add(mockGroupMember3 says { append("msg3") })
  153. }
  154. allSent.convertToOffline()
  155. with(mockGroup.roamingMessages.getAllMessages().toList()) {
  156. assertEquals(3, size)
  157. assertEquals(messageChainOf(allSent[0] + PlainText("msg1")), get(0))
  158. assertEquals(messageChainOf(allSent[1] + PlainText("msg2")), get(1))
  159. assertEquals(messageChainOf(allSent[2] + PlainText("msg3")), get(2))
  160. }
  161. }
  162. @Test
  163. internal fun testMessageRecallEventBroadcast() = runTest {
  164. val group = bot.addGroup(8484846, "g")
  165. val admin = group.addMember(simpleMemberInfo(945474, "admin", permission = MemberPermission.ADMINISTRATOR))
  166. val sender = group.addMember(simpleMemberInfo(178711, "usr", permission = MemberPermission.MEMBER))
  167. runAndReceiveEventBroadcast {
  168. sender.says("Test").recalledBySender()
  169. sender.says("Admin recall").recalledBy(admin)
  170. mockFireRecalled(group.sendMessage("Hello world"), admin)
  171. sender.says("Hi").recall()
  172. admin.says("I'm admin").let { resp ->
  173. resp.recall()
  174. assertFails { resp.recall() }.let(::println)
  175. }
  176. }.dropMsgChat().let { events ->
  177. assertEquals(5, events.size)
  178. assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
  179. assertSame(sender, operator)
  180. assertSame(sender, author)
  181. }
  182. assertIsInstance<MessageRecallEvent.GroupRecall>(events[1]) {
  183. assertSame(admin, operator)
  184. assertSame(sender, author)
  185. }
  186. assertIsInstance<MessageRecallEvent.GroupRecall>(events[2]) {
  187. assertSame(admin, operator)
  188. assertSame(group.botAsMember, author)
  189. }
  190. assertIsInstance<MessageRecallEvent.GroupRecall>(events[3]) {
  191. assertSame(null, operator)
  192. assertSame(sender, author)
  193. }
  194. assertIsInstance<MessageRecallEvent.GroupRecall>(events[4]) {
  195. assertSame(null, operator)
  196. assertSame(admin, author)
  197. }
  198. }
  199. val root = group.addMember(simpleMemberInfo(54986565, "root", permission = MemberPermission.OWNER))
  200. runAndReceiveEventBroadcast {
  201. sender.says("0").runAndAssertFails { recall() }
  202. admin.says("0").runAndAssertFails { recall() }
  203. root.says("0").runAndAssertFails { recall() }
  204. group.sendMessage("Hi").recall()
  205. }.dropMsgChat().let { events ->
  206. assertEquals(1, events.size)
  207. assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
  208. assertEquals(group.botAsMember, author)
  209. assertEquals(null, operator)
  210. }
  211. }
  212. }
  213. @Suppress("ComplexRedundantLet")
  214. @Nested
  215. internal inner class MessageRecalling {
  216. @TestFactory
  217. fun `friend messaging`(): Iterable<DynamicNode> {
  218. val myFriend = bot.addFriend(1, "f")
  219. return listOf<DynamicNode>(
  220. dynamicTest("bot recalling") {
  221. val msgBot = myFriend.sendMessage("2")
  222. runAndReceiveEventBroadcast {
  223. msgBot.recall()
  224. }.let { events ->
  225. assertEquals(0, events.size)
  226. }
  227. assertMessageNotAvailable(msgBot.source)
  228. },
  229. dynamicTest("friend recalling") {
  230. val msgFriend = myFriend.says("1")
  231. runAndReceiveEventBroadcast {
  232. msgFriend.recalledBySender()
  233. }.let { events ->
  234. assertEquals(1, events.size)
  235. assertIsInstance<MessageRecallEvent.FriendRecall>(events[0]) {
  236. assertEquals(myFriend, this.operator)
  237. assertContentEquals(msgFriend.source.ids, this.messageIds)
  238. assertContentEquals(msgFriend.source.internalIds, this.messageInternalIds)
  239. }
  240. assertMessageNotAvailable(msgFriend.source)
  241. }
  242. },
  243. dynamicTest("bot recall friend msg failed") {
  244. val msg = myFriend.says("1")
  245. assertFails { msg.recall() }
  246. assertMessageAvailable(msg.source)
  247. },
  248. )
  249. }
  250. @TestFactory
  251. fun `stranger messaging`(): Iterable<DynamicNode> {
  252. val myStranger = bot.addStranger(2, "s")
  253. return listOf<DynamicNode>(
  254. dynamicTest("stranger recalling") {
  255. val msg = myStranger.says("1")
  256. runAndReceiveEventBroadcast {
  257. msg.recalledBySender()
  258. }.let { events ->
  259. assertEquals(0, events.size)
  260. }
  261. assertMessageNotAvailable(msg.source)
  262. },
  263. dynamicTest("bot recalling") {
  264. val msg = myStranger.sendMessage("1")
  265. runAndReceiveEventBroadcast {
  266. msg.recall()
  267. }.let { events ->
  268. assertEquals(0, events.size)
  269. }
  270. assertMessageNotAvailable(msg.source)
  271. },
  272. dynamicTest("bot recall stranger failed") {
  273. val msg = myStranger.says("1")
  274. assertFails { msg.recall() }
  275. assertMessageAvailable(msg.source)
  276. },
  277. )
  278. }
  279. @TestFactory
  280. fun `group messaging`(): Iterable<DynamicNode> = listOf(
  281. dynamicContainer("Normal messaging test") {
  282. val group = bot.addGroup(18451444229, "owner group")
  283. group.addMember(MockMemberInfoBuilder.create {
  284. uin(184554).permission(MemberPermission.OWNER)
  285. })
  286. val administrator = group.addMember(MockMemberInfoBuilder.create {
  287. uin(184).permission(MemberPermission.ADMINISTRATOR)
  288. })
  289. val member = group.addMember(7777, "wapeog")
  290. group.botAsMember.mockApi.permission = MemberPermission.MEMBER
  291. return@dynamicContainer listOf<DynamicNode>(
  292. dynamicTest("member self recalling") {
  293. val msg = member.says("1")
  294. runAndReceiveEventBroadcast { msg.recalledBySender() }.let { events ->
  295. assertEquals(1, events.size)
  296. assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
  297. assertSame(member, this.author)
  298. assertSame(member, operator)
  299. assertContentEquals(msg.source.ids, this.messageIds)
  300. assertContentEquals(msg.source.internalIds, this.messageInternalIds)
  301. }
  302. }
  303. assertMessageNotAvailable(msg.source)
  304. },
  305. dynamicTest("member msg recalled by others") {
  306. val msg = member.says("1")
  307. runAndReceiveEventBroadcast { msg.recalledBy(administrator) }.let { events ->
  308. assertEquals(1, events.size)
  309. assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
  310. assertSame(member, this.author)
  311. assertSame(administrator, operator)
  312. assertContentEquals(msg.source.ids, this.messageIds)
  313. assertContentEquals(msg.source.internalIds, this.messageInternalIds)
  314. }
  315. }
  316. assertMessageNotAvailable(msg.source)
  317. },
  318. dynamicTest("member msg forced recalled by bot") {
  319. val msg = member.says("1")
  320. runAndReceiveEventBroadcast { msg.recalledBy(group.botAsMember) }.let { events ->
  321. assertEquals(1, events.size)
  322. assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
  323. assertSame(member, this.author)
  324. assertSame(null, operator)
  325. assertContentEquals(msg.source.ids, this.messageIds)
  326. assertContentEquals(msg.source.internalIds, this.messageInternalIds)
  327. }
  328. }
  329. assertMessageNotAvailable(msg.source)
  330. },
  331. )
  332. },
  333. dynamicContainer("bot is owner") {
  334. val group = bot.addGroup(8412, "owner group")
  335. val administrator = group.addMember(MockMemberInfoBuilder.create {
  336. uin(184).permission(MemberPermission.ADMINISTRATOR)
  337. })
  338. val member = group.addMember(7777, "wapeog")
  339. assertEquals(group.botPermission, MemberPermission.OWNER)
  340. return@dynamicContainer listOf<DynamicNode>(
  341. dynamicTest("Bot can recall itself message") {
  342. val msg = group.sendMessage("1")
  343. runAndReceiveEventBroadcast { msg.recall() }.let { events ->
  344. assertEquals(1, events.size)
  345. assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
  346. assertSame(group.botAsMember, this.author)
  347. assertSame(null, operator)
  348. assertContentEquals(msg.source.ids, this.messageIds)
  349. assertContentEquals(msg.source.internalIds, this.messageInternalIds)
  350. }
  351. }
  352. assertMessageNotAvailable(msg.source)
  353. },
  354. dynamicTest("Bot can recall administrator message") {
  355. val msg = administrator.says("1")
  356. runAndReceiveEventBroadcast { msg.recall() }.let { events ->
  357. assertEquals(1, events.size)
  358. assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
  359. assertSame(administrator, this.author)
  360. assertSame(null, operator)
  361. assertContentEquals(msg.source.ids, this.messageIds)
  362. assertContentEquals(msg.source.internalIds, this.messageInternalIds)
  363. }
  364. }
  365. assertMessageNotAvailable(msg.source)
  366. },
  367. dynamicTest("Bot can recall member message") {
  368. val msg = member.says("1")
  369. runAndReceiveEventBroadcast { msg.recall() }.let { events ->
  370. assertEquals(1, events.size)
  371. assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
  372. assertSame(member, this.author)
  373. assertSame(null, operator)
  374. assertContentEquals(msg.source.ids, this.messageIds)
  375. assertContentEquals(msg.source.internalIds, this.messageInternalIds)
  376. }
  377. }
  378. assertMessageNotAvailable(msg.source)
  379. },
  380. )
  381. },
  382. dynamicContainer("bot is administrator") {
  383. val group = bot.addGroup(7517, "owner group")
  384. val owner = group.addMember(MockMemberInfoBuilder.create {
  385. uin(96451).permission(MemberPermission.OWNER)
  386. })
  387. val administrator = group.addMember(MockMemberInfoBuilder.create {
  388. uin(184).permission(MemberPermission.ADMINISTRATOR)
  389. })
  390. val member = group.addMember(7777, "wapeog")
  391. group.botAsMember.mockApi.permission = MemberPermission.ADMINISTRATOR
  392. return@dynamicContainer listOf<DynamicNode>(
  393. dynamicTest("Bot can recall itself message") {
  394. val msg = group.sendMessage("1")
  395. runAndReceiveEventBroadcast { msg.recall() }.let { events ->
  396. assertEquals(1, events.size)
  397. assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
  398. assertSame(group.botAsMember, this.author)
  399. assertSame(null, operator)
  400. assertContentEquals(msg.source.ids, this.messageIds)
  401. assertContentEquals(msg.source.internalIds, this.messageInternalIds)
  402. }
  403. }
  404. assertMessageNotAvailable(msg.source)
  405. },
  406. dynamicTest("Bot cannot recall owner message") {
  407. val msg = owner.says("1")
  408. assertFails { msg.recall() }
  409. assertMessageAvailable(msg.source)
  410. },
  411. dynamicTest("Bot cannot recall administrator message") {
  412. val msg = administrator.says("1")
  413. assertFails { msg.recall() }
  414. assertMessageAvailable(msg.source)
  415. },
  416. dynamicTest("Bot can recall member message") {
  417. val msg = member.says("1")
  418. runAndReceiveEventBroadcast { msg.recall() }.let { events ->
  419. assertEquals(1, events.size)
  420. assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
  421. assertSame(member, this.author)
  422. assertSame(null, operator)
  423. assertContentEquals(msg.source.ids, this.messageIds)
  424. assertContentEquals(msg.source.internalIds, this.messageInternalIds)
  425. }
  426. }
  427. assertMessageNotAvailable(msg.source)
  428. },
  429. )
  430. },
  431. dynamicContainer("bot is member") {
  432. val group = bot.addGroup(8441117, "owner group")
  433. val owner = group.addMember(MockMemberInfoBuilder.create {
  434. uin(98171).permission(MemberPermission.OWNER)
  435. })
  436. val administrator = group.addMember(MockMemberInfoBuilder.create {
  437. uin(184).permission(MemberPermission.ADMINISTRATOR)
  438. })
  439. val member = group.addMember(7777, "wapeog")
  440. group.botAsMember.mockApi.permission = MemberPermission.MEMBER
  441. return@dynamicContainer listOf<DynamicNode>(
  442. dynamicTest("Bot can recall itself message") {
  443. val msg = group.sendMessage("1")
  444. runAndReceiveEventBroadcast { msg.recall() }.let { events ->
  445. assertEquals(1, events.size)
  446. assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
  447. assertSame(group.botAsMember, this.author)
  448. assertSame(null, operator)
  449. assertContentEquals(msg.source.ids, this.messageIds)
  450. assertContentEquals(msg.source.internalIds, this.messageInternalIds)
  451. }
  452. }
  453. assertMessageNotAvailable(msg.source)
  454. },
  455. dynamicTest("Bot cannot recall owner message") {
  456. val msg = owner.says("1")
  457. assertFails { msg.recall() }
  458. assertMessageAvailable(msg.source)
  459. },
  460. dynamicTest("Bot cannot recall administrator message") {
  461. val msg = administrator.says("1")
  462. assertFails { msg.recall() }
  463. assertMessageAvailable(msg.source)
  464. },
  465. dynamicTest("Bot cannot recall member message") {
  466. val msg = member.says("1")
  467. assertFails { msg.recall() }
  468. assertMessageAvailable(msg.source)
  469. },
  470. )
  471. },
  472. )
  473. }
  474. }