2019-06-08 21:52:30 +02:00
package moe.kageru.kagebot
2019-07-11 20:14:22 +02:00
import io.kotlintest.matchers.string.shouldContain
import io.kotlintest.matchers.string.shouldNotContain
2019-06-10 14:15:03 +02:00
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
2019-07-13 15:32:23 +02:00
import moe.kageru.kagebot.config.ConfigParser
2019-06-14 23:16:31 +02:00
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
2019-06-10 14:15:03 +02:00
import org.javacord.api.entity.user.User
2019-06-08 21:52:47 +02:00
import org.javacord.api.event.message.MessageCreateEvent
2019-06-10 14:15:03 +02:00
import org.javacord.core.entity.message.embed.EmbedBuilderDelegateImpl
2019-07-13 15:32:23 +02:00
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 ,
2019-06-10 14:15:03 +02:00
replies : MutableList < String > = mutableListOf ( ) ,
2019-06-14 23:16:31 +02:00
replyEmbeds : MutableList < EmbedBuilder > = mutableListOf ( ) ,
isBot : Boolean = false
2019-06-08 23:51:29 +02:00
) : MessageCreateEvent {
2019-06-14 23:16:31 +02:00
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 { 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-14 23:16:31 +02:00
}
2019-06-08 21:52:47 +02:00
}
2019-06-09 18:41:51 +02:00
2019-06-14 23:16:31 +02:00
fun messageableAuthor ( messages : MutableList < EmbedBuilder > = mutableListOf ( ) ) : User {
2019-06-10 14:15:03 +02:00
return mockk {
2019-06-14 23:16:31 +02:00
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 ( )
) {
2019-06-14 23:16:31 +02:00
val channel = mockk < Optional < ServerTextChannel > > {
2019-06-10 14:15:03 +02:00
every { isPresent } returns true
every { get ( ) } returns mockk {
2019-06-15 12:03:43 +02:00
every { sendMessage ( capture ( sentEmbeds ) ) } returns mockk {
2019-06-14 23:16:31 +02:00
every { join ( ) } returns mockk ( )
every { isCompletedExceptionally } returns false
}
2019-06-15 12:03:43 +02:00
every { sendMessage ( capture ( sentMessages ) ) } returns mockk ( )
2019-06-10 14:15:03 +02:00
}
}
2019-06-14 23:16:31 +02:00
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
}
2019-06-14 23:16:31 +02:00
Globals . api = api
2019-07-13 15:32:23 +02:00
ConfigParser . initialLoad ( RawConfig . read ( " testconfig.toml " ) )
2019-06-09 18:41:51 +02:00
}
2019-06-10 14:15:03 +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 ( )
}
2019-06-14 23:16:31 +02:00
2019-06-15 11:47:11 +02:00
fun < R > withCommands ( config : String , test : ( ( ) -> R ) ) {
2019-07-13 15:39:50 +02:00
val oldCmds = Config . commands
2019-06-14 23:16:31 +02:00
val rawConfig = RawConfig . readFromString ( config )
2019-07-13 15:32:23 +02:00
ConfigParser . reloadCommands ( rawConfig )
2019-06-14 23:16:31 +02:00
test ( )
2019-07-13 15:39:50 +02:00
Config . commands = oldCmds
2019-06-15 11:47:11 +02:00
}
fun < R > withLocalization ( config : String , test : ( ( ) -> R ) ) {
2019-07-13 15:39:50 +02:00
val oldLoc = Config . localization
2019-06-15 11:47:11 +02:00
val rawConfig = RawConfig . readFromString ( config )
2019-07-13 15:32:23 +02:00
ConfigParser . reloadLocalization ( rawConfig )
2019-06-15 11:47:11 +02:00
test ( )
2019-07-13 15:39:50 +02:00
Config . localization = oldLoc
2019-06-14 23:16:31 +02:00
}
2019-07-11 20:14:22 +02:00
2019-07-11 20:39:17 +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
}