This is an automated email from the ASF dual-hosted git repository.
ricardozanini pushed a commit to branch main
in repository
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git
The following commit(s) were added to refs/heads/main by this push:
new 56dfe50f0c [Fix #4007] Add content type support to openapi parser
(#4041)
56dfe50f0c is described below
commit 56dfe50f0c3366eb590c7a9edbca547c461a3be4
Author: Francisco Javier Tirado Sarti
<[email protected]>
AuthorDate: Tue Aug 26 21:16:00 2025 +0200
[Fix #4007] Add content type support to openapi parser (#4041)
---
.../executor/OpenAPIWorkflowApplicationTest.java | 12 +++++
.../src/test/resources/spec.yaml | 18 ++++++-
.../src/test/resources/stringResource.sw.json | 30 ++++++++++++
.../parser/handlers/openapi/MediaTypeUtils.java | 55 ++++++++++++++++++++++
.../parser/handlers/openapi/OpenAPIDescriptor.java | 15 ++++++
.../rest/DescriptorRestOperationHandler.java | 2 +
.../workflow/rest/JsonNodeResultHandler.java | 11 ++++-
.../kogito/workitem/rest/RestWorkItemHandler.java | 37 ++++++++++++---
.../workitem/rest/RestWorkItemHandlerUtils.java | 6 +++
.../kogito/workflows/services/StringResource.java | 38 +++++++++++++++
.../src/main/resources/application.properties | 1 +
.../src/main/resources/specs/stringResource.json | 38 +++++++++++++++
.../src/main/resources/stringResource.sw.json | 37 +++++++++++++++
...nversationFlowIT.java => ConversionFlowIT.java} | 2 +-
...onversationFlowIT.java => StringOpenAPIIT.java} | 32 ++-----------
15 files changed, 296 insertions(+), 38 deletions(-)
diff --git
a/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/java/org/kie/kogito/serverless/workflow/executor/OpenAPIWorkflowApplicationTest.java
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/java/org/kie/kogito/serverless/workflow/executor/OpenAPIWorkflowApplicationTest.java
index 28735970be..58536dcb1c 100644
---
a/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/java/org/kie/kogito/serverless/workflow/executor/OpenAPIWorkflowApplicationTest.java
+++
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/java/org/kie/kogito/serverless/workflow/executor/OpenAPIWorkflowApplicationTest.java
@@ -30,9 +30,11 @@ import org.kie.kogito.jackson.utils.ObjectMapperFactory;
import org.kie.kogito.serverless.workflow.utils.ServerlessWorkflowUtils;
import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.databind.node.TextNode;
import com.github.tomakehurst.wiremock.junit5.WireMockExtension;
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static
com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
import static org.assertj.core.api.Assertions.assertThat;
@@ -71,4 +73,14 @@ class OpenAPIWorkflowApplicationTest {
assertThat(node.get("product").asDouble()).isEqualByComparingTo(product);
}
}
+
+ @Test
+ void stringContentTypeInvocation() throws IOException {
+ URL resource =
Thread.currentThread().getContextClassLoader().getResource("stringResource.sw.json");
+
wm.stubFor(post("/stringResource/reverse").withRequestBody(equalTo("redrum")).willReturn(aResponse().withStatus(200).withBody("murder")));
+ try (StaticWorkflowApplication application =
StaticWorkflowApplication.create()) {
+ ObjectNode node = (ObjectNode)
application.execute(ServerlessWorkflowUtils.getWorkflow(resource),
Collections.singletonMap("name", "redrum")).getWorkflowdata();
+ assertThat(node.get("response")).isEqualTo(new TextNode("murder"));
+ }
+ }
}
diff --git
a/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/spec.yaml
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/spec.yaml
index 6cd67613c8..1ef8f35650 100644
---
a/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/spec.yaml
+++
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/spec.yaml
@@ -48,7 +48,6 @@ paths:
product:
format: float
type: number
-
/substract:
post:
operationId: substract
@@ -67,7 +66,22 @@ paths:
properties:
difference:
format: float
- type: number
+ type: number
+ /stringResource/reverse:
+ post:
+ operationId: reverse,
+ requestBody:
+ content:
+ text/plain:
+ schema:
+ type: string
+ responses:
+ 200:
+ description: OK
+ content:
+ text/plain:
+ schema:
+ type:string
components:
schemas:
MultiplicationOperation:
diff --git
a/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/stringResource.sw.json
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/stringResource.sw.json
new file mode 100644
index 0000000000..566de53a7a
--- /dev/null
+++
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/stringResource.sw.json
@@ -0,0 +1,30 @@
+{
+ "id": "stringResource",
+ "name": "String resource",
+ "version": "v1.0",
+ "start": "doCall",
+ "functions": [
+ {
+ "name": "reverse",
+ "operation": "spec.yaml#reverse"
+ }
+ ],
+ "states": [
+ {
+ "name": "doCall",
+ "type": "operation",
+ "actions": [
+ {
+ "name": "reverse",
+ "functionRef": {
+ "refName": "reverse",
+ "arguments": ".name"
+ }
+ }
+ ],
+ "end": {
+ "terminate": "true"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git
a/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/MediaTypeUtils.java
b/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/MediaTypeUtils.java
new file mode 100644
index 0000000000..3d75ca7deb
--- /dev/null
+++
b/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/MediaTypeUtils.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.kogito.serverless.workflow.parser.handlers.openapi;
+
+import java.util.Collection;
+import java.util.Optional;
+import java.util.Set;
+
+public class MediaTypeUtils {
+
+ private MediaTypeUtils() {
+ }
+
+ private static final Collection<String> textMedia = Set.of("text/plain",
"text/csv", "text/html");
+ private static final Collection<String> bytesMedia =
Set.of("application/octet-stream", "application/zip");
+
+ public static Optional<Class<?>> fromMedia(String type) {
+ if (isText(type)) {
+ return Optional.of(String.class);
+ } else if (isBytes(type)) {
+ return Optional.of(byte[].class);
+ } else {
+ return Optional.empty();
+ }
+
+ }
+
+ public static boolean isText(String type) {
+ if (type == null)
+ return false;
+ return textMedia.contains(type.toLowerCase());
+ }
+
+ public static boolean isBytes(String type) {
+ if (type == null)
+ return false;
+ return bytesMedia.contains(type.toLowerCase());
+ }
+}
diff --git
a/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/OpenAPIDescriptor.java
b/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/OpenAPIDescriptor.java
index e08f590520..3150cbdaf0 100644
---
a/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/OpenAPIDescriptor.java
+++
b/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/OpenAPIDescriptor.java
@@ -20,6 +20,7 @@ package
org.kie.kogito.serverless.workflow.parser.handlers.openapi;
import java.util.Collection;
import java.util.HashSet;
+import java.util.Optional;
import java.util.Set;
import io.swagger.v3.oas.models.Operation;
@@ -35,16 +36,26 @@ public class OpenAPIDescriptor {
private final Set<String> pathParams = new HashSet<>();
private final Set<String> queryParams = new HashSet<>();
private final Set<String> headerParams = new HashSet<>();
+ private final Optional<String> resultType;
OpenAPIDescriptor(HttpMethod method, String path, Operation operation,
Collection<SecurityScheme> schemes) {
this.method = method;
this.path = path;
this.schemes = schemes;
+
+ this.resultType =
operation.getResponses().entrySet().stream().filter(e ->
isValidStatusCode(Integer.parseInt(e.getKey())))
+ .filter(e -> e.getValue().getContent() != null)
+ .flatMap(e ->
e.getValue().getContent().keySet().stream()).findFirst();
+
if (operation.getParameters() != null) {
operation.getParameters().forEach(this::addParameter);
}
}
+ private boolean isValidStatusCode(int statusCode) {
+ return statusCode >= 200 && statusCode < 300;
+ }
+
private void addParameter(Parameter parameter) {
switch (parameter.getIn()) {
case "query":
@@ -61,6 +72,10 @@ public class OpenAPIDescriptor {
}
}
+ public Optional<String> getResultType() {
+ return resultType;
+ }
+
public HttpMethod getMethod() {
return method;
}
diff --git
a/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/rest/DescriptorRestOperationHandler.java
b/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/rest/DescriptorRestOperationHandler.java
index ff2ab4d5d1..ded1eb4c25 100644
---
a/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/rest/DescriptorRestOperationHandler.java
+++
b/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/rest/DescriptorRestOperationHandler.java
@@ -28,6 +28,7 @@ import org.jbpm.ruleflow.core.factory.WorkItemNodeFactory;
import org.kie.kogito.internal.utils.ConversionUtils;
import org.kie.kogito.serverless.workflow.operationid.WorkflowOperationId;
import org.kie.kogito.serverless.workflow.parser.ParserContext;
+import
org.kie.kogito.serverless.workflow.parser.handlers.openapi.MediaTypeUtils;
import
org.kie.kogito.serverless.workflow.parser.handlers.openapi.OpenAPIDescriptor;
import
org.kie.kogito.serverless.workflow.parser.handlers.openapi.OpenAPIDescriptorFactory;
import org.kie.kogito.serverless.workflow.parser.types.OpenAPITypeHandler;
@@ -92,6 +93,7 @@ public class DescriptorRestOperationHandler extends
OpenAPITypeHandler {
OpenAPI openAPI = OpenAPIFactory.getOpenAPI(uri, workflow, function,
Optional.of(parserContext));
OpenAPIDescriptor openAPIDescriptor =
OpenAPIDescriptorFactory.of(openAPI, operationId.getOperation());
addSecurity(node, openAPIDescriptor, serviceName, parserContext);
+
openAPIDescriptor.getResultType().flatMap(MediaTypeUtils::fromMedia).ifPresent(s
-> node.workParameter(RestWorkItemHandler.TARGET_TYPE, s));
return node.workParameter(RestWorkItemHandler.URL,
runtimeOpenApi(serviceName, URL, String.class,
OpenAPIDescriptorFactory.getDefaultURL(openAPI, "http://localhost:8080"),
(key, clazz, defaultValue) -> new
ConfigSuppliedWorkItemSupplier<>(key, clazz, defaultValue, calculatedKey ->
concatPaths(calculatedKey, openAPIDescriptor.getPath()),
diff --git
a/kogito-serverless-workflow/kogito-serverless-workflow-rest-runtime/src/main/java/org/kie/kogito/serverless/workflow/rest/JsonNodeResultHandler.java
b/kogito-serverless-workflow/kogito-serverless-workflow-rest-runtime/src/main/java/org/kie/kogito/serverless/workflow/rest/JsonNodeResultHandler.java
index 397bbfb46b..f91e71bfe5 100644
---
a/kogito-serverless-workflow/kogito-serverless-workflow-rest-runtime/src/main/java/org/kie/kogito/serverless/workflow/rest/JsonNodeResultHandler.java
+++
b/kogito-serverless-workflow/kogito-serverless-workflow-rest-runtime/src/main/java/org/kie/kogito/serverless/workflow/rest/JsonNodeResultHandler.java
@@ -21,6 +21,7 @@ package org.kie.kogito.serverless.workflow.rest;
import java.util.Map;
import org.kie.kogito.internal.process.runtime.KogitoProcessContext;
+import org.kie.kogito.jackson.utils.JsonObjectUtils;
import org.kogito.workitem.rest.resulthandlers.RestWorkItemHandlerResult;
import com.fasterxml.jackson.databind.JsonNode;
@@ -59,6 +60,14 @@ public class JsonNodeResultHandler implements
RestWorkItemHandlerResult {
@Override
public Object apply(HttpResponse<Buffer> t, Class<?> u) {
- return u == null ? t.bodyAsJson(JsonNode.class) : t.bodyAsJson(u);
+ if (u == null) {
+ return t.bodyAsJson(JsonNode.class);
+ } else if (byte[].class.isAssignableFrom(u)) {
+ return JsonObjectUtils.fromValue(t.body().getBytes());
+ } else if (String.class.isAssignableFrom(u)) {
+ return JsonObjectUtils.fromValue(t.bodyAsString());
+ } else {
+ return t.bodyAsJson(u);
+ }
}
}
diff --git
a/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandler.java
b/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandler.java
index 7276f4c4f0..8e7ff73d1f 100644
---
a/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandler.java
+++
b/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandler.java
@@ -60,6 +60,7 @@ import
org.kogito.workitem.rest.resulthandlers.RestWorkItemHandlerResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import io.smallrye.mutiny.Uni;
import io.vertx.core.http.HttpMethod;
import io.vertx.mutiny.core.buffer.Buffer;
import io.vertx.mutiny.ext.web.client.HttpRequest;
@@ -70,6 +71,7 @@ import static
org.kie.kogito.internal.utils.ConversionUtils.isEmpty;
import static
org.kogito.workitem.rest.RestWorkItemHandlerUtils.getClassListParam;
import static org.kogito.workitem.rest.RestWorkItemHandlerUtils.getClassParam;
import static org.kogito.workitem.rest.RestWorkItemHandlerUtils.getParam;
+import static org.kogito.workitem.rest.RestWorkItemHandlerUtils.getParamSupply;
public class RestWorkItemHandler extends DefaultKogitoWorkItemHandler {
@@ -88,6 +90,7 @@ public class RestWorkItemHandler extends
DefaultKogitoWorkItemHandler {
public static final String PARAMS_DECORATOR = "ParamsDecorator";
public static final String PATH_PARAM_RESOLVER = "PathParamResolver";
public static final String AUTH_METHOD = "AuthMethod";
+ public static final String TARGET_TYPE = "TargetType";
public static final String REQUEST_TIMEOUT_IN_MILLIS = "RequestTimeout";
@@ -118,12 +121,14 @@ public class RestWorkItemHandler extends
DefaultKogitoWorkItemHandler {
@Override
public Optional<WorkItemTransition>
activateWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler
handler, KogitoWorkItem workItem, WorkItemTransition transition) {
- Class<?> targetInfo = getTargetInfo(workItem);
- logger.debug("Using target {}", targetInfo);
+
//retrieving parameters
Map<String, Object> parameters = new
HashMap<>(workItem.getParameters());
//removing unnecessary parameter
parameters.remove("TaskName");
+ Class<?> targetInfo = getParamSupply(parameters, TARGET_TYPE,
Class.class, () -> getTargetInfo(workItem));
+ logger.debug("Using target {}", targetInfo);
+
String endPoint = getParam(parameters, URL, String.class, null);
if (endPoint == null) {
throw new IllegalArgumentException("Missing required parameter " +
URL);
@@ -185,17 +190,35 @@ public class RestWorkItemHandler extends
DefaultKogitoWorkItemHandler {
paramsDecorator.decorate(workItem, parameters, request);
Duration requestTimeout = getRequestTimeout(parameters);
HttpResponse<Buffer> response = method.equals(HttpMethod.POST) ||
method.equals(HttpMethod.PUT)
- ? sendJson(request, bodyBuilder.apply(parameters),
requestTimeout)
+ ? sendBody(request, bodyBuilder.apply(parameters),
requestTimeout)
: send(request, requestTimeout);
return Optional.of(this.workItemLifeCycle.newTransition("complete",
workItem.getPhaseStatus(),
Collections.singletonMap(RESULT, resultHandler.apply(response,
targetInfo, ContextFactory.fromItem(workItem)))));
}
- private static HttpResponse<Buffer> sendJson(HttpRequest<Buffer> request,
Object body, Duration requestTimeout) {
- if (requestTimeout == null) {
- return request.sendJsonAndAwait(body);
+ private static HttpResponse<Buffer> sendBody(HttpRequest<Buffer> request,
Object body, Duration requestTimeout) {
+ return requestTimeout == null ? sendBody(request, body) :
sendBodyTimeout(request, body, requestTimeout);
+ }
+
+ private static HttpResponse<Buffer> sendBodyTimeout(HttpRequest<Buffer>
request, Object body, Duration requestTimeout) {
+ Uni<HttpResponse<Buffer>> uni;
+ if (body instanceof String string) {
+ uni = request.sendBuffer(Buffer.buffer(string));
+ } else if (body instanceof byte[] bytes) {
+ uni = request.sendBuffer(Buffer.buffer(bytes));
+ } else {
+ uni = request.sendJson(body);
+ }
+ return uni.await().atMost(requestTimeout);
+ }
+
+ private static HttpResponse<Buffer> sendBody(HttpRequest<Buffer> request,
Object body) {
+ if (body instanceof String string) {
+ return request.sendBufferAndAwait(Buffer.buffer(string));
+ } else if (body instanceof byte[] bytes) {
+ return request.sendBufferAndAwait(Buffer.buffer(bytes));
} else {
- return request.sendJson(body).await().atMost(requestTimeout);
+ return request.sendJsonAndAwait(body);
}
}
diff --git
a/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandlerUtils.java
b/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandlerUtils.java
index 85ccebdec8..60bc8bb78a 100644
---
a/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandlerUtils.java
+++
b/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandlerUtils.java
@@ -22,6 +22,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
+import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.kie.kogito.internal.process.workitem.WorkItemExecutionException;
@@ -45,6 +46,11 @@ public class RestWorkItemHandlerUtils {
return getParam(parameters, paramName, String.class, null);
}
+ public static <T> T getParamSupply(Map<String, Object> parameters, String
paramName, Class<T> type, Supplier<T> defaultValue) {
+ Object value = parameters.remove(paramName);
+ return value == null ? defaultValue.get() : convert(value, type, v ->
v.toString().toUpperCase());
+ }
+
public static <T> T getParam(Map<String, Object> parameters, String
paramName, Class<T> type, T defaultValue) {
Object value = parameters.remove(paramName);
return value == null ? defaultValue : convert(value, type, v ->
v.toString().toUpperCase());
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/java/org/kie/kogito/workflows/services/StringResource.java
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/java/org/kie/kogito/workflows/services/StringResource.java
new file mode 100644
index 0000000000..c1e292e368
--- /dev/null
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/java/org/kie/kogito/workflows/services/StringResource.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.kogito.workflows.services;
+
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+
+@Path("stringResource")
+public class StringResource {
+
+ @POST
+ @Produces(MediaType.TEXT_PLAIN)
+ @Consumes(MediaType.TEXT_PLAIN)
+ @Path("reverse")
+ public String reverse(String str) {
+ return new StringBuilder(str).reverse().toString();
+ }
+
+}
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties
index cc5d826ddf..24bef754bb 100644
---
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties
@@ -44,6 +44,7 @@
quarkus.rest-client."multiplication.cluster1".url=${multiplication-service-mock.
quarkus.rest-client.subtraction.url=${subtraction-service-mock.url}
quarkus.rest-client.petstore_openapi_yaml.url=${petstore-service-mock.url}
quarkus.rest-client.array_yaml.url=${array-service-mock.url}
+quarkus.rest-client.stringOperations.url=http://localhost:${quarkus.http.port}
# OpenApi client properties to access the general purpose external-service,
which is mocked by the ExternalServiceMock
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/specs/stringResource.json
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/specs/stringResource.json
new file mode 100644
index 0000000000..5606ed3d98
--- /dev/null
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/specs/stringResource.json
@@ -0,0 +1,38 @@
+{
+ "openapi" : "3.1.0",
+ "info" : {
+ "title" : "String Operations",
+ "version" : "1.0-SNAPSHOT"
+ },
+ "paths" : {
+ "/stringResource/reverse" : {
+ "post" : {
+ "operationId" : "reverse",
+ "requestBody" : {
+ "content" : {
+ "text/plain" : {
+ "schema" : {
+ "type" : "string"
+ }
+ }
+ },
+ "required" : true
+ },
+ "responses" : {
+ "200" : {
+ "description" : "OK",
+ "content" : {
+ "text/plain" : {
+ "schema" : {
+ "type" : "string"
+ }
+ }
+ }
+ }
+ },
+ "summary" : "Reverse",
+ "tags" : [ "String Resource" ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/stringResource.sw.json
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/stringResource.sw.json
new file mode 100644
index 0000000000..9604c27bb3
--- /dev/null
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/stringResource.sw.json
@@ -0,0 +1,37 @@
+{
+ "id": "stringResource",
+ "name": "String resource",
+ "version": "v1.0",
+ "start": "doCall",
+ "extensions" : [ {
+ "extensionid": "workflow-uri-definitions",
+ "definitions": {
+ "stringOperations": "specs/stringResource.json"
+ }
+ }
+ ],
+ "functions": [
+ {
+ "name": "reverse",
+ "operation": "stringOperations#reverse"
+ }
+ ],
+ "states": [
+ {
+ "name": "doCall",
+ "type": "operation",
+ "actions": [
+ {
+ "name": "reverse",
+ "functionRef": {
+ "refName": "reverse",
+ "arguments": ".name"
+ }
+ }
+ ],
+ "end": {
+ "terminate": "true"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversionFlowIT.java
similarity index 98%
copy from
quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java
copy to
quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversionFlowIT.java
index 9d18e18b13..a0b90db92b 100644
---
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversionFlowIT.java
@@ -34,7 +34,7 @@ import static org.hamcrest.CoreMatchers.notNullValue;
@QuarkusTestResource(OperationsMockService.class)
@QuarkusIntegrationTest
-class ConversationFlowIT {
+class ConversionFlowIT {
@BeforeAll
static void init() {
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/StringOpenAPIIT.java
similarity index 64%
rename from
quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java
rename to
quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/StringOpenAPIIT.java
index 9d18e18b13..40a9768863 100644
---
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/StringOpenAPIIT.java
@@ -34,7 +34,7 @@ import static org.hamcrest.CoreMatchers.notNullValue;
@QuarkusTestResource(OperationsMockService.class)
@QuarkusIntegrationTest
-class ConversationFlowIT {
+class StringOpenAPIIT {
@BeforeAll
static void init() {
@@ -42,38 +42,16 @@ class ConversationFlowIT {
}
@Test
- void sanityVerification() {
+ void testReverse() {
given()
.contentType(ContentType.JSON)
.when()
- .body(Map.of("fahrenheit", "100", "clusterName", "cluster1"))
- .post("/fahrenheit_to_celsius")
+ .body(Map.of("name", "redrum"))
+ .post("/stringResource")
.then()
.statusCode(201)
.body("id", notNullValue())
- .body("workflowdata.fahrenheit", is("100"))
- .body("workflowdata.celsius", is(37.808f)); //values from mock
server
+ .body("workflowdata.response", is("murder"));
}
- @Test
- void wrongCluster() {
- given()
- .contentType(ContentType.JSON)
- .when()
- .body(Map.of("fahrenheit", "100", "clusterName", "cluster2"))
- .post("/fahrenheit_to_celsius")
- .then()
- .statusCode(400);
- }
-
- @Test
- void wrongData() {
- given()
- .contentType(ContentType.JSON)
- .when()
- .body(Map.of("fahrenheit", "100"))
- .post("/fahrenheit_to_celsius")
- .then()
- .statusCode(400);
- }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]