Skip to content

Commit

Permalink
Fix incorrect creation of CommandSyntaxException with cause
Browse files Browse the repository at this point in the history
Previously `initCause` was failing because `CommandSyntaxException` is
created by Brigadier in a way which does not permit setting a cause.
Therefore, now instead add the cause exception as 'suppressed'.
  • Loading branch information
Marcono1234 committed Jul 17, 2024
1 parent dc5693a commit 2dad2ec
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class ListUserActivityCommand(
is Either.Left ->
throw CommandExceptions.CANNOT_QUERY_USER_ACTIVITY
.create(sanitizedUserName, jql)
.initCause(either.a)
.apply { addSuppressed(either.a) }

is Either.Right -> either.b
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ class RemoveContentCommand(
is Either.Left ->
throw CommandExceptions.CANNOT_QUERY_USER_ACTIVITY
.create(sanitizedUserName, jql)
.initCause(either.a)
.apply { addSuppressed(either.a) }

is Either.Right -> either.b
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@ package io.github.mojira.arisa.modules.commands

import arrow.core.Either
import arrow.core.extensions.fx
import arrow.core.left
import com.mojang.brigadier.exceptions.CommandSyntaxException
import io.github.mojira.arisa.utils.mockIssue
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.booleans.shouldBeTrue
import io.kotest.matchers.collections.shouldContainExactly
import io.kotest.matchers.nulls.shouldNotBeNull
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
Expand Down Expand Up @@ -72,7 +76,23 @@ class ListUserActivityCommandTest : StringSpec({
comment.shouldNotBeNull()
commentRestriction shouldBe "staff"

// Should contain sanitized user name
comment shouldStartWith "No unrestricted comments from user \"user?Name\" were found."
val expectedSanitizedUser = "user?Name"
comment shouldStartWith "No unrestricted comments from user \"$expectedSanitizedUser\" were found."
}

"should throw with suppressed exception when querying activity fails" {
val searchException = Exception("test exception")
val command = ListUserActivityCommand { _, _ ->
searchException.left()
}

val issue = mockIssue()
val user = "user\nName"
val exception = shouldThrow<CommandSyntaxException> {
command(issue, user)
}
val expectedSanitizedUser = "user?Name"
exception.message shouldStartWith "Could not query activity of user \"$expectedSanitizedUser\". Query string: "
exception.suppressed.shouldContainExactly(searchException)
}
})
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@ package io.github.mojira.arisa.modules.commands

import arrow.core.left
import arrow.core.right
import com.mojang.brigadier.exceptions.CommandSyntaxException
import io.github.mojira.arisa.utils.mockIssue
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.booleans.shouldBeTrue
import io.kotest.matchers.collections.shouldContainExactly
import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
import io.kotest.matchers.nulls.shouldNotBeNull
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
import io.kotest.matchers.string.shouldStartWith
import io.mockk.mockk
import net.rcarz.jiraclient.Issue

Expand Down Expand Up @@ -178,4 +182,22 @@ class RemoveContentCommandTest : StringSpec({
// Should contain sanitized user name
comment shouldContain "evil?User"
}

"should throw with suppressed exception when querying activity fails" {
val searchException = Exception("test exception")
val command = RemoveContentCommand(
searchIssues = { _, _ -> searchException.left() },
getIssue = { throw AssertionError("not needed for test") },
execute = { throw AssertionError("not needed for test") }
)

val issue = mockIssue()
val user = "user\nName"
val exception = shouldThrow<CommandSyntaxException> {
command(issue, user)
}
val expectedSanitizedUser = "user?Name"
exception.message shouldStartWith "Could not query activity of user \"$expectedSanitizedUser\". Query string: "
exception.suppressed.shouldContainExactly(searchException)
}
})

0 comments on commit 2dad2ec

Please sign in to comment.