From 17eab1f3d404afefe6bf48c46639b33aedd41082 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Sat, 5 Apr 2025 20:45:57 -0500 Subject: [PATCH] Increase tests on ProcessBasedRouter (which of course led to some improvements!) --- .../routeproviders/ProcessBasedRouter.java | 3 +- .../ProcessBasedRouterPayload.java | 137 +++++++++--------- .../qqq/backend/javalin/TestUtils.java | 32 +++- .../QApplicationJavalinServerTest.java | 26 +++- 4 files changed, 126 insertions(+), 72 deletions(-) diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/routeproviders/ProcessBasedRouter.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/routeproviders/ProcessBasedRouter.java index 10ff7b5d..02dad90b 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/routeproviders/ProcessBasedRouter.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/routeproviders/ProcessBasedRouter.java @@ -31,7 +31,6 @@ import com.kingsrook.qqq.backend.core.actions.customizers.QCodeLoader; import com.kingsrook.qqq.backend.core.actions.processes.RunProcessAction; import com.kingsrook.qqq.backend.core.actions.tables.StorageAction; import com.kingsrook.qqq.backend.core.context.QContext; -import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessInput; import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessOutput; @@ -258,7 +257,7 @@ public class ProcessBasedRouter implements QJavalinRouteProviderInterface return; } - throw (new QException("No response value was set in the process output state.")); + LOG.debug("No response value was set in the process output state."); } catch(Exception e) { diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/routeproviders/ProcessBasedRouterPayload.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/routeproviders/ProcessBasedRouterPayload.java index 5bfafbe9..8d754469 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/routeproviders/ProcessBasedRouterPayload.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/routeproviders/ProcessBasedRouterPayload.java @@ -22,6 +22,7 @@ package com.kingsrook.qqq.middleware.javalin.routeproviders; +import java.util.List; import java.util.Map; import com.kingsrook.qqq.backend.core.model.actions.processes.ProcessState; import com.kingsrook.qqq.backend.core.model.actions.processes.QProcessPayload; @@ -34,12 +35,12 @@ import com.kingsrook.qqq.backend.core.model.actions.processes.QProcessPayload; *******************************************************************************/ public class ProcessBasedRouterPayload extends QProcessPayload { - private String path; - private String method; - private Map pathParams; - private Map queryParams; - private Map formParams; - private Map cookies; + private String path; + private String method; + private Map pathParams; + private Map> queryParams; + private Map> formParams; + private Map cookies; private Integer statusCode; private String redirectURL; @@ -163,68 +164,6 @@ public class ProcessBasedRouterPayload extends QProcessPayload - /******************************************************************************* - ** Getter for queryParams - *******************************************************************************/ - public Map getQueryParams() - { - return (this.queryParams); - } - - - - /******************************************************************************* - ** Setter for queryParams - *******************************************************************************/ - public void setQueryParams(Map queryParams) - { - this.queryParams = queryParams; - } - - - - /******************************************************************************* - ** Fluent setter for queryParams - *******************************************************************************/ - public ProcessBasedRouterPayload withQueryParams(Map queryParams) - { - this.queryParams = queryParams; - return (this); - } - - - - /******************************************************************************* - ** Getter for formParams - *******************************************************************************/ - public Map getFormParams() - { - return (this.formParams); - } - - - - /******************************************************************************* - ** Setter for formParams - *******************************************************************************/ - public void setFormParams(Map formParams) - { - this.formParams = formParams; - } - - - - /******************************************************************************* - ** Fluent setter for formParams - *******************************************************************************/ - public ProcessBasedRouterPayload withFormParams(Map formParams) - { - this.formParams = formParams; - return (this); - } - - - /******************************************************************************* ** Getter for cookies *******************************************************************************/ @@ -409,4 +348,66 @@ public class ProcessBasedRouterPayload extends QProcessPayload return (this); } + + + /******************************************************************************* + ** Getter for queryParams + *******************************************************************************/ + public Map> getQueryParams() + { + return (this.queryParams); + } + + + + /******************************************************************************* + ** Setter for queryParams + *******************************************************************************/ + public void setQueryParams(Map> queryParams) + { + this.queryParams = queryParams; + } + + + + /******************************************************************************* + ** Fluent setter for queryParams + *******************************************************************************/ + public ProcessBasedRouterPayload withQueryParams(Map> queryParams) + { + this.queryParams = queryParams; + return (this); + } + + + + /******************************************************************************* + ** Getter for formParams + *******************************************************************************/ + public Map> getFormParams() + { + return (this.formParams); + } + + + + /******************************************************************************* + ** Setter for formParams + *******************************************************************************/ + public void setFormParams(Map> formParams) + { + this.formParams = formParams; + } + + + + /******************************************************************************* + ** Fluent setter for formParams + *******************************************************************************/ + public ProcessBasedRouterPayload withFormParams(Map> formParams) + { + this.formParams = formParams; + return (this); + } + } diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java index d1e31bd0..59ae8177 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/TestUtils.java @@ -28,6 +28,7 @@ import java.sql.Connection; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; import com.kingsrook.qqq.backend.core.actions.customizers.TableCustomizerInterface; @@ -202,6 +203,7 @@ public class TestUtils routeProviders.add(new JavalinRouteProviderMetaData() .withHostedPath("/served-by-process/") + .withMethods(List.of("GET", "POST", "PUT", "PATCH", "DELETE")) .withProcessName("routerProcess")); routeProviders.add(new JavalinRouteProviderMetaData() @@ -242,7 +244,35 @@ public class TestUtils { ProcessBasedRouterPayload processPayload = runBackendStepInput.getProcessPayload(ProcessBasedRouterPayload.class); String path = processPayload.getPath(); - processPayload.setResponseString("So you've asked for: " + path); + + if(processPayload.getQueryParams().containsKey("requestedRedirect")) + { + processPayload.setRedirectURL(processPayload.getQueryParams().get("requestedRedirect").get(0)); + } + else + { + String response = "So you've done a " + processPayload.getMethod() + " for: " + path; + if(processPayload.getQueryParams().containsKey("respondInBytes")) + { + processPayload.setResponseBytes(response.getBytes(StandardCharsets.UTF_8)); + } + else if(processPayload.getQueryParams().containsKey("noResponse")) + { + /////////////////////////////////////// + // don't call any setResponse method // + /////////////////////////////////////// + } + else if(processPayload.getQueryParams().containsKey("doThrow")) + { + throw (new QException("Test Exception")); + } + else + { + processPayload.setResponseString(response); + } + processPayload.setResponseHeaders(Map.of("X-Test", "Yes, Test")); + processPayload.setStatusCode(200); + } runBackendStepOutput.setProcessPayload(processPayload); })) )); diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/middleware/javalin/QApplicationJavalinServerTest.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/middleware/javalin/QApplicationJavalinServerTest.java index 365cabec..e9af97fe 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/middleware/javalin/QApplicationJavalinServerTest.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/middleware/javalin/QApplicationJavalinServerTest.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.middleware.javalin; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.instances.AbstractQQQApplication; @@ -36,6 +37,7 @@ import org.json.JSONObject; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -237,7 +239,29 @@ class QApplicationJavalinServerTest HttpResponse response = Unirest.get("http://localhost:" + PORT + "/served-by-process/foo.html").asString(); assertEquals(200, response.getStatus()); - assertEquals("So you've asked for: /served-by-process/foo.html", response.getBody()); + assertEquals("So you've done a GET for: /served-by-process/foo.html", response.getBody()); + + response = Unirest.post("http://localhost:" + PORT + "/served-by-process/foo.html").asString(); + assertEquals(200, response.getStatus()); + assertEquals("So you've done a POST for: /served-by-process/foo.html", response.getBody()); + assertEquals("Yes, Test", response.getHeaders().getFirst("X-Test")); + + response = Unirest.put("http://localhost:" + PORT + "/served-by-process/foo.html?requestedRedirect=google.com").asString(); + assertEquals(302, response.getStatus()); + assertEquals("google.com", response.getHeaders().getFirst("Location")); + + HttpResponse responseBytes = Unirest.delete("http://localhost:" + PORT + "/served-by-process/foo.html?respondInBytes=true").asBytes(); + assertEquals(200, responseBytes.getStatus()); + assertArrayEquals("So you've done a DELETE for: /served-by-process/foo.html".getBytes(StandardCharsets.UTF_8), responseBytes.getBody()); + + response = Unirest.get("http://localhost:" + PORT + "/served-by-process/foo.html?noResponse=true").asString(); + assertEquals(200, response.getStatus()); + assertEquals("", response.getBody()); + + response = Unirest.get("http://localhost:" + PORT + "/served-by-process/foo.html?doThrow=true").asString(); + assertEquals(500, response.getStatus()); + assertThat(response.getBody()).contains("Test Exception"); + }