OpenApi: Broken parameters logic 62/106862/1
authorYaroslav Lastivka <yaroslav.lastivka@pantheon.tech>
Wed, 21 Jun 2023 09:26:45 +0000 (12:26 +0300)
committerIvan Hrasko <ivan.hrasko@pantheon.tech>
Tue, 11 Jul 2023 14:57:39 +0000 (14:57 +0000)
Logic of numbering for path parameters is broken.

Added additional nested loop for double checking
unique parameter's name.

Implemented Unit tests for validation new logic.

JIRA: NETCONF-1060
Change-Id: I8e36bd6d8dc932e9b032f3d9947a81ee2a93d010
Signed-off-by: Yaroslav Lastivka <yaroslav.lastivka@pantheon.tech>
Signed-off-by: Ivan Hrasko <ivan.hrasko@pantheon.tech>
(cherry picked from commit 29c6af29c7042f84f9db77174f2216380655e813)

restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/BaseYangOpenApiGenerator.java
restconf/restconf-openapi/src/test/java/org/opendaylight/restconf/openapi/impl/KeysMappingTest.java [new file with mode: 0644]

index 7f04dc4b6e48e6f1ebb9393f7712e66b3143776e..16068315408c301d4a712d8de072b20f383f4dad 100644 (file)
@@ -391,6 +391,12 @@ public abstract class BaseYangOpenApiGenerator {
                     if (paramName.equals(pathParam.get("name").asText())) {
                         paramName = keyName + discriminator;
                         discriminator++;
+                        for (final JsonNode pathParameter : pathParams) {
+                            if (paramName.equals(pathParameter.get("name").asText())) {
+                                paramName = keyName + discriminator;
+                                discriminator++;
+                            }
+                        }
                     }
                 }
 
diff --git a/restconf/restconf-openapi/src/test/java/org/opendaylight/restconf/openapi/impl/KeysMappingTest.java b/restconf/restconf-openapi/src/test/java/org/opendaylight/restconf/openapi/impl/KeysMappingTest.java
new file mode 100644 (file)
index 0000000..c5fb908
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.restconf.openapi.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.opendaylight.restconf.openapi.OpenApiTestUtils.getPathParameters;
+
+import java.util.List;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService;
+import org.opendaylight.restconf.openapi.model.OpenApiObject;
+import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
+
+public class KeysMappingTest {
+    private static OpenApiObject doc;
+
+    @BeforeClass
+    public static void startUp() {
+        final var context = YangParserTestUtils.parseYang("""
+            module keys-mapping {
+              namespace "mapping";
+              prefix keys-mapping;
+                list multiple-key-list {
+                  key "name name2";
+                  leaf name {
+                    type string;
+                  }
+                  leaf name2 {
+                    type string;
+                  }
+                  list multiple-key-list2 {
+                    key "name name3";
+                    leaf name {
+                      type string;
+                    }
+                    leaf name3 {
+                      type string;
+                    }
+                    list multiple-key-list3 {
+                      key "name3 name";
+                      leaf name3 {
+                        type string;
+                      }
+                      leaf name {
+                        type string;
+                      }
+                      list multiple-key-list4 {
+                        key name;
+                        leaf name {
+                          type string;
+                        }
+                      }
+                    }
+                  }
+                }
+              }""");
+        final var schemaService = mock(DOMSchemaService.class);
+        when(schemaService.getGlobalContext()).thenReturn(context);
+        final var generator = new OpenApiGeneratorRFC8040(schemaService);
+        final var module = context.findModule("keys-mapping").orElseThrow();
+        doc = generator.getOpenApiSpec(module, "http", "localhost:8181", "/", "", context);
+        assertNotNull(doc);
+    }
+
+    /**
+     * This test is designed to verify if the request parameters for nested lists with multiple keys are being
+     * enumerated properly.
+     *
+     * <p>
+     * This would mean that we will have name, name1, etc., when the same parameter appears multiple times in the path.
+     */
+    @Test
+    public void testKeysMapping() {
+        final var pathToMultipleKeyList4 = "/rests/data/keys-mapping:multiple-key-list={name},{name2}"
+            + "/multiple-key-list2={name1},{name3}/multiple-key-list3={name31},{name4}/multiple-key-list4={name5}";
+        assertTrue(doc.paths().containsKey(pathToMultipleKeyList4));
+        assertEquals(List.of("name","name2", "name1", "name3", "name31", "name4", "name5"),
+            getPathParameters(doc.paths(), pathToMultipleKeyList4));
+    }
+}