/* * Copyright 2019-2022 Mamoe Technologies and contributors. * * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. * * https://github.com/mamoe/mirai/blob/dev/LICENSE */ package net.mamoe.mirai.mock.test.mock import kotlinx.coroutines.delay import kotlinx.coroutines.flow.toList import net.mamoe.mirai.contact.MemberPermission import net.mamoe.mirai.contact.announcement.AnnouncementParametersBuilder import net.mamoe.mirai.contact.isBotMuted import net.mamoe.mirai.data.GroupHonorType import net.mamoe.mirai.event.events.* import net.mamoe.mirai.message.data.FileMessage import net.mamoe.mirai.mock.contact.announcement.MockOnlineAnnouncement import net.mamoe.mirai.mock.test.MockBotTestBase import net.mamoe.mirai.mock.userprofile.MockMemberInfoBuilder import net.mamoe.mirai.mock.utils.simpleMemberInfo import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource import net.mamoe.mirai.utils.cast import org.junit.jupiter.api.Test import kotlin.test.* internal class MockGroupTest : MockBotTestBase() { @Test internal fun testMockGroupJoinRequest() = runTest { val group = bot.addGroup(9875555515, "test") runAndReceiveEventBroadcast { group.broadcastNewMemberJoinRequestEvent( 100000000, "demo", "msg" ).accept() }.let { events -> assertEquals(2, events.size) assertIsInstance(events[0]) { assertEquals(100000000, fromId) assertEquals("demo", fromNick) assertEquals("msg", message) } assertIsInstance(events[1]) { assertEquals(100000000, member.id) assertEquals("demo", member.nick) } } val member = group.getOrFail(100000000) assertEquals(MemberPermission.MEMBER, member.permission) } @Test internal fun testMockBotJoinGroupRequest() = runTest { val invitor = bot.addFriend(5710, "demo") runAndReceiveEventBroadcast { invitor.broadcastInviteBotJoinGroupRequestEvent(999999999, "test") .accept() }.let { events -> assertEquals(2, events.size) assertIsInstance(events[0]) { assertEquals(5710, invitorId) assertEquals("demo", invitorNick) assertEquals(999999999, groupId) assertEquals("test", groupName) } assertIsInstance(events[1]) { assertNotSame(group.botAsMember, group.owner) assertEquals(MemberPermission.MEMBER, group.botPermission) assertEquals(999999999, group.id) assertEquals(MemberPermission.OWNER, group.owner.permission) } } } @Test internal fun testGroupAnnouncements() = runTest { val group = bot.addGroup(8484541, "87") runAndReceiveEventBroadcast { group.announcements.publish( MockOnlineAnnouncement( content = "dlroW olleH", parameters = AnnouncementParametersBuilder().apply { this.sendToNewMember = true }.build(), senderId = 9711221, allConfirmed = false, confirmedMembersCount = 0, publicationTime = 0 ) ) group.announcements.publish( MockOnlineAnnouncement( content = "Hello World", parameters = AnnouncementParametersBuilder().apply { this.sendToNewMember = true }.build(), senderId = 971121, allConfirmed = false, confirmedMembersCount = 0, publicationTime = 0 ) ) }.let { events -> assertEquals(2, events.size) assertIsInstance(events[0]) } val anc = group.announcements.asFlow().toList() assertEquals(1, anc.size) assertEquals("Hello World", anc[0].content) assertFalse(anc[0].fid.isEmpty()) assertEquals(anc[0], group.announcements.get(anc[0].fid)) } @Test internal fun testLeave() = runTest { runAndReceiveEventBroadcast { bot.addGroup(1, "1").quit() bot.addFriend(2, "2").delete() bot.addStranger(3, "3").delete() bot.addGroup(4, "4") .addMember(simpleMemberInfo(5, "5", permission = MemberPermission.MEMBER)) .broadcastMemberLeave() bot.addGroup(6, "6") .addMember(simpleMemberInfo(7, "7", permission = MemberPermission.OWNER)) .broadcastKickBot() }.let { events -> assertEquals(5, events.size) assertIsInstance(events[0]) { assertEquals(1, group.id) } assertIsInstance(events[1]) { assertEquals(2, friend.id) } assertIsInstance(events[2]) { assertEquals(3, stranger.id) } assertIsInstance(events[3]) { assertEquals(4, group.id) assertEquals(5, member.id) } assertIsInstance(events[4]) { assertEquals(6, group.id) assertEquals(7, operator.id) } } } @Suppress("DEPRECATION") @Test internal fun testGroupFileV1() = runTest { val fsroot = bot.addGroup(5417, "58aw").filesRoot fsroot.resolve("helloworld.txt").uploadAndSend( "HelloWorld".toByteArray().toExternalResource().toAutoCloseable() ) assertEquals(1, fsroot.listFilesCollection().size) assertEquals( "HelloWorld", fsroot.resolve("helloworld.txt") .getDownloadInfo()!! .url.toUrl() .also { println("Mock file url: $it") } .readText() ) fsroot.resolve("helloworld.txt").delete() assertEquals(0, fsroot.listFilesCollection().size) } @Test internal fun testMemberHonorChangeEvent() = runTest { runAndReceiveEventBroadcast { val group = bot.addGroup(111, "aa") val member1 = group.addMember(simpleMemberInfo(222, "bb", permission = MemberPermission.MEMBER)) val member2 = group.addMember(simpleMemberInfo(333, "cc", permission = MemberPermission.MEMBER)) group.honorMembers[GroupHonorType.ACTIVE] = member1 group.changeHonorMember(member2, GroupHonorType.ACTIVE) }.let { events -> assertEquals(2, events.size) assertIsInstance(events[0]) assertEquals(222, events[0].cast().member.id) assertEquals(GroupHonorType.ACTIVE, events[1].cast().honorType) assertEquals(333, events[1].cast().member.id) assertIsInstance(events[1]) } } @Test internal fun testGroupFileUpload() = runTest { val files = bot.addGroup(111, "aaa").files val file = files.uploadNewFile("aaa", "ccc".toByteArray().toExternalResource().toAutoCloseable()) assertEquals("ccc", file.getUrl()!!.toUrl().readText()) runAndReceiveEventBroadcast { bot.getGroup(111)!!.addMember(simpleMemberInfo(222, "bbb", permission = MemberPermission.ADMINISTRATOR)) .says(file.toMessage()) }.let { events -> assertTrue(events[0].cast().message.contains(FileMessage)) } } @Test internal fun testAvatar() = runTest { assertNotEquals("", bot.addGroup(111, "aaa").avatarUrl.toUrl().readText()) } @Test internal fun testBotLeaveGroup() = runTest { runAndReceiveEventBroadcast { bot.addGroup(1, "A").quit() bot.addGroup(2, "B") .addMember(MockMemberInfoBuilder.create { uin(3).nick("W") permission(MemberPermission.ADMINISTRATOR) }).broadcastKickBot() // TODO: BotLeaveEvent.Disband }.let { events -> assertEquals(2, events.size) assertIsInstance(events[0]) { assertEquals(1, group.id) assertEquals("A", group.name) } assertIsInstance(events[1]) { assertEquals(2, group.id) assertEquals("B", group.name) assertEquals(3, operator.id) assertEquals("W", operator.nick) } assertNull(bot.getGroup(1)) assertNull(bot.getGroup(2)) } } @Test fun testBotGroupPermissionChangeEvent() = runTest { runAndReceiveEventBroadcast { bot.addGroup(1, "") .appendMember(MockMemberInfoBuilder.create { uin(1).nick("o") permission(MemberPermission.OWNER) }) .botAsMember permissionChangesTo MemberPermission.ADMINISTRATOR bot.addGroup(2, "") .appendMember(MockMemberInfoBuilder.create { uin(1).nick("o") permission(MemberPermission.OWNER) }) .let { it.changeOwner(it.botAsMember) } }.let { events -> assertEquals(3, events.size) assertIsInstance(events[0]) { assertEquals(MemberPermission.ADMINISTRATOR, new) assertEquals(MemberPermission.MEMBER, origin) } assertIsInstance(events[1]) { assertEquals(MemberPermission.OWNER, new) assertEquals(MemberPermission.MEMBER, origin) } assertIsInstance(events[2]) { assertEquals(1, member.id) assertEquals("o", member.nick) assertEquals(MemberPermission.MEMBER, new) assertEquals(MemberPermission.OWNER, origin) } } } @Test fun testMuteEvent() = runTest { runAndReceiveEventBroadcast { val group = bot.addGroup(1, "") .appendMember(2, "") group.botAsMember.let { it.broadcastMute(it, 2) assertTrue { it.isMuted } it.broadcastMute(it, 0) assertFalse { it.isMuted } it.broadcastMute(it, 5) assertTrue { group.isBotMuted } assertTrue { it.isMuted } } group.getOrFail(2).let { it.broadcastMute(it, 2) assertTrue { it.isMuted } it.broadcastMute(it, 0) assertFalse { it.isMuted } it.broadcastMute(it, 5) assertTrue { it.isMuted } } }.let { events -> assertEquals(6, events.size) assertIsInstance(events[0]) assertIsInstance(events[1]) assertIsInstance(events[2]) assertIsInstance(events[3]) assertIsInstance(events[4]) assertIsInstance(events[5]) delay(6000L) assertFalse { bot.getGroupOrFail(1).isBotMuted } assertFalse { bot.getGroupOrFail(1).getOrFail(2).isMuted } } } @Test fun testGroupNameChangeEvent() = runTest { runAndReceiveEventBroadcast { val g = bot.addGroup(1, "").appendMember(7, "A") g.controlPane.groupName = "OOOOO" g.name = "Test" g.controlPane.withActor(g.getOrFail(7)).groupName = "Hi" }.let { events -> assertEquals(2, events.size) assertIsInstance(events[0]) { assertEquals("OOOOO", origin) assertEquals("Test", new) assertEquals(1, group.id) assertNull(operator) } assertIsInstance(events[1]) { assertEquals("Test", origin) assertEquals("Hi", new) assertEquals(1, group.id) assertEquals(7, operator!!.id) } } } @Test fun testGroupMuteAllEvent() = runTest { runAndReceiveEventBroadcast { val g = bot.addGroup(1, "").appendMember(7, "A") g.controlPane.isMuteAll = true g.settings.isMuteAll = false g.controlPane.withActor(g.getOrFail(7)).isMuteAll = true }.let { events -> assertEquals(2, events.size) assertIsInstance(events[0]) { assertEquals(true, origin) assertEquals(false, new) assertEquals(1, group.id) assertNull(operator) } assertIsInstance(events[1]) { assertEquals(false, origin) assertEquals(true, new) assertEquals(1, group.id) assertEquals(7, operator!!.id) } } } @Test fun testGroupAllowAnonymousChatEvent() = runTest { runAndReceiveEventBroadcast { val g = bot.addGroup(1, "").appendMember(7, "A") g.controlPane.isAnonymousChatAllowed = true g.settings.isAnonymousChatEnabled = false g.controlPane.withActor(g.getOrFail(7)).isAnonymousChatAllowed = true }.let { events -> assertEquals(2, events.size) assertIsInstance(events[0]) { assertEquals(true, origin) assertEquals(false, new) assertEquals(1, group.id) assertNull(operator) } assertIsInstance(events[1]) { assertEquals(false, origin) assertEquals(true, new) assertEquals(1, group.id) assertEquals(7, operator!!.id) } } } @Test fun testGroupAllowConfessTalkEvent() = runTest { runAndReceiveEventBroadcast { val g = bot.addGroup(1, "").appendMember(7, "A") g.controlPane.isAllowConfessTalk = true g.controlPane.withActor(g.botAsMember).isAllowConfessTalk = false g.controlPane.withActor(g.getOrFail(7)).isAllowConfessTalk = true }.let { events -> assertEquals(2, events.size) assertIsInstance(events[0]) { assertEquals(true, origin) assertEquals(false, new) assertEquals(1, group.id) assertTrue(isByBot) } assertIsInstance(events[1]) { assertEquals(false, origin) assertEquals(true, new) assertEquals(1, group.id) assertFalse(isByBot) } } } @Test fun testGroupAllowMemberInviteEvent() = runTest { runAndReceiveEventBroadcast { val g = bot.addGroup(1, "").appendMember(7, "A") g.controlPane.isAllowMemberInvite = true g.settings.isAllowMemberInvite = false g.controlPane.withActor(g.getOrFail(7)).isAllowMemberInvite = true }.let { events -> assertEquals(2, events.size) assertIsInstance(events[0]) { assertEquals(true, origin) assertEquals(false, new) assertEquals(1, group.id) assertNull(operator) } assertIsInstance(events[1]) { assertEquals(false, origin) assertEquals(true, new) assertEquals(1, group.id) assertEquals(7, operator!!.id) } } } @Test fun testMemberCardChangeEvent() = runTest { runAndReceiveEventBroadcast { bot.addGroup(1, "") .addMember(MockMemberInfoBuilder.create { uin(2) nameCard("Hi") }).nameCardChangesTo("Hello") }.let { events -> assertEquals(1, events.size) assertIsInstance(events[0]) { assertEquals("Hi", origin) assertEquals("Hello", new) assertEquals(2, member.id) assertEquals(1, member.group.id) } } } @Test fun testMemberSpecialTitleChangeEvent() = runTest { runAndReceiveEventBroadcast { bot.addGroup(1, "").addMember(2, "") specialTitleChangesTo "Hello" }.let { events -> assertEquals(1, events.size) assertIsInstance(events[0]) { assertEquals("", origin) assertEquals("Hello", new) assertEquals(2, member.id) assertEquals(1, member.group.id) } } } }