Skip to content

Commit

Permalink
Message recalling tests
Browse files Browse the repository at this point in the history
Co-authored-by: Karlatemp <kar@kasukusakura.com>
  • Loading branch information
Karlatemp committed Jan 18, 2023
1 parent 62ffb1b commit 2b840e2
Show file tree
Hide file tree
Showing 3 changed files with 321 additions and 5 deletions.
16 changes: 16 additions & 0 deletions mirai-core-mock/test/MockBotTestBase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,17 @@ package net.mamoe.mirai.mock.test

import net.mamoe.mirai.event.Event
import net.mamoe.mirai.event.GlobalEventChannel
import net.mamoe.mirai.message.data.MessageSource
import net.mamoe.mirai.mock.MockBotFactory
import net.mamoe.mirai.mock.database.queryMessageInfo
import net.mamoe.mirai.mock.internal.MockBotImpl
import net.mamoe.mirai.mock.utils.MockActionsScope
import net.mamoe.mirai.mock.utils.broadcastMockEvents
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.TestInstance
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import kotlin.test.fail

@TestInstance(TestInstance.Lifecycle.PER_METHOD)
internal open class MockBotTestBase : TestBase() {
Expand Down Expand Up @@ -55,4 +58,17 @@ internal open class MockBotTestBase : TestBase() {
return result
}


internal fun assertMessageNotAvailable(source: MessageSource) {
if (bot.msgDatabase.queryMessageInfo(source.ids, source.internalIds) != null) {
fail("Require message $source no longer available.")
}
}

internal fun assertMessageAvailable(source: MessageSource) {
if (bot.msgDatabase.queryMessageInfo(source.ids, source.internalIds) == null) {
fail("Require message $source available.")
}
}

}
14 changes: 14 additions & 0 deletions mirai-core-mock/test/TestBase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ import net.mamoe.mirai.event.Event
import net.mamoe.mirai.event.events.MessageEvent
import net.mamoe.mirai.event.events.MessagePostSendEvent
import net.mamoe.mirai.event.events.MessagePreSendEvent
import org.junit.jupiter.api.DynamicContainer
import org.junit.jupiter.api.DynamicNode
import org.junit.jupiter.api.DynamicTest
import org.junit.jupiter.api.fail
import java.net.URL
import kotlin.reflect.jvm.jvmName
Expand Down Expand Up @@ -47,4 +50,15 @@ internal open class TestBase {
assertFails { block() }
}

internal fun dynamicTest(displayName: String, action: suspend CoroutineScope.() -> Unit): DynamicTest {
return DynamicTest.dynamicTest(displayName) { runBlocking(block = action) }
}

internal fun dynamicContainer(
displayName: String,
action: suspend CoroutineScope.() -> Iterable<DynamicNode>
): DynamicContainer {
return DynamicContainer.dynamicContainer(displayName, runBlocking(block = action))
}

}
296 changes: 291 additions & 5 deletions mirai-core-mock/test/mock/MessagingTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@ import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.message.data.MessageSource.Key.recall
import net.mamoe.mirai.mock.MockActions.mockFireRecalled
import net.mamoe.mirai.mock.test.MockBotTestBase
import net.mamoe.mirai.mock.userprofile.MockMemberInfoBuilder
import net.mamoe.mirai.mock.utils.broadcastMockEvents
import net.mamoe.mirai.mock.utils.simpleMemberInfo
import org.junit.jupiter.api.DynamicNode
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
import kotlin.test.assertFails
import kotlin.test.assertNull
import kotlin.test.assertSame
import org.junit.jupiter.api.TestFactory
import kotlin.test.*

internal class MessagingTest : MockBotTestBase() {

Expand Down Expand Up @@ -199,7 +200,7 @@ internal class MessagingTest : MockBotTestBase() {
}.dropMsgChat().let { events ->
assertEquals(5, events.size)
assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
assertNull(operator)
assertSame(sender, operator)
assertSame(sender, author)
}
assertIsInstance<MessageRecallEvent.GroupRecall>(events[1]) {
Expand Down Expand Up @@ -236,4 +237,289 @@ internal class MessagingTest : MockBotTestBase() {
}
}


@Suppress("ComplexRedundantLet")
@Nested
internal inner class MessageRecalling {
@TestFactory
fun `friend messaging`(): Iterable<DynamicNode> {
val myFriend = bot.addFriend(1, "f")

return listOf<DynamicNode>(
dynamicTest("bot recalling") {
val msgBot = myFriend.sendMessage("2")
runAndReceiveEventBroadcast {
msgBot.recall()
}.let { events ->
assertEquals(0, events.size)
}
assertMessageNotAvailable(msgBot.source)
},
dynamicTest("friend recalling") {
val msgFriend = myFriend.says("1")
runAndReceiveEventBroadcast {
msgFriend.recalledBySender()
}.let { events ->
assertEquals(1, events.size)
assertIsInstance<MessageRecallEvent.FriendRecall>(events[0]) {
assertEquals(myFriend, this.operator)
assertContentEquals(msgFriend.source.ids, this.messageIds)
assertContentEquals(msgFriend.source.internalIds, this.messageInternalIds)
}
assertMessageNotAvailable(msgFriend.source)
}
},
dynamicTest("bot recall friend msg failed") {
val msg = myFriend.says("1")
assertFails { msg.recall() }
assertMessageAvailable(msg.source)
},
)
}

@TestFactory
fun `stranger messaging`(): Iterable<DynamicNode> {
val myStranger = bot.addStranger(2, "s")
return listOf<DynamicNode>(
dynamicTest("stranger recalling") {
val msg = myStranger.says("1")
runAndReceiveEventBroadcast {
msg.recalledBySender()
}.let { events ->
assertEquals(0, events.size)
}
assertMessageNotAvailable(msg.source)
},
dynamicTest("bot recalling") {
val msg = myStranger.sendMessage("1")
runAndReceiveEventBroadcast {
msg.recall()
}.let { events ->
assertEquals(0, events.size)
}
assertMessageNotAvailable(msg.source)
},
dynamicTest("bot recall stranger failed") {
val msg = myStranger.says("1")
assertFails { msg.recall() }
assertMessageAvailable(msg.source)
},
)
}

@TestFactory
fun `group messaging`(): Iterable<DynamicNode> = listOf(
dynamicContainer("Normal messaging test") {

val group = bot.addGroup(18451444229, "owner group")
val owner = group.addMember(MockMemberInfoBuilder.create {
uin(184).permission(MemberPermission.OWNER)
})
val administrator = group.addMember(MockMemberInfoBuilder.create {
uin(184).permission(MemberPermission.ADMINISTRATOR)
})
val member = group.addMember(7777, "wapeog")

group.botAsMember.mockApi.permission = MemberPermission.MEMBER


return@dynamicContainer listOf<DynamicNode>(
dynamicTest("member self recalling") {
val msg = member.says("1")
runAndReceiveEventBroadcast { msg.recalledBySender() }.let { events ->
assertEquals(1, events.size)
assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
assertSame(member, this.author)
assertSame(member, operator)
assertContentEquals(msg.source.ids, this.messageIds)
assertContentEquals(msg.source.internalIds, this.messageInternalIds)
}
}
assertMessageNotAvailable(msg.source)
},

dynamicTest("member msg recalled by others") {
val msg = member.says("1")
runAndReceiveEventBroadcast { msg.recalledBy(administrator) }.let { events ->
assertEquals(1, events.size)
assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
assertSame(member, this.author)
assertSame(administrator, operator)
assertContentEquals(msg.source.ids, this.messageIds)
assertContentEquals(msg.source.internalIds, this.messageInternalIds)
}
}
assertMessageNotAvailable(msg.source)
},

dynamicTest("member msg forced recalled by bot") {
val msg = member.says("1")
runAndReceiveEventBroadcast { msg.recalledBy(group.botAsMember) }.let { events ->
assertEquals(1, events.size)
assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
assertSame(member, this.author)
assertSame(null, operator)
assertContentEquals(msg.source.ids, this.messageIds)
assertContentEquals(msg.source.internalIds, this.messageInternalIds)
}
}
assertMessageNotAvailable(msg.source)
},
)
},

dynamicContainer("bot is owner") {
val group = bot.addGroup(8412, "owner group")
val administrator = group.addMember(MockMemberInfoBuilder.create {
uin(184).permission(MemberPermission.ADMINISTRATOR)
})
val member = group.addMember(7777, "wapeog")

assertEquals(group.botPermission, MemberPermission.OWNER)


return@dynamicContainer listOf<DynamicNode>(
dynamicTest("Bot can recall itself message") {
val msg = group.sendMessage("1")
runAndReceiveEventBroadcast { msg.recall() }.let { events ->
assertEquals(1, events.size)
assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
assertSame(group.botAsMember, this.author)
assertSame(null, operator)
assertContentEquals(msg.source.ids, this.messageIds)
assertContentEquals(msg.source.internalIds, this.messageInternalIds)
}
}
assertMessageNotAvailable(msg.source)
},
dynamicTest("Bot can recall administrator message") {
val msg = administrator.says("1")
runAndReceiveEventBroadcast { msg.recall() }.let { events ->
assertEquals(1, events.size)
assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
assertSame(administrator, this.author)
assertSame(null, operator)
assertContentEquals(msg.source.ids, this.messageIds)
assertContentEquals(msg.source.internalIds, this.messageInternalIds)
}
}
assertMessageNotAvailable(msg.source)
},
dynamicTest("Bot can recall member message") {
val msg = member.says("1")
runAndReceiveEventBroadcast { msg.recall() }.let { events ->
assertEquals(1, events.size)
assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
assertSame(member, this.author)
assertSame(null, operator)
assertContentEquals(msg.source.ids, this.messageIds)
assertContentEquals(msg.source.internalIds, this.messageInternalIds)
}
}
assertMessageNotAvailable(msg.source)
},
)
},
dynamicContainer("bot is administrator") {

val group = bot.addGroup(7517, "owner group")
val owner = group.addMember(MockMemberInfoBuilder.create {
uin(184).permission(MemberPermission.OWNER)
})
val administrator = group.addMember(MockMemberInfoBuilder.create {
uin(184).permission(MemberPermission.ADMINISTRATOR)
})
val member = group.addMember(7777, "wapeog")

group.botAsMember.mockApi.permission = MemberPermission.ADMINISTRATOR



return@dynamicContainer listOf<DynamicNode>(
dynamicTest("Bot can recall itself message") {
val msg = group.sendMessage("1")
runAndReceiveEventBroadcast { msg.recall() }.let { events ->
assertEquals(1, events.size)
assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
assertSame(group.botAsMember, this.author)
assertSame(null, operator)
assertContentEquals(msg.source.ids, this.messageIds)
assertContentEquals(msg.source.internalIds, this.messageInternalIds)
}
}
assertMessageNotAvailable(msg.source)
},
dynamicTest("Bot cannot recall owner message") {
val msg = owner.says("1")
assertFails { msg.recall() }
assertMessageAvailable(msg.source)
},
dynamicTest("Bot cannot recall administrator message") {
val msg = administrator.says("1")
assertFails { msg.recall() }
assertMessageAvailable(msg.source)
},
dynamicTest("Bot can recall member message") {
val msg = member.says("1")
runAndReceiveEventBroadcast { msg.recall() }.let { events ->
assertEquals(1, events.size)
assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
assertSame(member, this.author)
assertSame(null, operator)
assertContentEquals(msg.source.ids, this.messageIds)
assertContentEquals(msg.source.internalIds, this.messageInternalIds)
}
}
assertMessageNotAvailable(msg.source)
},
)
},
dynamicContainer("bot is member") {

val group = bot.addGroup(8441117, "owner group")
val owner = group.addMember(MockMemberInfoBuilder.create {
uin(184).permission(MemberPermission.OWNER)
})
val administrator = group.addMember(MockMemberInfoBuilder.create {
uin(184).permission(MemberPermission.ADMINISTRATOR)
})
val member = group.addMember(7777, "wapeog")

group.botAsMember.mockApi.permission = MemberPermission.MEMBER


return@dynamicContainer listOf<DynamicNode>(
dynamicTest("Bot can recall itself message") {
val msg = group.sendMessage("1")
runAndReceiveEventBroadcast { msg.recall() }.let { events ->
assertEquals(1, events.size)
assertIsInstance<MessageRecallEvent.GroupRecall>(events[0]) {
assertSame(group.botAsMember, this.author)
assertSame(null, operator)
assertContentEquals(msg.source.ids, this.messageIds)
assertContentEquals(msg.source.internalIds, this.messageInternalIds)
}
}
assertMessageNotAvailable(msg.source)
},
dynamicTest("Bot cannot recall owner message") {
val msg = owner.says("1")
assertFails { msg.recall() }
assertMessageAvailable(msg.source)
},
dynamicTest("Bot cannot recall administrator message") {
val msg = administrator.says("1")
assertFails { msg.recall() }
assertMessageAvailable(msg.source)
},
dynamicTest("Bot cannot recall member message") {
val msg = member.says("1")
assertFails { msg.recall() }
assertMessageAvailable(msg.source)
},
)
},
)

}
}

0 comments on commit 2b840e2

Please sign in to comment.