diff --git a/modules/jooby-test/src/main/java/io/jooby/test/MockRouter.java b/modules/jooby-test/src/main/java/io/jooby/test/MockRouter.java index 6c9564bb9a..0cfd91ce15 100644 --- a/modules/jooby-test/src/main/java/io/jooby/test/MockRouter.java +++ b/modules/jooby-test/src/main/java/io/jooby/test/MockRouter.java @@ -18,6 +18,7 @@ import io.jooby.Router; import io.jooby.SneakyThrows; import io.jooby.WebSocket; +import io.jooby.problem.ProblemDetailsHandler; /** * Utility class that allows us to execute routes using a {@link MockContext}. @@ -74,6 +75,9 @@ public Object value() { * @param application Source application. */ public MockRouter(@NonNull Jooby application) { + if (application.problemDetailsIsEnabled()) { + application.error(ProblemDetailsHandler.from(application.getConfig())); + } this.supplier = () -> application; } @@ -472,6 +476,8 @@ public void tryError(Throwable cause, Consumer consumer) { */ public void tryError(Throwable cause, Context ctx) { var app = supplier.get(); + MockContext findContext = ctx instanceof MockContext ? (MockContext) ctx : newContext(); + findContext.setRouter(app); var handler = app.getErrorHandler(); handler.apply(ctx, cause, app.errorCode(cause)); } diff --git a/tests/src/test/java/io/jooby/i3787/Application.java b/tests/src/test/java/io/jooby/i3787/Application.java new file mode 100644 index 0000000000..af2968dc7c --- /dev/null +++ b/tests/src/test/java/io/jooby/i3787/Application.java @@ -0,0 +1,33 @@ +package io.jooby.i3787; + +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; +import io.jooby.Jooby; +import io.jooby.problem.HttpProblem; + +import java.util.Map; + +class Application extends Jooby { + { + Config problemDetailsConfig = ConfigFactory.parseMap( + Map.of("problem.details.enabled", true) + ); + getEnvironment().setConfig(problemDetailsConfig.withFallback(getConfig())); + + get("/throw", ctx -> { + throw new CustomException(); + }); + + error(CustomException.class, (ctx, throwable, statusCode) -> { + var problem = HttpProblem.badRequest("A Client Error — Obviously"); + ctx.getRouter().getErrorHandler().apply(ctx, problem, statusCode); + }); + } + + public static void main(String[] args) { + runApp(args, Application::new); + } + + static class CustomException extends RuntimeException { + } +} diff --git a/tests/src/test/java/io/jooby/i3787/Issue3787.java b/tests/src/test/java/io/jooby/i3787/Issue3787.java new file mode 100644 index 0000000000..4f0f50ad0c --- /dev/null +++ b/tests/src/test/java/io/jooby/i3787/Issue3787.java @@ -0,0 +1,20 @@ +package io.jooby.i3787; + +import io.jooby.StatusCode; +import io.jooby.test.MockContext; +import io.jooby.test.MockRouter; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class Issue3787 { + + private final MockRouter router = new MockRouter(new Application()).setFullExecution(true); + + @Test + void issue3787() { + var ctx = new MockContext(); + router.tryError(new Application.CustomException(), ctx); + assertEquals(StatusCode.BAD_REQUEST, ctx.getResponseCode()); + } +}