|
@@ -0,0 +1,460 @@
|
|
|
+/*
|
|
|
+ * 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<MemberJoinRequestEvent>(events[0]) {
|
|
|
+ assertEquals(100000000, fromId)
|
|
|
+ assertEquals("demo", fromNick)
|
|
|
+ assertEquals("msg", message)
|
|
|
+ }
|
|
|
+ assertIsInstance<MemberJoinEvent>(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<BotInvitedJoinGroupRequestEvent>(events[0]) {
|
|
|
+ assertEquals(5710, invitorId)
|
|
|
+ assertEquals("demo", invitorNick)
|
|
|
+ assertEquals(999999999, groupId)
|
|
|
+ assertEquals("test", groupName)
|
|
|
+ }
|
|
|
+ assertIsInstance<BotJoinGroupEvent>(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<GroupEntranceAnnouncementChangeEvent>(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<BotLeaveEvent.Active>(events[0]) {
|
|
|
+ assertEquals(1, group.id)
|
|
|
+ }
|
|
|
+ assertIsInstance<FriendDeleteEvent>(events[1]) {
|
|
|
+ assertEquals(2, friend.id)
|
|
|
+ }
|
|
|
+ assertIsInstance<StrangerRelationChangeEvent.Deleted>(events[2]) {
|
|
|
+ assertEquals(3, stranger.id)
|
|
|
+ }
|
|
|
+ assertIsInstance<MemberLeaveEvent>(events[3]) {
|
|
|
+ assertEquals(4, group.id)
|
|
|
+ assertEquals(5, member.id)
|
|
|
+ }
|
|
|
+ assertIsInstance<BotLeaveEvent.Kick>(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<MemberHonorChangeEvent.Lose>(events[0])
|
|
|
+ assertEquals(222, events[0].cast<MemberHonorChangeEvent.Lose>().member.id)
|
|
|
+ assertEquals(GroupHonorType.ACTIVE, events[1].cast<MemberHonorChangeEvent.Achieve>().honorType)
|
|
|
+ assertEquals(333, events[1].cast<MemberHonorChangeEvent.Achieve>().member.id)
|
|
|
+ assertIsInstance<MemberHonorChangeEvent.Achieve>(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<GroupMessageEvent>().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<BotLeaveEvent.Active>(events[0]) {
|
|
|
+ assertEquals(1, group.id)
|
|
|
+ assertEquals("A", group.name)
|
|
|
+ }
|
|
|
+ assertIsInstance<BotLeaveEvent.Kick>(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<BotGroupPermissionChangeEvent>(events[0]) {
|
|
|
+ assertEquals(MemberPermission.ADMINISTRATOR, new)
|
|
|
+ assertEquals(MemberPermission.MEMBER, origin)
|
|
|
+ }
|
|
|
+ assertIsInstance<BotGroupPermissionChangeEvent>(events[1]) {
|
|
|
+ assertEquals(MemberPermission.OWNER, new)
|
|
|
+ assertEquals(MemberPermission.MEMBER, origin)
|
|
|
+ }
|
|
|
+ assertIsInstance<MemberPermissionChangeEvent>(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<BotMuteEvent>(events[0])
|
|
|
+ assertIsInstance<BotUnmuteEvent>(events[1])
|
|
|
+ assertIsInstance<BotMuteEvent>(events[2])
|
|
|
+
|
|
|
+ assertIsInstance<MemberMuteEvent>(events[3])
|
|
|
+ assertIsInstance<MemberUnmuteEvent>(events[4])
|
|
|
+ assertIsInstance<MemberMuteEvent>(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<GroupNameChangeEvent>(events[0]) {
|
|
|
+ assertEquals("OOOOO", origin)
|
|
|
+ assertEquals("Test", new)
|
|
|
+ assertEquals(1, group.id)
|
|
|
+ assertNull(operator)
|
|
|
+ }
|
|
|
+ assertIsInstance<GroupNameChangeEvent>(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<GroupMuteAllEvent>(events[0]) {
|
|
|
+ assertEquals(true, origin)
|
|
|
+ assertEquals(false, new)
|
|
|
+ assertEquals(1, group.id)
|
|
|
+ assertNull(operator)
|
|
|
+ }
|
|
|
+ assertIsInstance<GroupMuteAllEvent>(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<GroupAllowAnonymousChatEvent>(events[0]) {
|
|
|
+ assertEquals(true, origin)
|
|
|
+ assertEquals(false, new)
|
|
|
+ assertEquals(1, group.id)
|
|
|
+ assertNull(operator)
|
|
|
+ }
|
|
|
+ assertIsInstance<GroupAllowAnonymousChatEvent>(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<GroupAllowConfessTalkEvent>(events[0]) {
|
|
|
+ assertEquals(true, origin)
|
|
|
+ assertEquals(false, new)
|
|
|
+ assertEquals(1, group.id)
|
|
|
+ assertTrue(isByBot)
|
|
|
+ }
|
|
|
+ assertIsInstance<GroupAllowConfessTalkEvent>(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<GroupAllowMemberInviteEvent>(events[0]) {
|
|
|
+ assertEquals(true, origin)
|
|
|
+ assertEquals(false, new)
|
|
|
+ assertEquals(1, group.id)
|
|
|
+ assertNull(operator)
|
|
|
+ }
|
|
|
+ assertIsInstance<GroupAllowMemberInviteEvent>(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<MemberCardChangeEvent>(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<MemberSpecialTitleChangeEvent>(events[0]) {
|
|
|
+ assertEquals("", origin)
|
|
|
+ assertEquals("Hello", new)
|
|
|
+ assertEquals(2, member.id)
|
|
|
+ assertEquals(1, member.group.id)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|