MockGroupTest.kt 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. /*
  2. * Copyright 2019-2022 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.delay
  11. import kotlinx.coroutines.flow.toList
  12. import net.mamoe.mirai.contact.MemberPermission
  13. import net.mamoe.mirai.contact.announcement.AnnouncementParametersBuilder
  14. import net.mamoe.mirai.contact.isBotMuted
  15. import net.mamoe.mirai.data.GroupHonorType
  16. import net.mamoe.mirai.event.events.*
  17. import net.mamoe.mirai.message.data.FileMessage
  18. import net.mamoe.mirai.mock.contact.announcement.MockOnlineAnnouncement
  19. import net.mamoe.mirai.mock.test.MockBotTestBase
  20. import net.mamoe.mirai.mock.userprofile.MockMemberInfoBuilder
  21. import net.mamoe.mirai.mock.utils.simpleMemberInfo
  22. import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
  23. import net.mamoe.mirai.utils.cast
  24. import org.junit.jupiter.api.Test
  25. import kotlin.test.*
  26. internal class MockGroupTest : MockBotTestBase() {
  27. @Test
  28. internal fun testMockGroupJoinRequest() = runTest {
  29. val group = bot.addGroup(9875555515, "test")
  30. runAndReceiveEventBroadcast {
  31. group.broadcastNewMemberJoinRequestEvent(
  32. 100000000, "demo", "msg"
  33. ).accept()
  34. }.let { events ->
  35. assertEquals(2, events.size)
  36. assertIsInstance<MemberJoinRequestEvent>(events[0]) {
  37. assertEquals(100000000, fromId)
  38. assertEquals("demo", fromNick)
  39. assertEquals("msg", message)
  40. }
  41. assertIsInstance<MemberJoinEvent>(events[1]) {
  42. assertEquals(100000000, member.id)
  43. assertEquals("demo", member.nick)
  44. }
  45. }
  46. val member = group.getOrFail(100000000)
  47. assertEquals(MemberPermission.MEMBER, member.permission)
  48. }
  49. @Test
  50. internal fun testMockBotJoinGroupRequest() = runTest {
  51. val invitor = bot.addFriend(5710, "demo")
  52. runAndReceiveEventBroadcast {
  53. invitor.broadcastInviteBotJoinGroupRequestEvent(999999999, "test")
  54. .accept()
  55. }.let { events ->
  56. assertEquals(2, events.size)
  57. assertIsInstance<BotInvitedJoinGroupRequestEvent>(events[0]) {
  58. assertEquals(5710, invitorId)
  59. assertEquals("demo", invitorNick)
  60. assertEquals(999999999, groupId)
  61. assertEquals("test", groupName)
  62. }
  63. assertIsInstance<BotJoinGroupEvent>(events[1]) {
  64. assertNotSame(group.botAsMember, group.owner)
  65. assertEquals(MemberPermission.MEMBER, group.botPermission)
  66. assertEquals(999999999, group.id)
  67. assertEquals(MemberPermission.OWNER, group.owner.permission)
  68. }
  69. }
  70. }
  71. @Test
  72. internal fun testGroupAnnouncements() = runTest {
  73. val group = bot.addGroup(8484541, "87")
  74. runAndReceiveEventBroadcast {
  75. group.announcements.publish(
  76. MockOnlineAnnouncement(
  77. content = "dlroW olleH",
  78. parameters = AnnouncementParametersBuilder().apply { this.sendToNewMember = true }.build(),
  79. senderId = 9711221,
  80. allConfirmed = false,
  81. confirmedMembersCount = 0,
  82. publicationTime = 0
  83. )
  84. )
  85. group.announcements.publish(
  86. MockOnlineAnnouncement(
  87. content = "Hello World",
  88. parameters = AnnouncementParametersBuilder().apply { this.sendToNewMember = true }.build(),
  89. senderId = 971121,
  90. allConfirmed = false,
  91. confirmedMembersCount = 0,
  92. publicationTime = 0
  93. )
  94. )
  95. }.let { events ->
  96. assertEquals(0, events.size)
  97. }
  98. val anc = group.announcements.asFlow().toList()
  99. assertEquals(1, anc.size)
  100. assertEquals("Hello World", anc[0].content)
  101. assertFalse(anc[0].fid.isEmpty())
  102. assertEquals(anc[0], group.announcements.get(anc[0].fid))
  103. }
  104. @Test
  105. internal fun testLeave() = runTest {
  106. runAndReceiveEventBroadcast {
  107. bot.addGroup(1, "1").quit()
  108. bot.addFriend(2, "2").delete()
  109. bot.addStranger(3, "3").delete()
  110. bot.addGroup(4, "4")
  111. .addMember(simpleMemberInfo(5, "5", permission = MemberPermission.MEMBER))
  112. .broadcastMemberLeave()
  113. bot.addGroup(6, "6")
  114. .addMember(simpleMemberInfo(7, "7", permission = MemberPermission.OWNER))
  115. .broadcastKickBot()
  116. }.let { events ->
  117. assertEquals(5, events.size)
  118. assertIsInstance<BotLeaveEvent.Active>(events[0]) {
  119. assertEquals(1, group.id)
  120. }
  121. assertIsInstance<FriendDeleteEvent>(events[1]) {
  122. assertEquals(2, friend.id)
  123. }
  124. assertIsInstance<StrangerRelationChangeEvent.Deleted>(events[2]) {
  125. assertEquals(3, stranger.id)
  126. }
  127. assertIsInstance<MemberLeaveEvent>(events[3]) {
  128. assertEquals(4, group.id)
  129. assertEquals(5, member.id)
  130. }
  131. assertIsInstance<BotLeaveEvent.Kick>(events[4]) {
  132. assertEquals(6, group.id)
  133. assertEquals(7, operator.id)
  134. }
  135. }
  136. }
  137. @Suppress("DEPRECATION", "DEPRECATION_ERROR")
  138. @Test
  139. internal fun testGroupFileV1() = runTest {
  140. val fsroot = bot.addGroup(5417, "58aw").filesRoot
  141. fsroot.resolve("helloworld.txt").uploadAndSend(
  142. "HelloWorld".toByteArray().toExternalResource().toAutoCloseable()
  143. )
  144. assertEquals(1, fsroot.listFilesCollection().size)
  145. assertEquals(
  146. "HelloWorld",
  147. fsroot.resolve("helloworld.txt")
  148. .getDownloadInfo()!!
  149. .url.toUrl()
  150. .also { println("Mock file url: $it") }
  151. .readText()
  152. )
  153. fsroot.resolve("helloworld.txt").delete()
  154. assertEquals(0, fsroot.listFilesCollection().size)
  155. }
  156. @Test
  157. internal fun testGroupFileUpload() = runTest {
  158. val files = bot.addGroup(111, "aaa").files
  159. val file = files.uploadNewFile("aaa", "ccc".toByteArray().toExternalResource().toAutoCloseable())
  160. assertEquals("ccc", file.getUrl()!!.toUrl().readText())
  161. runAndReceiveEventBroadcast {
  162. bot.getGroup(111)!!.addMember(simpleMemberInfo(222, "bbb", permission = MemberPermission.ADMINISTRATOR))
  163. .says(file.toMessage())
  164. }.let { events ->
  165. assertTrue(events[0].cast<GroupMessageEvent>().message.contains(FileMessage))
  166. }
  167. }
  168. @Test
  169. internal fun testAvatar() = runTest {
  170. assertNotEquals("", bot.addGroup(111, "aaa").avatarUrl.toUrl().readText())
  171. }
  172. @Test
  173. internal fun testBotLeaveGroup() = runTest {
  174. runAndReceiveEventBroadcast {
  175. bot.addGroup(1, "A").quit()
  176. bot.addGroup(2, "B")
  177. .addMember(MockMemberInfoBuilder.create {
  178. uin(3).nick("W")
  179. permission(MemberPermission.ADMINISTRATOR)
  180. }).broadcastKickBot()
  181. // TODO: BotLeaveEvent.Disband
  182. }.let { events ->
  183. assertEquals(2, events.size)
  184. assertIsInstance<BotLeaveEvent.Active>(events[0]) {
  185. assertEquals(1, group.id)
  186. assertEquals("A", group.name)
  187. }
  188. assertIsInstance<BotLeaveEvent.Kick>(events[1]) {
  189. assertEquals(2, group.id)
  190. assertEquals("B", group.name)
  191. assertEquals(3, operator.id)
  192. assertEquals("W", operator.nick)
  193. }
  194. assertNull(bot.getGroup(1))
  195. assertNull(bot.getGroup(2))
  196. }
  197. }
  198. @Test
  199. fun testBotGroupPermissionChangeEvent() = runTest {
  200. runAndReceiveEventBroadcast {
  201. bot.addGroup(1, "")
  202. .appendMember(MockMemberInfoBuilder.create {
  203. uin(1).nick("o")
  204. permission(MemberPermission.OWNER)
  205. })
  206. .botAsMember permissionChangesTo MemberPermission.ADMINISTRATOR
  207. bot.addGroup(2, "")
  208. .appendMember(MockMemberInfoBuilder.create {
  209. uin(1).nick("o")
  210. permission(MemberPermission.OWNER)
  211. })
  212. .let {
  213. it.changeOwner(it.botAsMember)
  214. }
  215. }.let { events ->
  216. assertEquals(3, events.size)
  217. assertIsInstance<BotGroupPermissionChangeEvent>(events[0]) {
  218. assertEquals(MemberPermission.ADMINISTRATOR, new)
  219. assertEquals(MemberPermission.MEMBER, origin)
  220. }
  221. assertIsInstance<BotGroupPermissionChangeEvent>(events[1]) {
  222. assertEquals(MemberPermission.OWNER, new)
  223. assertEquals(MemberPermission.MEMBER, origin)
  224. }
  225. assertIsInstance<MemberPermissionChangeEvent>(events[2]) {
  226. assertEquals(1, member.id)
  227. assertEquals("o", member.nick)
  228. assertEquals(MemberPermission.MEMBER, new)
  229. assertEquals(MemberPermission.OWNER, origin)
  230. }
  231. }
  232. }
  233. @Test
  234. fun testMuteEvent() = runTest {
  235. runAndReceiveEventBroadcast {
  236. val group = bot.addGroup(1, "")
  237. .appendMember(2, "")
  238. group.botAsMember.let {
  239. it.broadcastMute(it, 2)
  240. assertTrue { it.isMuted }
  241. it.broadcastMute(it, 0)
  242. assertFalse { it.isMuted }
  243. it.broadcastMute(it, 5)
  244. assertTrue { group.isBotMuted }
  245. assertTrue { it.isMuted }
  246. }
  247. group.getOrFail(2).let {
  248. it.broadcastMute(it, 2)
  249. assertTrue { it.isMuted }
  250. it.broadcastMute(it, 0)
  251. assertFalse { it.isMuted }
  252. it.broadcastMute(it, 5)
  253. assertTrue { it.isMuted }
  254. }
  255. }.let { events ->
  256. assertEquals(6, events.size)
  257. assertIsInstance<BotMuteEvent>(events[0])
  258. assertIsInstance<BotUnmuteEvent>(events[1])
  259. assertIsInstance<BotMuteEvent>(events[2])
  260. assertIsInstance<MemberMuteEvent>(events[3])
  261. assertIsInstance<MemberUnmuteEvent>(events[4])
  262. assertIsInstance<MemberMuteEvent>(events[5])
  263. delay(6000L)
  264. assertFalse { bot.getGroupOrFail(1).isBotMuted }
  265. assertFalse { bot.getGroupOrFail(1).getOrFail(2).isMuted }
  266. }
  267. }
  268. @Test
  269. fun testGroupNameChangeEvent() = runTest {
  270. runAndReceiveEventBroadcast {
  271. val g = bot.addGroup(1, "").appendMember(7, "A")
  272. g.controlPane.groupName = "OOOOO"
  273. g.name = "Test"
  274. g.controlPane.withActor(g.getOrFail(7)).groupName = "Hi"
  275. }.let { events ->
  276. assertEquals(2, events.size)
  277. assertIsInstance<GroupNameChangeEvent>(events[0]) {
  278. assertEquals("OOOOO", origin)
  279. assertEquals("Test", new)
  280. assertEquals(1, group.id)
  281. assertNull(operator)
  282. }
  283. assertIsInstance<GroupNameChangeEvent>(events[1]) {
  284. assertEquals("Test", origin)
  285. assertEquals("Hi", new)
  286. assertEquals(1, group.id)
  287. assertEquals(7, operator!!.id)
  288. }
  289. }
  290. }
  291. @Test
  292. fun testGroupMuteAllEvent() = runTest {
  293. runAndReceiveEventBroadcast {
  294. val g = bot.addGroup(1, "").appendMember(7, "A")
  295. g.controlPane.isMuteAll = true
  296. g.settings.isMuteAll = false
  297. g.controlPane.withActor(g.getOrFail(7)).isMuteAll = true
  298. }.let { events ->
  299. assertEquals(2, events.size)
  300. assertIsInstance<GroupMuteAllEvent>(events[0]) {
  301. assertEquals(true, origin)
  302. assertEquals(false, new)
  303. assertEquals(1, group.id)
  304. assertNull(operator)
  305. }
  306. assertIsInstance<GroupMuteAllEvent>(events[1]) {
  307. assertEquals(false, origin)
  308. assertEquals(true, new)
  309. assertEquals(1, group.id)
  310. assertEquals(7, operator!!.id)
  311. }
  312. }
  313. }
  314. @Test
  315. fun testGroupAllowAnonymousChatEvent() = runTest {
  316. runAndReceiveEventBroadcast {
  317. val g = bot.addGroup(1, "").appendMember(7, "A")
  318. g.controlPane.isAnonymousChatAllowed = true
  319. g.settings.isAnonymousChatEnabled = false
  320. g.controlPane.withActor(g.getOrFail(7)).isAnonymousChatAllowed = true
  321. }.let { events ->
  322. assertEquals(2, events.size)
  323. assertIsInstance<GroupAllowAnonymousChatEvent>(events[0]) {
  324. assertEquals(true, origin)
  325. assertEquals(false, new)
  326. assertEquals(1, group.id)
  327. assertNull(operator)
  328. }
  329. assertIsInstance<GroupAllowAnonymousChatEvent>(events[1]) {
  330. assertEquals(false, origin)
  331. assertEquals(true, new)
  332. assertEquals(1, group.id)
  333. assertEquals(7, operator!!.id)
  334. }
  335. }
  336. }
  337. @Test
  338. fun testGroupAllowConfessTalkEvent() = runTest {
  339. runAndReceiveEventBroadcast {
  340. val g = bot.addGroup(1, "").appendMember(7, "A")
  341. g.controlPane.isAllowConfessTalk = true
  342. g.controlPane.withActor(g.botAsMember).isAllowConfessTalk = false
  343. g.controlPane.withActor(g.getOrFail(7)).isAllowConfessTalk = true
  344. }.let { events ->
  345. assertEquals(2, events.size)
  346. assertIsInstance<GroupAllowConfessTalkEvent>(events[0]) {
  347. assertEquals(true, origin)
  348. assertEquals(false, new)
  349. assertEquals(1, group.id)
  350. assertTrue(isByBot)
  351. }
  352. assertIsInstance<GroupAllowConfessTalkEvent>(events[1]) {
  353. assertEquals(false, origin)
  354. assertEquals(true, new)
  355. assertEquals(1, group.id)
  356. assertFalse(isByBot)
  357. }
  358. }
  359. }
  360. @Test
  361. fun testGroupAllowMemberInviteEvent() = runTest {
  362. runAndReceiveEventBroadcast {
  363. val g = bot.addGroup(1, "").appendMember(7, "A")
  364. g.controlPane.isAllowMemberInvite = true
  365. g.settings.isAllowMemberInvite = false
  366. g.controlPane.withActor(g.getOrFail(7)).isAllowMemberInvite = true
  367. }.let { events ->
  368. assertEquals(2, events.size)
  369. assertIsInstance<GroupAllowMemberInviteEvent>(events[0]) {
  370. assertEquals(true, origin)
  371. assertEquals(false, new)
  372. assertEquals(1, group.id)
  373. assertNull(operator)
  374. }
  375. assertIsInstance<GroupAllowMemberInviteEvent>(events[1]) {
  376. assertEquals(false, origin)
  377. assertEquals(true, new)
  378. assertEquals(1, group.id)
  379. assertEquals(7, operator!!.id)
  380. }
  381. }
  382. }
  383. @Test
  384. fun testMemberCardChangeEvent() = runTest {
  385. runAndReceiveEventBroadcast {
  386. bot.addGroup(1, "")
  387. .addMember(MockMemberInfoBuilder.create {
  388. uin(2)
  389. nameCard("Hi")
  390. }).nameCardChangesTo("Hello")
  391. }.let { events ->
  392. assertEquals(1, events.size)
  393. assertIsInstance<MemberCardChangeEvent>(events[0]) {
  394. assertEquals("Hi", origin)
  395. assertEquals("Hello", new)
  396. assertEquals(2, member.id)
  397. assertEquals(1, member.group.id)
  398. }
  399. }
  400. }
  401. @Test
  402. fun testMemberSpecialTitleChangeEvent() = runTest {
  403. runAndReceiveEventBroadcast {
  404. bot.addGroup(1, "").addMember(2, "") specialTitleChangesTo "Hello"
  405. }.let { events ->
  406. assertEquals(1, events.size)
  407. assertIsInstance<MemberSpecialTitleChangeEvent>(events[0]) {
  408. assertEquals("", origin)
  409. assertEquals("Hello", new)
  410. assertEquals(2, member.id)
  411. assertEquals(1, member.group.id)
  412. }
  413. }
  414. }
  415. @Test
  416. fun testHonorMember() = runTest {
  417. val group = bot.addGroup(1, "")
  418. val member1 = group.addMember(2, "")
  419. val member2 = group.addMember(3, "")
  420. assertEquals(emptyList(), group.active.queryHonorHistory(GroupHonorType.TALKATIVE).records)
  421. runAndReceiveEventBroadcast {
  422. group.active.changeHonorMember(member1, GroupHonorType.TALKATIVE)
  423. }.let { events ->
  424. assertEquals(1, events.size)
  425. assertIsInstance<MemberHonorChangeEvent.Achieve>(events[0]) {
  426. assertEquals(GroupHonorType.TALKATIVE, this.honorType)
  427. assertEquals(member1, this.member)
  428. assertEquals(group, this.group)
  429. }
  430. }
  431. assertEquals(member1, group.active.queryHonorHistory(GroupHonorType.TALKATIVE).current!!.member!!)
  432. assertEquals(emptyList(), group.active.queryHonorHistory(GroupHonorType.TALKATIVE).records)
  433. runAndReceiveEventBroadcast {
  434. group.active.changeHonorMember(member2, GroupHonorType.TALKATIVE)
  435. }.let { events ->
  436. assertEquals(3, events.size)
  437. assertIsInstance<GroupTalkativeChangeEvent>(events[0]) {
  438. assertEquals(member2, this.now)
  439. assertEquals(member1, this.previous)
  440. assertEquals(group, this.group)
  441. }
  442. assertIsInstance<MemberHonorChangeEvent.Lose>(events[1]) {
  443. assertEquals(GroupHonorType.TALKATIVE, this.honorType)
  444. assertEquals(member1, this.member)
  445. assertEquals(group, this.group)
  446. }
  447. assertIsInstance<MemberHonorChangeEvent.Achieve>(events[2]) {
  448. assertEquals(GroupHonorType.TALKATIVE, this.honorType)
  449. assertEquals(member2, this.member)
  450. assertEquals(group, this.group)
  451. }
  452. }
  453. assertEquals(member2, group.active.queryHonorHistory(GroupHonorType.TALKATIVE).current!!.member!!)
  454. // it.member must exist
  455. assertEquals(
  456. listOf(member1),
  457. group.active.queryHonorHistory(GroupHonorType.TALKATIVE).records.map { it.member!! })
  458. runAndReceiveEventBroadcast {
  459. group.active.changeHonorMember(member1, GroupHonorType.TALKATIVE)
  460. }.let { events ->
  461. assertEquals(3, events.size)
  462. assertIsInstance<GroupTalkativeChangeEvent>(events[0]) {
  463. assertEquals(member1, this.now)
  464. assertEquals(member2, this.previous)
  465. assertEquals(group, this.group)
  466. }
  467. assertIsInstance<MemberHonorChangeEvent.Lose>(events[1]) {
  468. assertEquals(GroupHonorType.TALKATIVE, this.honorType)
  469. assertEquals(member2, this.member)
  470. assertEquals(group, this.group)
  471. }
  472. assertIsInstance<MemberHonorChangeEvent.Achieve>(events[2]) {
  473. assertEquals(GroupHonorType.TALKATIVE, this.honorType)
  474. assertEquals(member1, this.member)
  475. assertEquals(group, this.group)
  476. }
  477. }
  478. assertEquals(member1, group.active.queryHonorHistory(GroupHonorType.TALKATIVE).current!!.member!!)
  479. assertEquals(
  480. listOf(member1, member2),
  481. group.active.queryHonorHistory(GroupHonorType.TALKATIVE).records.map { it.member!! })
  482. runAndReceiveEventBroadcast {
  483. group.active.changeHonorMember(member1, GroupHonorType.BRONZE)
  484. }.let { events ->
  485. assertEquals(1, events.size)
  486. assertIsInstance<MemberHonorChangeEvent.Achieve>(events[0]) {
  487. assertEquals(GroupHonorType.BRONZE, this.honorType)
  488. assertEquals(member1, this.member)
  489. assertEquals(group, this.group)
  490. }
  491. }
  492. assertEquals(member1, group.active.queryHonorHistory(GroupHonorType.BRONZE).current!!.member!!)
  493. assertEquals(emptyList(), group.active.queryHonorHistory(GroupHonorType.BRONZE).records)
  494. runAndReceiveEventBroadcast {
  495. group.active.changeHonorMember(member2, GroupHonorType.BRONZE)
  496. }.let { events ->
  497. assertEquals(2, events.size)
  498. assertIsInstance<MemberHonorChangeEvent.Lose>(events[0]) {
  499. assertEquals(GroupHonorType.BRONZE, this.honorType)
  500. assertEquals(member1, this.member)
  501. assertEquals(group, this.group)
  502. }
  503. assertIsInstance<MemberHonorChangeEvent.Achieve>(events[1]) {
  504. assertEquals(GroupHonorType.BRONZE, this.honorType)
  505. assertEquals(member2, this.member)
  506. assertEquals(group, this.group)
  507. }
  508. }
  509. assertEquals(member2, group.active.queryHonorHistory(GroupHonorType.BRONZE).current!!.member!!)
  510. assertEquals(listOf(member1), group.active.queryHonorHistory(GroupHonorType.BRONZE).records.map { it.member!! })
  511. }
  512. }