Merge "b/163430475 Add missing traversal test classes"
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ContactTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ContactTraversalTest.java
new file mode 100644
index 0000000..f6319bd
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ContactTraversalTest.java
@@ -0,0 +1,53 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.Contact;
+
+public class ContactTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @Mock private TraversalHelperFactory traversalHelperFactory;
+  @Mock private ExtensionFactory extensionFactory;
+  @Mock private Extension extension;
+  @Mock private Contact contact;
+
+  private ContactTraversal contactTraversal;
+
+  /** Sets up live and mocked instances for testing. */
+  @Before
+  public void setup() {
+    contactTraversal =
+        new ContactTraversal(traversalHelperFactory, extensionFactory, ImmutableList.of(), contact);
+  }
+
+  @Test
+  public void traverse_withExtensions_returnsGeneratedExtensions() {
+    when(contact.getExtensions()).thenReturn(Map.of("x-contact", ""));
+    when(extensionFactory.create(anyString(), any(JsonNode.class), any(ImmutableList.class)))
+        .thenReturn(extension);
+
+    assertThat(contactTraversal.traverse()).hasSize(1).containsOnlyOnce(extension);
+  }
+
+  @Test
+  public void traverse_withoutExtensions_returnsEmptyExtensionsImmutableList() {
+    when(contact.getExtensions()).thenReturn(Map.of());
+
+    assertThat(contactTraversal.traverse()).isEmpty();
+  }
+}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ExternalDocsTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ExternalDocsTraversalTest.java
new file mode 100644
index 0000000..03cdba7
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ExternalDocsTraversalTest.java
@@ -0,0 +1,54 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.ExternalDocs;
+
+public class ExternalDocsTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @Mock private TraversalHelperFactory traversalHelperFactory;
+  @Mock private ExtensionFactory extensionFactory;
+  @Mock private Extension extension;
+  @Mock private ExternalDocs externalDocs;
+
+  private ExternalDocsTraversal externalDocsTraversal;
+
+  /** Sets up live and mocked instances for testing. */
+  @Before
+  public void setup() {
+    externalDocsTraversal =
+        new ExternalDocsTraversal(
+            traversalHelperFactory, extensionFactory, externalDocs, ImmutableList.of());
+  }
+
+  @Test
+  public void traverse_withExtensions_returnsGeneratedExtensions() {
+    when(externalDocs.getExtensions()).thenReturn(Map.of("x-external-docs", ""));
+    when(extensionFactory.create(anyString(), any(JsonNode.class), any(ImmutableList.class)))
+        .thenReturn(extension);
+
+    assertThat(externalDocsTraversal.traverse()).hasSize(1).containsOnlyOnce(extension);
+  }
+
+  @Test
+  public void traverse_withoutExtensions_returnsEmptyExtensionsImmutableList() {
+    when(externalDocs.getExtensions()).thenReturn(Map.of());
+
+    assertThat(externalDocsTraversal.traverse()).isEmpty();
+  }
+}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/LicenseTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/LicenseTraversalTest.java
new file mode 100644
index 0000000..62db0c2
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/LicenseTraversalTest.java
@@ -0,0 +1,53 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.License;
+
+public class LicenseTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @Mock private TraversalHelperFactory traversalHelperFactory;
+  @Mock private ExtensionFactory extensionFactory;
+  @Mock private Extension extension;
+  @Mock private License license;
+
+  private LicenseTraversal licenseTraversal;
+
+  /** Sets up live and mocked instances for testing. */
+  @Before
+  public void setup() {
+    licenseTraversal =
+        new LicenseTraversal(traversalHelperFactory, extensionFactory, ImmutableList.of(), license);
+  }
+
+  @Test
+  public void traverse_withExtensions_returnsGeneratedExtensions() {
+    when(license.getExtensions()).thenReturn(Map.of("x-license", ""));
+    when(extensionFactory.create(anyString(), any(JsonNode.class), any(ImmutableList.class)))
+        .thenReturn(extension);
+
+    assertThat(licenseTraversal.traverse()).hasSize(1).containsOnlyOnce(extension);
+  }
+
+  @Test
+  public void traverse_withoutExtensions_returnsEmptyExtensionsImmutableList() {
+    when(license.getExtensions()).thenReturn(Map.of());
+
+    assertThat(licenseTraversal.traverse()).isEmpty();
+  }
+}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ParameterTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ParameterTraversalTest.java
new file mode 100644
index 0000000..c9bed83
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ParameterTraversalTest.java
@@ -0,0 +1,54 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.Parameter;
+
+public class ParameterTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @Mock private TraversalHelperFactory traversalHelperFactory;
+  @Mock private ExtensionFactory extensionFactory;
+  @Mock private Extension extension;
+  @Mock private Parameter parameter;
+
+  private ParameterTraversal parameterTraversal;
+
+  /** Sets up live and mocked instances for testing. */
+  @Before
+  public void setup() {
+    parameterTraversal =
+        new ParameterTraversal(
+            traversalHelperFactory, extensionFactory, ImmutableList.of(), parameter);
+  }
+
+  @Test
+  public void traverse_withExtensions_returnsGeneratedExtensions() {
+    when(parameter.getExtensions()).thenReturn(Map.of("x-parameter", ""));
+    when(extensionFactory.create(anyString(), any(JsonNode.class), any(ImmutableList.class)))
+        .thenReturn(extension);
+
+    assertThat(parameterTraversal.traverse()).hasSize(1).containsOnlyOnce(extension);
+  }
+
+  @Test
+  public void traverse_withoutExtensions_returnsEmptyExtensionsImmutableList() {
+    when(parameter.getExtensions()).thenReturn(Map.of());
+
+    assertThat(parameterTraversal.traverse()).isEmpty();
+  }
+}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ResponseTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ResponseTraversalTest.java
new file mode 100644
index 0000000..1369c4d
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ResponseTraversalTest.java
@@ -0,0 +1,54 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.Response;
+
+public class ResponseTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @Mock private TraversalHelperFactory traversalHelperFactory;
+  @Mock private ExtensionFactory extensionFactory;
+  @Mock private Extension extension;
+  @Mock private Response response;
+
+  private ResponseTraversal responseTraversal;
+
+  /** Sets up live and mocked instances for testing. */
+  @Before
+  public void setup() {
+    responseTraversal =
+        new ResponseTraversal(
+            traversalHelperFactory, extensionFactory, ImmutableList.of(), response, "");
+  }
+
+  @Test
+  public void traverse_withExtensions_returnsGeneratedExtensions() {
+    when(response.getExtensions()).thenReturn(Map.of("x-response", ""));
+    when(extensionFactory.create(anyString(), any(JsonNode.class), any(ImmutableList.class)))
+        .thenReturn(extension);
+
+    assertThat(responseTraversal.traverse()).hasSize(1).containsOnlyOnce(extension);
+  }
+
+  @Test
+  public void traverse_withoutExtensions_returnsEmptyExtensionsImmutableList() {
+    when(response.getExtensions()).thenReturn(Map.of());
+
+    assertThat(responseTraversal.traverse()).isEmpty();
+  }
+}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/SecurityRequirementTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/SecurityRequirementTraversalTest.java
new file mode 100644
index 0000000..86fc6ef
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/SecurityRequirementTraversalTest.java
@@ -0,0 +1,22 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+
+public class SecurityRequirementTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @InjectMocks private SecurityRequirementTraversal securityRequirementTraversal;
+
+  @Test
+  public void traverse_returnsEmptyExtensionsImmutableList() {
+    assertThat(securityRequirementTraversal.traverse()).isEmpty();
+  }
+}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ServerVariableTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ServerVariableTraversalTest.java
new file mode 100644
index 0000000..4bd05b6
--- /dev/null
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/ServerVariableTraversalTest.java
@@ -0,0 +1,54 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.openapi4j.parser.model.v3.ServerVariable;
+
+public class ServerVariableTraversalTest {
+
+  @Rule public final MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+  @Mock private TraversalHelperFactory traversalHelperFactory;
+  @Mock private ExtensionFactory extensionFactory;
+  @Mock private Extension extension;
+  @Mock private ServerVariable serverVariable;
+
+  private ServerVariableTraversal serverVariableTraversal;
+
+  /** Sets up live and mocked instances for testing. */
+  @Before
+  public void setup() {
+    serverVariableTraversal =
+        new ServerVariableTraversal(
+            traversalHelperFactory, extensionFactory, ImmutableList.of(), serverVariable, "");
+  }
+
+  @Test
+  public void traverse_withExtensions_returnsGeneratedExtensions() {
+    when(serverVariable.getExtensions()).thenReturn(Map.of("x-serverVariable", ""));
+    when(extensionFactory.create(anyString(), any(JsonNode.class), any(ImmutableList.class)))
+        .thenReturn(extension);
+
+    assertThat(serverVariableTraversal.traverse()).hasSize(1).containsOnlyOnce(extension);
+  }
+
+  @Test
+  public void traverse_withoutExtensions_returnsEmptyExtensionsImmutableList() {
+    when(serverVariable.getExtensions()).thenReturn(Map.of());
+
+    assertThat(serverVariableTraversal.traverse()).isEmpty();
+  }
+}