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

127 lines
4.9 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
2019-07-13 15:39:50 +02:00
import moe.kageru.kagebot.config.Config
import moe.kageru.kagebot.config.ConfigParser
import moe.kageru.kagebot.config.RawConfig
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.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 {
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()
every { channel.sendMessage(capture(replyEmbeds)) } returns mockk()
every { channel.sendMessage(capture(files)) } returns mockk()
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
every { messageAuthor.asUser() } returns Optional.of(messageableAuthor())
}
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()
}
}
2019-06-15 12:03:43 +02:00
fun prepareTestEnvironment(
sentEmbeds: MutableList<EmbedBuilder> = mutableListOf(),
sentMessages: MutableList<String> = mutableListOf()
) {
val channel = mockk<Optional<ServerTextChannel>> {
every { isPresent } returns true
every { get() } returns mockk {
2019-06-15 12:03:43 +02:00
every { sendMessage(capture(sentEmbeds)) } returns mockk {
every { join() } returns mockk()
every { isCompletedExceptionally } returns false
}
2019-06-15 12:03:43 +02:00
every { sendMessage(capture(sentMessages)) } returns mockk()
}
}
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(mockk {
every { id } returns 1
})
})
2019-06-14 21:23:17 +02:00
}
Globals.api = api
ConfigParser.initialLoad(RawConfig.read("testconfig.toml"))
2019-06-09 18:41:51 +02:00
}
fun testMessageSuccess(content: String, result: String) {
val calls = mutableListOf<String>()
Kagebot.processMessage(mockMessage(content, replies = calls))
calls shouldBe mutableListOf(result)
}
fun embedToString(embed: EmbedBuilder): String {
return (embed.delegate as EmbedBuilderDelegateImpl).toJsonNode().toString()
}
fun <R> withCommands(config: String, test: (() -> R)) {
2019-07-13 15:39:50 +02:00
val oldCmds = Config.commands
val rawConfig = RawConfig.readFromString(config)
ConfigParser.reloadCommands(rawConfig)
test()
2019-07-13 15:39:50 +02:00
Config.commands = oldCmds
}
fun <R> withLocalization(config: String, test: (() -> R)) {
2019-07-13 15:39:50 +02:00
val oldLoc = Config.localization
val rawConfig = RawConfig.readFromString(config)
ConfigParser.reloadLocalization(rawConfig)
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
}