discord-kagebot/src/test/kotlin/moe/kageru/kagebot/TestUtil.kt

149 lines
6.0 KiB
Kotlin
Raw Normal View History

package moe.kageru.kagebot
2019-07-11 20:14:22 +02:00
import io.kotlintest.matchers.string.shouldContain
import io.kotlintest.matchers.string.shouldNotContain
import io.kotlintest.shouldBe
2019-06-09 18:41:51 +02:00
import io.mockk.Runs
2019-06-08 21:52:47 +02:00
import io.mockk.every
2019-06-09 18:41:51 +02:00
import io.mockk.just
2019-06-08 21:52:47 +02:00
import io.mockk.mockk
import moe.kageru.kagebot.Kagebot.process
2019-07-13 15:39:50 +02:00
import moe.kageru.kagebot.config.Config
import moe.kageru.kagebot.config.ConfigParser
import org.javacord.api.DiscordApi
2019-06-09 18:41:51 +02:00
import org.javacord.api.entity.channel.ServerTextChannel
import org.javacord.api.entity.message.embed.EmbedBuilder
import org.javacord.api.entity.permission.Role
import org.javacord.api.entity.user.User
2019-06-08 21:52:47 +02:00
import org.javacord.api.event.message.MessageCreateEvent
import org.javacord.core.entity.message.embed.EmbedBuilderDelegateImpl
import java.io.File
import java.util.*
2019-06-08 21:52:47 +02:00
object TestUtil {
private val TIMEOUT_ROLE = mockk<Role> {
every { id } returns 123
}
val TEST_ROLE = mockk<Role> {
every { id } returns 1
every { isManaged } returns false
}
2019-06-08 23:51:29 +02:00
fun mockMessage(
content: String,
replies: MutableList<String> = mutableListOf(),
replyEmbeds: MutableList<EmbedBuilder> = mutableListOf(),
files: MutableList<File> = mutableListOf(),
isBot: Boolean = false
2019-06-08 23:51:29 +02:00
): MessageCreateEvent {
return mockk {
every { messageContent } returns content
every { readableMessageContent } returns content
every { channel.sendMessage(capture(replies)) } returns mockk(relaxed = true) {
every { isCompletedExceptionally } returns false
}
every { channel.sendMessage(capture(replyEmbeds)) } returns mockk(relaxed = true) {
every { isCompletedExceptionally } returns false
}
every { channel.sendMessage(capture(files)) } returns mockk(relaxed = true) {
every { isCompletedExceptionally } returns false
}
every { message.canYouDelete() } returns true
every { isPrivateMessage } returns false
2019-06-15 14:35:17 +02:00
// We can’t use a nested mock here because other fields of messageAuthor might
// get overwritten by other tests, which would delete a nested mock.
every { messageAuthor.id } returns 1
every { messageAuthor.discriminatedName } returns "testuser#1234"
every { messageAuthor.isBotUser } returns isBot
every { messageAuthor.isYourself } returns isBot
every { messageAuthor.isBotOwner } returns false
2019-07-25 21:24:46 +02:00
every { messageAuthor.asUser() } returns Optional.of(messageableAuthor(replyEmbeds))
}
2019-06-08 21:52:47 +02:00
}
2019-06-09 18:41:51 +02:00
fun messageableAuthor(messages: MutableList<EmbedBuilder> = mutableListOf()): User {
return mockk {
every { getRoles(any()) } returns emptyList()
every { sendMessage(capture(messages)) } returns mockk(relaxed = true)
}
}
2019-06-15 12:03:43 +02:00
fun prepareTestEnvironment(
sentEmbeds: MutableList<EmbedBuilder> = mutableListOf(),
sentMessages: MutableList<String> = mutableListOf(),
dmEmbeds: MutableList<EmbedBuilder> = mutableListOf()
2019-06-15 12:03:43 +02:00
) {
val channel = mockk<Optional<ServerTextChannel>>(relaxed = true) {
every { isPresent } returns true
every { get() } returns mockk {
every { sendMessage(capture(sentEmbeds)) } returns mockk(relaxed = true) {
every { join() } returns mockk {
every { isCompletedExceptionally } returns false
}
every { isCompletedExceptionally } returns false
}
every { sendMessage(capture(sentMessages)) } returns mockk(relaxed = true)
}
}
val api = mockk<DiscordApi> {
every { getServerById(any<String>()) } returns Optional.of(mockk {
every { icon.ifPresent(any()) } just Runs
every { getTextChannelById(any<String>()) } returns channel
every { getTextChannelsByName(any()) } returns listOf(channel.get())
every { getRolesByNameIgnoreCase("testrole") } returns listOf(TEST_ROLE)
every { getRolesByNameIgnoreCase("timeout") } returns listOf(TIMEOUT_ROLE)
every { getMembersByName(any()) } returns listOf(mockk(relaxed = true) {
every { id } returns 123
every { getRoles(any()) } returns listOf(TEST_ROLE)
every { sendMessage(capture(dmEmbeds)) } returns mockk(relaxed = true) {
every { isCompletedExceptionally } returns false
}
})
})
2019-06-14 21:23:17 +02:00
}
Globals.api = api
ConfigParser.initialLoad("testconfig.toml")
2019-06-09 18:41:51 +02:00
}
fun testMessageSuccess(content: String, result: String) {
val calls = mutableListOf<String>()
mockMessage(content, replies = calls).process()
calls shouldBe mutableListOf(result)
}
fun embedToString(embed: EmbedBuilder): String {
return (embed.delegate as EmbedBuilderDelegateImpl).toJsonNode().toString()
}
fun withCommands(config: String, test: (() -> Unit)) {
val oldCmds = Config.commandConfig
Config.commandConfig = Config.commandSpec.string(config)
test()
Config.commandConfig = oldCmds
}
fun withLocalization(config: String, test: (() -> Unit)) {
2019-07-13 15:39:50 +02:00
val oldLoc = Config.localization
Config.localization = Config.localeSpec.string(config)
test()
2019-07-13 15:39:50 +02:00
Config.localization = oldLoc
}
2019-07-11 20:14:22 +02:00
fun withReplyContents(
expected: List<String> = emptyList(),
unexpected: List<String> = emptyList(),
op: (MutableList<EmbedBuilder>) -> Unit
) {
2019-07-11 20:14:22 +02:00
val replies = mutableListOf<EmbedBuilder>()
op(replies)
replies.size shouldBe 1
val replyString = embedToString(replies[0])
for (string in expected) {
replyString shouldContain string
}
for (string in unexpected) {
replyString shouldNotContain string
}
}
2019-07-13 14:52:05 +02:00
}