2019-06-15 14:35:17 +02:00
package moe.kageru.kagebot.command
2019-06-08 21:52:30 +02:00
2019-06-09 18:41:51 +02:00
import io.kotlintest.matchers.string.shouldContain
2019-06-08 21:52:47 +02:00
import io.kotlintest.shouldBe
import io.kotlintest.specs.StringSpec
2019-06-08 23:51:29 +02:00
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
2019-06-15 14:35:17 +02:00
import moe.kageru.kagebot.Globals
2019-06-14 23:16:31 +02:00
import moe.kageru.kagebot.Globals.config
2019-06-15 14:35:17 +02:00
import moe.kageru.kagebot.Kagebot
import moe.kageru.kagebot.TestUtil
2019-06-10 14:15:03 +02:00
import moe.kageru.kagebot.TestUtil.embedToString
import moe.kageru.kagebot.TestUtil.messageableAuthor
import moe.kageru.kagebot.TestUtil.mockMessage
import moe.kageru.kagebot.TestUtil.testMessageSuccess
2019-06-15 11:47:11 +02:00
import moe.kageru.kagebot.TestUtil.withCommands
import moe.kageru.kagebot.TestUtil.withLocalization
2019-06-09 18:41:51 +02:00
import org.javacord.api.entity.message.embed.EmbedBuilder
2019-06-14 23:16:31 +02:00
import java.util.*
2019-06-08 21:52:47 +02:00
class CommandTest : StringSpec ( {
2019-06-14 23:16:31 +02:00
TestUtil . prepareTestEnvironment ( )
2019-06-08 21:52:47 +02:00
" should match prefix command " {
2019-06-15 11:47:11 +02:00
withCommands (
2019-06-14 23:16:31 +02:00
"""
[[command] ]
trigger = " !ping "
response = " pong "
""" .trimIndent()
) {
testMessageSuccess ( " !ping " , " pong " )
}
2019-06-08 21:52:47 +02:00
}
2019-07-07 10:54:20 +02:00
" should print embed for command " {
val calls = mutableListOf < EmbedBuilder > ( )
TestUtil . prepareTestEnvironment ( calls )
val heading = " heading 1 "
val content = " this is the first paragraph of the embed "
withCommands (
"""
[[command] ]
trigger = " !embed "
embed = { " $heading " = " $content " }
""" .trimIndent()
) {
Kagebot . processMessage ( mockMessage ( " !embed " , replyEmbeds = calls ) )
calls . size shouldBe 1
embedToString ( calls [ 0 ] ) shouldContain " \" $heading \" "
embedToString ( calls [ 0 ] ) shouldContain " \" $content \" "
}
}
2019-06-08 21:52:47 +02:00
" should match contains command " {
2019-06-15 11:47:11 +02:00
withCommands (
2019-06-14 23:16:31 +02:00
"""
[[command] ]
trigger = " somewhere "
response = " found it "
matchType = " CONTAINS "
""" .trimIndent()
) {
testMessageSuccess ( " the trigger is somewhere in this message " , " found it " )
}
2019-06-08 21:52:47 +02:00
}
" should match regex command " {
2019-06-15 11:47:11 +02:00
withCommands (
2019-06-14 23:16:31 +02:00
"""
[[command] ]
trigger = " A.+B "
response = " regex matched "
matchType = " REGEX "
""" .trimIndent()
) {
testMessageSuccess ( " AcsdB " , " regex matched " )
}
2019-06-08 21:52:47 +02:00
}
" should ping author " {
2019-06-15 11:47:11 +02:00
withCommands (
2019-06-14 23:16:31 +02:00
"""
[[command] ]
trigger = " answer me "
response = " @@ there you go "
""" .trimIndent()
) {
testMessageSuccess ( " answer me " , " <@1> there you go " )
}
2019-06-08 23:51:29 +02:00
}
" should not react to own message " {
2019-06-15 11:47:11 +02:00
withCommands (
2019-06-14 23:16:31 +02:00
"""
[[command] ]
trigger = " !ping "
response = " pong "
""" .trimIndent()
) {
val calls = mutableListOf < String > ( )
Kagebot . processMessage ( mockMessage ( " !ping " , replies = calls , isBot = true ) )
calls shouldBe mutableListOf ( )
}
2019-06-08 23:51:29 +02:00
}
2019-06-10 14:15:03 +02:00
" should delete messages and send copy to author " {
2019-06-15 11:47:11 +02:00
withCommands (
2019-06-14 23:16:31 +02:00
"""
[[command] ]
trigger = " delet this "
[command.action]
delete = true
""" .trimIndent()
) {
val replies = mutableListOf < EmbedBuilder > ( )
val messageContent = " delet this "
val mockMessage = mockMessage ( messageContent )
every { mockMessage . deleteMessage ( ) } returns mockk ( )
every { mockMessage . messageAuthor . asUser ( ) } returns Optional . of ( messageableAuthor ( replies ) )
Kagebot . processMessage ( mockMessage )
verify ( exactly = 1 ) { mockMessage . deleteMessage ( ) }
replies . size shouldBe 1
embedToString ( replies [ 0 ] ) shouldContain messageContent
}
2019-06-08 21:52:47 +02:00
}
2019-06-09 01:04:00 +02:00
" should refuse command without permissions " {
2019-06-15 11:47:11 +02:00
withCommands (
2019-06-14 23:16:31 +02:00
"""
[[command] ]
trigger = " !restricted "
response = " access granted "
[command.permissions]
hasOneOf = [
" testrole " ,
]
""" .trimIndent()
) {
val replies = mutableListOf < String > ( )
val mockMessage = mockMessage ( " !restricted " , replies = replies )
Kagebot . processMessage ( mockMessage )
replies shouldBe mutableListOf ( config . localization . permissionDenied )
2019-06-15 11:47:11 +02:00
withLocalization (
"""
[localization]
permissionDenied = " "
messageDeleted = " whatever "
redirectedMessage = " asdja "
""" .trimIndent()
) {
Kagebot . processMessage ( mockMessage )
// still one string in there from earlier, nothing new was added
replies . size shouldBe 1
}
2019-06-14 23:16:31 +02:00
}
2019-06-09 01:04:00 +02:00
}
" should accept restricted command for owner " {
2019-06-15 11:47:11 +02:00
withCommands (
2019-06-14 23:16:31 +02:00
"""
[[command] ]
trigger = " !restricted "
response = " access granted "
[command.permissions]
hasOneOf = [
" testrole "
]
""" .trimIndent()
) {
val calls = mutableListOf < String > ( )
val mockMessage = mockMessage ( " !restricted " , replies = calls )
every { mockMessage . messageAuthor . isBotOwner } returns true
Kagebot . processMessage ( mockMessage )
calls shouldBe mutableListOf ( " access granted " )
}
2019-06-09 01:04:00 +02:00
}
" should accept restricted command with permissions " {
2019-06-15 11:47:11 +02:00
withCommands (
2019-06-14 23:16:31 +02:00
"""
[[command] ]
trigger = " !restricted "
response = " access granted "
[command.permissions]
hasOneOf = [
" testrole "
]
""" .trimIndent()
) {
val calls = mutableListOf < String > ( )
val mockMessage = mockMessage ( " !restricted " , replies = calls )
every { mockMessage . messageAuthor . asUser ( ) } returns Optional . of ( mockk {
every { getRoles ( any ( ) ) } returns listOf (
Globals . server . getRolesByNameIgnoreCase ( " testrole " ) [ 0 ]
)
} )
Kagebot . processMessage ( mockMessage )
calls shouldBe mutableListOf ( " access granted " )
2019-06-10 08:32:18 +02:00
}
2019-06-09 01:04:00 +02:00
}
2019-06-10 09:19:03 +02:00
" should deny command to excluded roles " {
2019-06-15 11:47:11 +02:00
withCommands (
2019-06-14 23:16:31 +02:00
"""
[[command] ]
trigger = " !almostUnrestricted "
response = " access granted "
[command.permissions]
hasNoneOf = [ " testrole " ]
""" .trimIndent()
) {
val calls = mutableListOf < String > ( )
val mockMessage = mockMessage ( " !almostUnrestricted " , replies = calls )
// with the banned role
every { mockMessage . messageAuthor . asUser ( ) } returns mockk {
every { isPresent } returns true
every { get ( ) . getRoles ( any ( ) ) } returns listOf (
Globals . server . getRolesByNameIgnoreCase ( " testrole " ) [ 0 ]
)
}
Kagebot . processMessage ( mockMessage )
2019-06-10 09:19:03 +02:00
2019-06-14 23:16:31 +02:00
// without the role
every { mockMessage . messageAuthor . asUser ( ) } returns mockk {
every { isPresent } returns true
every { get ( ) . getRoles ( any ( ) ) } returns emptyList ( )
}
Kagebot . processMessage ( mockMessage )
calls shouldBe mutableListOf ( config . localization . permissionDenied , " access granted " )
}
}
" should refuse DM only message in server channel " {
2019-06-15 11:47:11 +02:00
withCommands (
2019-06-14 23:16:31 +02:00
"""
[[command] ]
trigger = " !dm "
response = " access granted "
[command.permissions]
onlyDM = true
""" .trimIndent()
) {
val calls = mutableListOf < String > ( )
Kagebot . processMessage ( mockMessage ( " !dm " , replies = calls ) )
calls shouldBe listOf ( config . localization . permissionDenied )
2019-06-10 09:19:03 +02:00
}
}
2019-06-10 08:32:18 +02:00
/ *
* This implicitly tests that the message author is not included in anonymous complaints
* because getting the author ’ s name from the mock is undefined .
* /
2019-06-09 18:41:51 +02:00
" should redirect " {
val calls = mutableListOf < EmbedBuilder > ( )
2019-06-14 23:16:31 +02:00
TestUtil . prepareTestEnvironment ( calls )
2019-06-15 11:47:11 +02:00
withCommands (
2019-06-14 23:16:31 +02:00
"""
[[command] ]
trigger = " !redirect "
response = " redirected "
[command.action.redirect]
target = " testchannel "
anonymous = true
""" .trimIndent()
) {
val message = " this is a message "
Kagebot . processMessage ( mockMessage ( " !redirect $message " , replyEmbeds = calls ) )
calls . size shouldBe 1
embedToString ( calls [ 0 ] ) shouldContain " \" $message \" "
}
2019-06-08 21:52:47 +02:00
}
2019-06-10 14:15:03 +02:00
} )