Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions catalog/citrus-bom/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,16 @@
<artifactId>citrus-openapi</artifactId>
<version>4.8.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.citrusframework</groupId>
<artifactId>citrus-test-api-core</artifactId>
<version>4.8.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.citrusframework</groupId>
<artifactId>citrus-openapi-codegen</artifactId>
<version>4.8.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.citrusframework</groupId>
<artifactId>citrus-jms</artifactId>
Expand Down
6 changes: 6 additions & 0 deletions connectors/citrus-openapi/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.citrusframework</groupId>
<artifactId>citrus-validation-text</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.citrusframework</groupId>
<artifactId>citrus-validation-hamcrest</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,13 @@

package org.citrusframework.openapi.actions;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Pattern;

import io.apicurio.datamodels.openapi.models.OasOperation;
import io.apicurio.datamodels.openapi.models.OasResponse;
import io.apicurio.datamodels.openapi.models.OasSchema;
import jakarta.annotation.Nullable;
import org.citrusframework.CitrusSettings;
import org.citrusframework.actions.ReceiveMessageAction;
import org.citrusframework.context.TestContext;
import org.citrusframework.exceptions.CitrusRuntimeException;
Expand All @@ -42,11 +38,9 @@
import org.citrusframework.openapi.validation.OpenApiValidationContext;
import org.springframework.http.HttpStatus;

import static org.citrusframework.message.MessageType.JSON;
import static org.citrusframework.openapi.OpenApiMessageType.RESPONSE;
import static org.citrusframework.openapi.model.OasModelHelper.resolveSchema;
import static org.citrusframework.openapi.util.OpenApiUtils.fillMessageTypeFromResponse;
import static org.citrusframework.openapi.validation.OpenApiMessageValidationContext.Builder.openApi;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;

/**
* @since 4.1
Expand Down Expand Up @@ -87,40 +81,6 @@ public OpenApiSpecificationSource getOpenApiSpecificationSource() {
return openApiSpecificationSource;
}

public static void fillMessageTypeFromResponse(OpenApiSpecification openApiSpecification,
HttpMessage httpMessage,
@Nullable OasOperation operation,
@Nullable OasResponse response) {
if (operation == null || response == null) {
return;
}

Optional<OasSchema> responseSchema = OasModelHelper.getSchema(response);
responseSchema.ifPresent(oasSchema -> {
OasSchema resolvedSchema = resolveSchema(openApiSpecification.getOpenApiDoc(null), oasSchema);
if (OasModelHelper.isObjectType(resolvedSchema) || OasModelHelper.isObjectArrayType(resolvedSchema)) {
Collection<String> responseTypes = OasModelHelper.getResponseTypes(operation,response);
if (responseTypes.contains(APPLICATION_JSON_VALUE)) {
httpMessage.setType(JSON);
}
}
}
);
}

/**
* Overridden to change the default message type to JSON, as Json is more common in OpenAPI context.
*/
@Override
protected HttpMessageBuilderSupport createHttpMessageBuilderSupport() {
HttpMessageBuilderSupport support = super.createHttpMessageBuilderSupport();
support.type(CitrusSettings.getPropertyEnvOrDefault(
CitrusSettings.DEFAULT_MESSAGE_TYPE_PROPERTY,
CitrusSettings.DEFAULT_MESSAGE_TYPE_ENV,
JSON.toString()));
return support;
}

@Override
protected void reconcileValidationContexts() {
super.reconcileValidationContexts();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

package org.citrusframework.openapi.actions;

import org.citrusframework.CitrusSettings;
import org.citrusframework.actions.ReceiveMessageAction;
import org.citrusframework.context.TestContext;
import org.citrusframework.http.actions.HttpServerRequestActionBuilder;
Expand All @@ -28,7 +27,6 @@
import org.citrusframework.openapi.validation.OpenApiOperationToMessageHeadersProcessor;
import org.citrusframework.openapi.validation.OpenApiValidationContext;

import static org.citrusframework.message.MessageType.JSON;
import static org.citrusframework.openapi.OpenApiMessageType.REQUEST;
import static org.citrusframework.openapi.validation.OpenApiMessageValidationContext.Builder.openApi;

Expand Down Expand Up @@ -79,19 +77,6 @@ protected void reconcileValidationContexts() {
}
}

/**
* Overridden to change the default message type to JSON, as Json is more common in OpenAPI context.
*/
@Override
protected HttpMessageBuilderSupport createMessageBuilderSupport() {
HttpMessageBuilderSupport support = super.createMessageBuilderSupport();
support.type(CitrusSettings.getPropertyEnvOrDefault(
CitrusSettings.DEFAULT_MESSAGE_TYPE_PROPERTY,
CitrusSettings.DEFAULT_MESSAGE_TYPE_ENV,
JSON.toString()));
return support;
}

@Override
public ReceiveMessageAction doBuild() {
OpenApiSpecification openApiSpecification = openApiSpecificationSource.resolve(referenceResolver);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,27 @@

package org.citrusframework.openapi.util;

import java.util.Collection;
import java.util.Optional;

import io.apicurio.datamodels.openapi.models.OasOperation;
import io.apicurio.datamodels.openapi.models.OasResponse;
import io.apicurio.datamodels.openapi.models.OasSchema;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import org.citrusframework.http.message.HttpMessage;
import org.citrusframework.openapi.OpenApiConstants;
import org.citrusframework.openapi.OpenApiRepository;
import org.citrusframework.openapi.OpenApiSpecification;
import org.citrusframework.openapi.model.OasModelHelper;
import org.citrusframework.spi.ReferenceResolver;

import static java.lang.String.format;
import static java.util.stream.Collectors.joining;
import static org.citrusframework.message.MessageType.JSON;
import static org.citrusframework.openapi.model.OasModelHelper.resolveSchema;
import static org.citrusframework.util.StringUtils.hasText;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;

public final class OpenApiUtils {

Expand Down Expand Up @@ -87,4 +97,26 @@ public static String getKnownOpenApiAliases(ReferenceResolver resolver) {
.collect(joining(", "));
}

public static void fillMessageTypeFromResponse(OpenApiSpecification openApiSpecification,
HttpMessage httpMessage,
@Nullable OasOperation operation,
@Nullable OasResponse response) {
if (operation == null || response == null) {
return;
}

Optional<OasSchema> responseSchema = OasModelHelper.getSchema(response);
responseSchema.ifPresent(oasSchema -> {
OasSchema resolvedSchema = resolveSchema(openApiSpecification.getOpenApiDoc(null), oasSchema);
if (OasModelHelper.isObjectType(resolvedSchema) || OasModelHelper.isObjectArrayType(resolvedSchema)) {
Collection<String> responseTypes = OasModelHelper.getResponseTypes(operation,response);

if (responseTypes.contains(APPLICATION_JSON_VALUE)) {
httpMessage.setType(JSON);
}
}
}
);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@
import org.citrusframework.util.SocketUtils;
import org.citrusframework.validation.DefaultMessageHeaderValidator;
import org.citrusframework.validation.DefaultTextEqualsMessageValidator;
import org.citrusframework.validation.context.DefaultMessageValidationContext;
import org.citrusframework.validation.context.DefaultValidationContext;
import org.citrusframework.validation.context.HeaderValidationContext;
import org.citrusframework.validation.json.JsonMessageValidationContext;
import org.mockito.Mockito;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
Expand Down Expand Up @@ -187,7 +187,7 @@ public void shouldLoadOpenApiClientActions() {
assertListContains(receiveMessageAction.getValidationContexts(),
OpenApiMessageValidationContext.class::isInstance, "List must contain OpenApiMessageValidationContext");
assertListContains(receiveMessageAction.getValidationContexts(),
JsonMessageValidationContext.class::isInstance, "List must contain JsonMessageValidationContext");
DefaultMessageValidationContext.class::isInstance, "List must contain DefaultMessageValidationContext");

httpMessageBuilder = ((HttpMessageBuilder) receiveMessageAction.getMessageBuilder());
assertNotNull(httpMessageBuilder);
Expand Down Expand Up @@ -226,7 +226,7 @@ public void shouldLoadOpenApiClientActions() {
assertListContains(receiveMessageAction.getValidationContexts(),
OpenApiMessageValidationContext.class::isInstance, "List must contain OpenApiMessageValidationContext");
assertListContains(receiveMessageAction.getValidationContexts(),
JsonMessageValidationContext.class::isInstance, "List must contain JsonMessageValidationContext");
DefaultMessageValidationContext.class::isInstance, "List must contain DefaultMessageValidationContext");

httpMessageBuilder = ((HttpMessageBuilder) receiveMessageAction.getMessageBuilder());
assertNotNull(httpMessageBuilder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@
import org.citrusframework.message.MessageQueue;
import org.citrusframework.openapi.validation.OpenApiMessageValidationContext;
import org.citrusframework.spi.BindToRegistry;
import org.citrusframework.validation.context.DefaultMessageValidationContext;
import org.citrusframework.validation.context.HeaderValidationContext;
import org.citrusframework.validation.json.JsonMessageValidationContext;
import org.mockito.Mockito;
import org.springframework.http.HttpMethod;
import org.testng.Assert;
Expand All @@ -56,6 +56,7 @@ public class OpenApiServerTest extends AbstractGroovyActionDslTest {

@BindToRegistry
final TestActor testActor = Mockito.mock(TestActor.class);

private final MessageQueue inboundQueue = new DefaultMessageQueue("inboundQueue");
private final EndpointAdapter endpointAdapter = new DirectEndpointAdapter(direct()
.synchronous()
Expand Down Expand Up @@ -132,7 +133,7 @@ public void shouldLoadOpenApiServerActions() {
assertListContains(receiveMessageAction.getValidationContexts(),
OpenApiMessageValidationContext.class::isInstance, "List must contain OpenApiMessageValidationContext");
assertListContains(receiveMessageAction.getValidationContexts(),
JsonMessageValidationContext.class::isInstance, "List must contain JsonMessageValidationContext");
DefaultMessageValidationContext.class::isInstance, "List must contain DefaultMessageValidationContext");
assertEquals(receiveMessageAction.getReceiveTimeout(), 0L);

assertTrue(receiveMessageAction.getMessageBuilder() instanceof HttpMessageBuilder);
Expand Down Expand Up @@ -168,7 +169,7 @@ public void shouldLoadOpenApiServerActions() {
assertListContains(receiveMessageAction.getValidationContexts(),
OpenApiMessageValidationContext.class::isInstance, "List must contain OpenApiMessageValidationContext");
assertListContains(receiveMessageAction.getValidationContexts(),
JsonMessageValidationContext.class::isInstance, "List must contain JsonMessageValidationContext");
DefaultMessageValidationContext.class::isInstance, "List must contain DefaultMessageValidationContext");
assertEquals(receiveMessageAction.getReceiveTimeout(), 2000L);

httpMessageBuilder = ((HttpMessageBuilder) receiveMessageAction.getMessageBuilder());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@
import org.citrusframework.util.SocketUtils;
import org.citrusframework.validation.DefaultMessageHeaderValidator;
import org.citrusframework.validation.DefaultTextEqualsMessageValidator;
import org.citrusframework.validation.context.DefaultMessageValidationContext;
import org.citrusframework.validation.context.DefaultValidationContext;
import org.citrusframework.validation.context.HeaderValidationContext;
import org.citrusframework.validation.json.JsonMessageValidationContext;
import org.citrusframework.xml.XmlTestLoader;
import org.citrusframework.xml.actions.XmlTestActionBuilder;
import org.mockito.Mockito;
Expand Down Expand Up @@ -194,7 +194,7 @@ public void shouldLoadOpenApiClientActions() throws IOException {
assertListContains(receiveMessageAction.getValidationContexts(),
OpenApiMessageValidationContext.class::isInstance, "List must contain OpenApiMessageValidationContext");
assertListContains(receiveMessageAction.getValidationContexts(),
JsonMessageValidationContext.class::isInstance, "List must contain JsonMessageValidationContext");
DefaultMessageValidationContext.class::isInstance, "List must contain DefaultMessageValidationContext");

httpMessageBuilder = ((HttpMessageBuilder) receiveMessageAction.getMessageBuilder());
assertNotNull(httpMessageBuilder);
Expand Down Expand Up @@ -233,7 +233,7 @@ public void shouldLoadOpenApiClientActions() throws IOException {
assertListContains(receiveMessageAction.getValidationContexts(),
OpenApiMessageValidationContext.class::isInstance, "List must contain OpenApiMessageValidationContext");
assertListContains(receiveMessageAction.getValidationContexts(),
JsonMessageValidationContext.class::isInstance, "List must contain JsonMessageValidationContext");
DefaultMessageValidationContext.class::isInstance, "List must contain DefaultMessageValidationContext");

httpMessageBuilder = ((HttpMessageBuilder) receiveMessageAction.getMessageBuilder());
assertNotNull(httpMessageBuilder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
import org.citrusframework.message.MessageQueue;
import org.citrusframework.openapi.validation.OpenApiMessageValidationContext;
import org.citrusframework.spi.BindToRegistry;
import org.citrusframework.validation.context.DefaultMessageValidationContext;
import org.citrusframework.validation.context.HeaderValidationContext;
import org.citrusframework.validation.json.JsonMessageValidationContext;
import org.citrusframework.xml.XmlTestLoader;
import org.mockito.Mockito;
import org.springframework.http.HttpMethod;
Expand Down Expand Up @@ -132,7 +132,7 @@ public void shouldLoadOpenApiServerActions() {
assertListContains(receiveMessageAction.getValidationContexts(),
OpenApiMessageValidationContext.class::isInstance, "List must contain OpenApiMessageValidationContext");
assertListContains(receiveMessageAction.getValidationContexts(),
JsonMessageValidationContext.class::isInstance, "List must contain JsonMessageValidationContext");
DefaultMessageValidationContext.class::isInstance, "List must contain DefaultMessageValidationContext");

assertEquals(receiveMessageAction.getReceiveTimeout(), 0L);

Expand Down Expand Up @@ -169,7 +169,7 @@ public void shouldLoadOpenApiServerActions() {
assertListContains(receiveMessageAction.getValidationContexts(),
OpenApiMessageValidationContext.class::isInstance, "List must contain OpenApiMessageValidationContext");
assertListContains(receiveMessageAction.getValidationContexts(),
JsonMessageValidationContext.class::isInstance, "List must contain JsonMessageValidationContext");
DefaultMessageValidationContext.class::isInstance, "List must contain DefaultMessageValidationContext");
assertEquals(receiveMessageAction.getReceiveTimeout(), 2000L);

httpMessageBuilder = ((HttpMessageBuilder) receiveMessageAction.getMessageBuilder());
Expand Down
1 change: 1 addition & 0 deletions connectors/citrus-testcontainers/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<name>Citrus :: Connectors :: Testcontainers</name>

<properties>
<!-- Container tests typically do not run behind a company proxy. Set this property if required, when building locally-->
<skipContainerTests>false</skipContainerTests>
</properties>

Expand Down
Loading
Loading