Skip to content

Commit

Permalink
[FIX] errorOutVariantsPrepend should try to match passed variants b…
Browse files Browse the repository at this point in the history
…efore falling back to the default one (#3698)
  • Loading branch information
mkubala committed Apr 18, 2024
1 parent 59e48b9 commit 13708c2
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 16 deletions.
2 changes: 1 addition & 1 deletion core/src/main/scala/sttp/tapir/Endpoint.scala
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ trait EndpointErrorOutputVariantsOps[A, I, E, O, -R] {

/** Same as [[errorOutVariantPrepend]], but allows appending multiple variants in one go. */
def errorOutVariantsPrepend[E2 >: E](first: OneOfVariant[_ <: E2], other: OneOfVariant[_ <: E2]*): EndpointType[A, I, E2, O, R] =
withErrorOutputVariant(oneOf[E2](oneOfDefaultVariant(errorOutput), first +: other: _*), identity)
withErrorOutputVariant(oneOf[E2](first, other :+ oneOfDefaultVariant(errorOutput): _*), identity)

/** Same as [[errorOutVariant]], but allows appending multiple variants in one go. */
def errorOutVariants[E2 >: E](first: OneOfVariant[_ <: E2], other: OneOfVariant[_ <: E2]*)(implicit
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,18 @@
package sttp.tapir.server.tests

import cats.implicits._
import org.scalatest.matchers.should.Matchers._
import io.circe.generic.auto._
import org.scalatest.EitherValues._
import org.scalatest.matchers.should.Matchers._
import sttp.client3._
import sttp.model._
import sttp.monad.MonadError
import sttp.tapir._
import sttp.tapir.tests.OneOf.{
in_int_out_value_form_exact_match,
in_string_out_error_detail_nested,
in_string_out_status_from_string,
in_string_out_status_from_string_one_empty,
in_string_out_status_from_type_erasure_using_partial_matcher,
out_empty_or_default_json_output,
out_json_or_default_json,
out_json_or_empty_output_no_content
}
import sttp.tapir.tests._
import sttp.tapir.tests.data._
import sttp.tapir.generic.auto._
import sttp.tapir.json.circe.jsonBody
import io.circe.generic.auto._
import sttp.tapir.tests.OneOf._
import sttp.tapir.tests._
import sttp.tapir.tests.data._
import sttp.tapir.{oneOf, _}

class ServerOneOfTests[F[_], OPTIONS, ROUTE](
createServerTest: CreateServerTest[F, Any, OPTIONS, ROUTE]
Expand Down Expand Up @@ -135,6 +126,50 @@ class ServerOneOfTests[F[_], OPTIONS, ROUTE](
r.code shouldBe StatusCode.BadRequest
r.body shouldBe """{"msg":"unknown"}"""
}
},
testServerLogic(
endpoint
.errorOut(
oneOf[FruitErrorDetail](
oneOfDefaultVariant(statusCode(StatusCode.InternalServerError).and(jsonBody[FruitErrorDetail.Unknown]))
)
)
.in("test")
.out(plainBody[String])
.errorOutVariantsPrepend(
oneOfVariant(StatusCode.Conflict, jsonBody[FruitErrorDetail.AlreadyPicked]),
oneOfVariant(StatusCode.NotFound, jsonBody[FruitErrorDetail.NotYetGrown])
)
.serverLogic(_ => pureResult(FruitErrorDetail.NotYetGrown(7).asLeft[String])),
".errorOutVariantsPrepend variant takes precedence over devault .errorOut variant"
) { (backend, baseUri) =>
basicRequest.response(asStringAlways).get(uri"$baseUri/test").send(backend).map { r =>
r.code shouldBe StatusCode.NotFound
}
},
testServerLogic(
endpoint
.errorOut(
oneOf[FruitErrorDetail](
oneOfDefaultVariant(statusCode(StatusCode.InternalServerError).and(jsonBody[FruitErrorDetail.Unknown]))
)
)
.in("test")
.out(plainBody[String])
.errorOutVariantsPrepend(
oneOfVariant(StatusCode.Conflict, jsonBody[FruitErrorDetail.AlreadyPicked]),
oneOfVariant(StatusCode.NotFound, jsonBody[FruitErrorDetail.NotYetGrown])
)
.errorOutVariantsPrepend(
oneOfVariant(StatusCode.BadRequest, jsonBody[FruitErrorDetail.AlreadyPicked])
)
.serverLogic(_ => pureResult(FruitErrorDetail.AlreadyPicked("cherry").asLeft[String])),
"multiple .errorOutVariantsPrepend variants are executed in right order (a stack)"
) { (backend, baseUri) =>
basicRequest.response(asStringAlways).get(uri"$baseUri/test").send(backend).map { r =>
r.code shouldBe StatusCode.BadRequest
}
}

)
}

0 comments on commit 13708c2

Please sign in to comment.