b/163024263 Define Response Traversal Change-Id: I9789ddd59d3be76bc9b4d8c519a46ed4eae08919
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelper.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelper.java index cefbaa1..265431f 100644 --- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelper.java +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelper.java
@@ -14,6 +14,7 @@ import org.openapi4j.parser.model.v3.OpenApi3; import org.openapi4j.parser.model.v3.Operation; import org.openapi4j.parser.model.v3.Parameter; +import org.openapi4j.parser.model.v3.Response; import org.openapi4j.parser.model.v3.Server; import org.openapi4j.parser.model.v3.ServerVariable; import org.openapi4j.parser.model.v3.Tag; @@ -102,6 +103,17 @@ } @Override + public void sendResponseTraversals(ImmutableMap<String, Response> responses) { + Optional.ofNullable(responses) + .ifPresent( + responsesObj -> + responsesObj.forEach( + (name, response) -> + coordinator.handleTraversalCommand( + factory.create(response, traversalPath, name)))); + } + + @Override public void sendServerTraversals(ImmutableList<Server> serversList) { Optional.ofNullable(serversList) .ifPresent(
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OperationTraversal.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OperationTraversal.java index 428e7ef..c929fa8 100644 --- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OperationTraversal.java +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OperationTraversal.java
@@ -36,9 +36,10 @@ traversalHelper.sendExternalDocsTraversal(openApiSchemaObj.getExternalDocs()); // TODO(b/162949100): Send Callback Traversals. traversalHelper.sendServerTraversals(Immutables.toImmutableList(openApiSchemaObj.getServers())); - // TODO(b/163024263): Send Response Traversals. - // TODO(b/163024265): Send Security Requirement Traversals. traversalHelper.sendParameterTraversals( Immutables.toImmutableList(openApiSchemaObj.getParameters())); + traversalHelper.sendResponseTraversals( + Immutables.toImmutableMap(openApiSchemaObj.getResponses())); + // TODO(b/163024265): Send Security Requirement Traversals. } }
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/ResponseTraversal.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/ResponseTraversal.java new file mode 100644 index 0000000..d214ada --- /dev/null +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/ResponseTraversal.java
@@ -0,0 +1,36 @@ +package com.apigee.security.oas.extendedvalidator; + +import com.google.common.collect.ImmutableList; +import com.google.inject.assistedinject.Assisted; +import java.util.Map; +import java.util.Optional; +import javax.inject.Inject; +import org.openapi4j.parser.model.OpenApiSchema; +import org.openapi4j.parser.model.v3.Response; + +/** A {@link Traversal} that traverses a {@link Response} object. */ +final class ResponseTraversal extends Traversal<Response> implements ResponseTraversalCommand { + + @Inject + ResponseTraversal( + TraversalHelperFactory traversalHelperFactory, + ExtensionValidationIntegrator extensionValidationIntegrator, + @Assisted + ImmutableList<Map.Entry<Class<? extends OpenApiSchema>, Optional<String>>> traversalPath, + @Assisted Response openApiSchemaObj, + @Assisted String name) { + super( + traversalHelperFactory, + extensionValidationIntegrator, + traversalPath, + openApiSchemaObj, + name); + } + + @Override + public void traverse() { + // TODO(b/162897637): Send MediaType Traversals. + // TODO(b/162949105): Send Header Traversals. + // TODO(b/162949106): Send Link Traversals. + } +}
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/ResponseTraversalCommand.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/ResponseTraversalCommand.java new file mode 100644 index 0000000..44e235d --- /dev/null +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/ResponseTraversalCommand.java
@@ -0,0 +1,4 @@ +package com.apigee.security.oas.extendedvalidator; + +/** A {@link TraversalCommand} interface for {@link ResponseTraversal}. */ +public interface ResponseTraversalCommand extends TraversalCommand {}
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactory.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactory.java index e857632..ac98888 100644 --- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactory.java +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactory.java
@@ -11,6 +11,7 @@ import org.openapi4j.parser.model.v3.OpenApi3; import org.openapi4j.parser.model.v3.Operation; import org.openapi4j.parser.model.v3.Parameter; +import org.openapi4j.parser.model.v3.Response; import org.openapi4j.parser.model.v3.Server; import org.openapi4j.parser.model.v3.ServerVariable; import org.openapi4j.parser.model.v3.Tag; @@ -48,6 +49,11 @@ Parameter parameter, ImmutableList<Map.Entry<Class<? extends OpenApiSchema>, Optional<String>>> traversalPath); + ResponseTraversalCommand create( + Response response, + ImmutableList<Map.Entry<Class<? extends OpenApiSchema>, Optional<String>>> traversalPath, + String name); + ServerTraversalCommand create( Server server, ImmutableList<Map.Entry<Class<? extends OpenApiSchema>, Optional<String>>> traversalPath);
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryModule.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryModule.java index d69d230..b0e6c56 100644 --- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryModule.java +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryModule.java
@@ -17,6 +17,7 @@ OpenApiSpecificationTraversalCommand.class, OpenApiSpecificationTraversal.class) .implement(OperationTraversalCommand.class, OperationTraversal.class) .implement(ParameterTraversalCommand.class, ParameterTraversal.class) + .implement(ResponseTraversalCommand.class, ResponseTraversal.class) .implement(ServerTraversalCommand.class, ServerTraversal.class) .implement(ServerVariableTraversalCommand.class, ServerVariableTraversal.class) .implement(TagTraversalCommand.class, TagTraversal.class)
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalHelper.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalHelper.java index 3351ad1..ca55a12 100644 --- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalHelper.java +++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalHelper.java
@@ -9,6 +9,7 @@ import org.openapi4j.parser.model.v3.OpenApi3; import org.openapi4j.parser.model.v3.Operation; import org.openapi4j.parser.model.v3.Parameter; +import org.openapi4j.parser.model.v3.Response; import org.openapi4j.parser.model.v3.Server; import org.openapi4j.parser.model.v3.ServerVariable; import org.openapi4j.parser.model.v3.Tag; @@ -30,6 +31,8 @@ void sendParameterTraversals(ImmutableList<Parameter> parameters); + void sendResponseTraversals(ImmutableMap<String, Response> responses); + void sendServerTraversals(ImmutableList<Server> serversList); void sendServerVariableTraversals(ImmutableMap<String, ServerVariable> serverVariables);
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OperationTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OperationTraversalTest.java index 05ea8f3..eca900f 100644 --- a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OperationTraversalTest.java +++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OperationTraversalTest.java
@@ -6,6 +6,7 @@ import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -18,6 +19,7 @@ import org.openapi4j.parser.model.v3.ExternalDocs; import org.openapi4j.parser.model.v3.Operation; import org.openapi4j.parser.model.v3.Parameter; +import org.openapi4j.parser.model.v3.Response; import org.openapi4j.parser.model.v3.Server; @RunWith(JUnit4.class) @@ -35,6 +37,8 @@ private final ImmutableList parameters = ImmutableList.of(new Parameter(), new Parameter(), new Parameter(), new Parameter()); + private final ImmutableMap responses = + ImmutableMap.of("one", new Response(), "two", new Response()); private OperationTraversal operationTraversal; @@ -45,6 +49,7 @@ when(operation.getExternalDocs()).thenReturn(externalDocs); when(operation.getServers()).thenReturn(servers); when(operation.getParameters()).thenReturn(parameters); + when(operation.getResponses()).thenReturn(responses); operationTraversal = new OperationTraversal( @@ -81,6 +86,22 @@ } @Test + public void traverse_sendsResponsesToTraversalHelper() { + operationTraversal.traverse(); + + verify(traversalHelper).sendResponseTraversals(responses); + } + + @Test + public void traverse_nullResponsesMember_doesNotFail() { + when(operation.getResponses()).thenReturn(null); + + operationTraversal.traverse(); + + verify(traversalHelper, atLeastOnce()).sendResponseTraversals(any()); + } + + @Test public void traverse_sendsServersToTraversalHelper() { operationTraversal.traverse();
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryTest.java index 17450af..baa2e8b 100644 --- a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryTest.java +++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryTest.java
@@ -18,6 +18,7 @@ import org.openapi4j.parser.model.v3.OpenApi3; import org.openapi4j.parser.model.v3.Operation; import org.openapi4j.parser.model.v3.Parameter; +import org.openapi4j.parser.model.v3.Response; import org.openapi4j.parser.model.v3.Server; import org.openapi4j.parser.model.v3.ServerVariable; import org.openapi4j.parser.model.v3.Tag; @@ -67,6 +68,11 @@ } @Test + public void create_responseAndNamePassed_returnsNonNullObject() { + assertThat(traversalCommandFactory.create(new Response(), traversalPath, "name")).isNotNull(); + } + + @Test public void create_serverPassed_returnsNonNullObject() { assertThat(traversalCommandFactory.create(new Server(), traversalPath)).isNotNull(); }