Merge "b/162010180 Implement Traversal for ExternalDocs on main OpenApi3 object"
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversal.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversal.java
index 0c64fd7..793c773 100644
--- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversal.java
+++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversal.java
@@ -29,6 +29,15 @@
     traverseInfo();
     traverseServers();
     traverseTags();
+    traverseExternalDocs();
+  }
+
+  private void traverseExternalDocs() {
+    Optional.ofNullable(openApiSchemaObj.getExternalDocs())
+        .ifPresent(
+            externalDocs ->
+                traversalCoordinator.handleTraversalCommand(
+                    traversalCommandFactory.create(externalDocs)));
   }
 
   private void traverseInfo() {
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversalTest.java
index 9791f58..4eab574 100644
--- a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversalTest.java
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversalTest.java
@@ -16,6 +16,7 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.ExternalDocs;
 import org.openapi4j.parser.model.v3.Info;
 import org.openapi4j.parser.model.v3.OpenApi3;
 import org.openapi4j.parser.model.v3.Server;
@@ -55,6 +56,8 @@
     when(openApiSpec.getTags()).thenReturn(tags);
 
     when(openApiSpec.getInfo()).thenReturn(new Info());
+
+    when(openApiSpec.getExternalDocs()).thenReturn(new ExternalDocs());
   }
 
   @Test
@@ -72,6 +75,20 @@
   }
 
   @Test
+  public void traverse_sendsExternalDocsChildTraversalToTraversalCoordinator() {
+    openApiSpecificationTraversal.traverse();
+
+    verify(traversalCoordinator).handleTraversalCommand(any(ExternalDocsTraversalCommand.class));
+  }
+
+  @Test
+  public void traverse_nullExternalDocsChild_doesNotThrowException() {
+    when(openApiSpec.getExternalDocs()).thenReturn(null);
+
+    openApiSpecificationTraversal.traverse();
+  }
+
+  @Test
   public void traverse_sendsServerChildrenTraversalsToTraversalCommander() {
     openApiSpecificationTraversal.traverse();