From b61834f45df7e94aea58cbdbd2f28dc967f01313 Mon Sep 17 00:00:00 2001 From: Nicolai D'Effremo Date: Thu, 13 Nov 2025 09:37:49 +0100 Subject: [PATCH 1/4] test: Add a test to verify faulty ref resolution --- .../v3/parser/test/OpenAPIResolverTest.java | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java index ff1b353014..c8847b25ce 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java @@ -657,6 +657,60 @@ public void testIssue85() { assertTrue(prop instanceof Schema); } + @Test + void testIssue2211() { + // given + String yaml = + " openapi: 3.0.3\n" + + " info:\n" + + " title: technical-definitions\n" + + " description: Commons technical definitions\n" + + " version: 1.0.0\n" + + " paths:\n" + + " /components/parameter:\n" + + " get:\n" + + " tags:\n" + + " - example\n" + + " operationId: getExampleById4\n" + + " parameters:\n" + + " - $ref: '#/components/parameters/Parameter'\n" + + " responses:\n" + + " '200':\n" + + " description: Successful response\n" + + " content:\n" + + " application/json:\n" + + " schema:\n" + + " type: object\n" + + " properties:\n" + + " message:\n" + + " type: string\n" + + " example: Success\n" + + " components:\n" + + " parameters:\n" + + " Parameter:\n" + + " name: id\n" + + " in: query\n" + + " description: The ID of the example to retrieve\n" + + " required: true\n" + + " style: form\n" + + " explode: true\n" + + " schema:\n" + + " type: string\n" + + "\n"; + + ParseOptions options = new ParseOptions(); + options.setResolve(true); + + // when + SwaggerParseResult parseResult = new OpenAPIV3Parser().readContents(yaml, auths, options); + + OpenAPI openAPI = parseResult.getOpenAPI(); + + // then + assertNotNull(openAPI); + assertEquals(openAPI.getPaths().get("/components/parameter").getGet().getParameters().get(0).get$ref(), "#/components/parameters/Parameter"); + } + @Test public void testIssue1352() { ParseOptions options = new ParseOptions(); @@ -1500,5 +1554,5 @@ public Object[][] explicitObjectSchemaProvider() { { false } }; } - + } From d3defc9f08560867aa3ecdc8b3756029d4d96b70 Mon Sep 17 00:00:00 2001 From: Nicolai D'Effremo Date: Wed, 26 Nov 2025 12:28:31 +0100 Subject: [PATCH 2/4] fix: Consider PathItem parameters for resolveFully. --- .../swagger/v3/parser/util/ResolverFully.java | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java index 3f3e19ec3b..549d8cde13 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java @@ -134,29 +134,14 @@ public void resolveFully(OpenAPI openAPI) { } public void resolvePath(PathItem pathItem){ + if (pathItem.getParameters() != null) { + pathItem.setParameters(mapToResolvedParameters(pathItem.getParameters())); + } + for(Operation op : pathItem.readOperations()) { // inputs if (op.getParameters() != null) { - for (Parameter parameter : op.getParameters()) { - parameter = parameter.get$ref() != null ? resolveParameter(parameter) : parameter; - if (parameter.getSchema() != null) { - Schema resolved = resolveSchema(parameter.getSchema()); - if (resolved != null) { - parameter.setSchema(resolved); - } - } - if(parameter.getContent() != null){ - Map content = parameter.getContent(); - for (String key: content.keySet()){ - if (content.get(key) != null && content.get(key).getSchema() != null ){ - Schema resolvedSchema = resolveSchema(content.get(key).getSchema()); - if (resolvedSchema != null) { - content.get(key).setSchema(resolvedSchema); - } - } - } - } - } + op.setParameters(mapToResolvedParameters(op.getParameters())); } if (op.getCallbacks() != null){ @@ -232,6 +217,33 @@ public void resolvePath(PathItem pathItem){ } } + private List mapToResolvedParameters(List rawParameters) { + List resolvedParameters = new ArrayList<>(); + for (Parameter parameter : rawParameters) { + parameter = parameter.get$ref() != null ? resolveParameter(parameter) : parameter; + if (parameter.getSchema() != null) { + Schema resolved = resolveSchema(parameter.getSchema()); + if (resolved != null) { + parameter.setSchema(resolved); + } + } + if (parameter.getContent() != null) { + Map content = parameter.getContent(); + for (String key : content.keySet()) { + if (content.get(key) != null && content.get(key).getSchema() != null) { + Schema resolvedSchema = resolveSchema(content.get(key).getSchema()); + if (resolvedSchema != null) { + content.get(key).setSchema(resolvedSchema); + } + } + } + } + resolvedParameters.add(parameter); + } + + return resolvedParameters; + } + private void resolveHeaders(Map headers) { if (headers == null || headers.isEmpty()) { return; From 2d42f0c153ebeca607f3abb5bb666ea8b3862946 Mon Sep 17 00:00:00 2001 From: Nicolai D'Effremo Date: Wed, 26 Nov 2025 17:03:10 +0100 Subject: [PATCH 3/4] fix: No inlining sideeffect for parameter processing --- .../swagger/v3/parser/processors/ParameterProcessor.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ParameterProcessor.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ParameterProcessor.java index 6da973943c..278515bc71 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ParameterProcessor.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ParameterProcessor.java @@ -99,6 +99,11 @@ public List processParameters(List parameters) { } } + + if (processedPathLevelParameters.isEmpty()) { + processedPathLevelParameters.addAll(refParameters); + } + processedPathLevelParameters.forEach(parameter -> { if (parameter.getSchema() != null) { schemaProcessor.processSchema(parameter.getSchema()); @@ -140,7 +145,7 @@ private List processPathLevelParams(List parameters, List< if (matched) { refParameters.add(resolvedParameter); } else { - processedPathLevelParameters.add(resolvedParameter); + processedPathLevelParameters.add(parameter); } } else { processedPathLevelParameters.add(parameter); From 99f5b3efa2aa145bc15d9c77816c29d23abc5887 Mon Sep 17 00:00:00 2001 From: Nicolai D'Effremo Date: Wed, 26 Nov 2025 17:04:04 +0100 Subject: [PATCH 4/4] chore: Address test not testing, according to parser spec behavior --- .../processors/ParameterProcessorTest.java | 7 +++ .../v3/parser/test/FileReferenceTest.java | 30 ++++++---- .../v3/parser/test/NetworkReferenceTest.java | 10 +++- .../v3/parser/test/OpenAPIResolverTest.java | 21 +++++-- .../v3/parser/test/OpenAPIV3ParserTest.java | 57 ++++++++++++++----- .../v3/parser/test/OpenAPIV3RefTest.java | 13 ++++- .../ParserDeduplicationParameterTest.java | 17 +++++- 7 files changed, 120 insertions(+), 35 deletions(-) diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/processors/ParameterProcessorTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/processors/ParameterProcessorTest.java index 4f36b35436..95092a4430 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/processors/ParameterProcessorTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/processors/ParameterProcessorTest.java @@ -14,6 +14,7 @@ import io.swagger.v3.parser.ResolverCache; import io.swagger.v3.parser.models.RefFormat; import mockit.*; +import org.testng.annotations.Ignore; import org.testng.annotations.Test; @@ -109,10 +110,16 @@ public void testProcessParameters_RefToHeader() throws Exception { final String ref = "#/components/parameters/foo"; Parameter refParameter = new Parameter().$ref(ref); + refParameter.setName("foo"); + refParameter.setIn("header"); expectLoadingRefFromCache(ref, RefFormat.INTERNAL, resolvedHeaderParam); new Expectations() { { + resolvedHeaderParam.getName(); + result = "foo"; + resolvedHeaderParam.getIn(); + result = "header"; resolvedHeaderParam.getSchema(); result = null; resolvedHeaderParam.getContent(); diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/FileReferenceTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/FileReferenceTest.java index b07f3986ff..749d84f674 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/FileReferenceTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/FileReferenceTest.java @@ -3,15 +3,18 @@ import io.swagger.v3.core.util.Yaml; +import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.ComposedSchema; import io.swagger.v3.oas.models.media.Schema; +import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.parser.OpenAPIV3Parser; import io.swagger.v3.parser.core.models.ParseOptions; import io.swagger.v3.parser.core.models.SwaggerParseResult; +import io.swagger.v3.parser.reference.ReferenceUtils; import org.testng.annotations.Test; import static org.testng.Assert.*; @@ -226,28 +229,35 @@ public void testIssue421() { assertNotNull(swagger.getPaths().get("/pet/{petId}")); assertNotNull(swagger.getPaths().get("/pet/{petId}").getGet()); assertNotNull(swagger.getPaths().get("/pet/{petId}").getGet().getParameters()); - assertTrue(swagger.getPaths().get("/pet/{petId}").getGet().getParameters().size() == 1); - assertTrue(swagger.getPaths().get("/pet/{petId}").getGet().getParameters().get(0).getName().equals("petId")); + assertEquals(swagger.getPaths().get("/pet/{petId}").getGet().getParameters().size(), 1); + + Parameter parameter = swagger.getPaths().get("/pet/{petId}").getGet().getParameters().get(0); + String refName = ReferenceUtils.getRefName(parameter.get$ref()); + Components components = result.getOpenAPI().getComponents(); + Parameter refParam = components.getParameters().get(refName); + + assertEquals(refParam.getName(), "petId"); + assertTrue(swagger.getComponents().getSchemas().get("Pet") instanceof Schema); - assertTrue(swagger.getComponents().getSchemas().get("Pet").getProperties().size() == 6); + assertEquals(swagger.getComponents().getSchemas().get("Pet").getProperties().size(), 6); assertNotNull(swagger.getPaths().get("/pet/{petId}").getPost()); assertNotNull(swagger.getPaths().get("/pet/{petId}").getPost().getParameters()); - assertTrue(swagger.getPaths().get("/pet/{petId}").getPost().getParameters().size() == 1); - assertTrue(swagger.getPaths().get("/pet/{petId}").getPost().getRequestBody() != null); - assertTrue(swagger.getPaths().get("/pet/{petId}").getPost().getRequestBody().get$ref() != null); + assertEquals(swagger.getPaths().get("/pet/{petId}").getPost().getParameters().size(), 1); + assertNotNull(swagger.getPaths().get("/pet/{petId}").getPost().getRequestBody()); + assertNotNull(swagger.getPaths().get("/pet/{petId}").getPost().getRequestBody().get$ref()); assertEquals(swagger.getPaths().get("/pet/{petId}").getPost().getRequestBody().get$ref(),"#/components/requestBodies/requestBody"); - assertTrue(swagger.getPaths().get("/pet/{petId}").getPost().getRequestBody().get$ref().equals("#/components/requestBodies/requestBody")); + assertEquals(swagger.getPaths().get("/pet/{petId}").getPost().getRequestBody().get$ref(), "#/components/requestBodies/requestBody"); assertNotNull(swagger.getPaths().get("/store/order")); assertNotNull(swagger.getPaths().get("/store/order").getPost()); assertNotNull(swagger.getPaths().get("/store/order").getPost().getRequestBody()); assertNotNull(swagger.getPaths().get("/store/order").getPost().getRequestBody().getContent().get("application/json").getSchema()); - assertTrue(swagger.getPaths().get("/store/order").getPost().getRequestBody().getContent().get("application/json").getSchema().get$ref() != null); - assertTrue(swagger.getPaths().get("/store/order").getPost().getRequestBody().getContent().get("application/json").getSchema().get$ref().equals("#/components/schemas/Order")); + assertNotNull(swagger.getPaths().get("/store/order").getPost().getRequestBody().getContent().get("application/json").getSchema().get$ref()); + assertEquals(swagger.getPaths().get("/store/order").getPost().getRequestBody().getContent().get("application/json").getSchema().get$ref(), "#/components/schemas/Order"); assertTrue(swagger.getComponents().getSchemas().get("Order") instanceof Schema); - assertTrue(swagger.getComponents().getSchemas().get("Order").getProperties().size() == 6); + assertEquals(swagger.getComponents().getSchemas().get("Order").getProperties().size(), 6); } @Test diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/NetworkReferenceTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/NetworkReferenceTest.java index bc0d4a4aaa..33e7651f96 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/NetworkReferenceTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/NetworkReferenceTest.java @@ -1,6 +1,7 @@ package io.swagger.v3.parser.test; +import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.media.Schema; @@ -11,6 +12,7 @@ import io.swagger.v3.parser.core.models.AuthorizationValue; import io.swagger.v3.parser.core.models.ParseOptions; import io.swagger.v3.parser.core.models.SwaggerParseResult; +import io.swagger.v3.parser.reference.ReferenceUtils; import io.swagger.v3.parser.urlresolver.PermittedUrlsChecker; import io.swagger.v3.parser.util.RemoteUrl; import mockit.Expectations; @@ -288,8 +290,12 @@ public void testIssue411() throws Exception { assertNotNull(swagger.getComponents().getSchemas().get("Success")); Parameter param = swagger.getPaths().get("/stuff").getGet().getParameters().get(0); - assertEquals(param.getIn(), "query"); - assertEquals(param.getName(), "skip"); + String refName = ReferenceUtils.getRefName(param.get$ref()); + Components components = result.getOpenAPI().getComponents(); + Parameter refParam = components.getParameters().get(refName); + + assertEquals(refParam.getIn(), "query"); + assertEquals(refParam.getName(), "skip"); ApiResponse response = swagger.getPaths().get("/stuff").getGet().getResponses().get("200"); assertNotNull(response); diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java index c8847b25ce..01902ded29 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java @@ -39,6 +39,7 @@ import io.swagger.v3.parser.reference.DereferencerContext; import io.swagger.v3.parser.reference.DereferencersFactory; import io.swagger.v3.parser.reference.OpenAPIDereferencer; +import io.swagger.v3.parser.reference.ReferenceUtils; import io.swagger.v3.parser.util.OpenAPIDeserializer; import io.swagger.v3.parser.util.ResolverFully; import org.apache.commons.io.FileUtils; @@ -563,7 +564,11 @@ public void pathsResolver() throws Exception { assertEquals(id.get$ref(),"#/components/schemas/Pet"); //internal parameter url - assertEquals(openAPI.getPaths().get("/store/inventory").getGet().getParameters().get(0), openAPI.getComponents().getParameters().get("limitParam")); + Parameter inventoryParam = openAPI.getPaths().get("/store/inventory").getGet().getParameters().get(0); + String refName = ReferenceUtils.getRefName(inventoryParam.get$ref()); + assertEquals(refName, "limitParam"); + Components components = openAPI.getComponents(); + assertEquals(components.getParameters().get(refName).getName(), "limit"); } @Test @@ -1232,7 +1237,9 @@ public void testOperationParameterRemoteRefs() { final List params = swagger.getPaths().get("/fun").getGet().getParameters(); assertEquals(params.size(), 1); final Parameter param = params.get(0); - assertEquals(param.getName(), "skip"); + String refName = ReferenceUtils.getRefName(param.get$ref()); + Components components = swagger.getComponents(); + assertEquals(components.getParameters().get(refName).getName(), "skip"); } @@ -1257,7 +1264,9 @@ public void testOperationBodyParameterRemoteRefs() { final List params = swagger.getPaths().get("/fun").getGet().getParameters(); assertEquals(params.size(), 1); final Parameter param = params.get(0); - assertEquals(param.getName(), "skip"); + String refName = ReferenceUtils.getRefName(param.get$ref()); + Components components = swagger.getComponents(); + assertEquals(components.getParameters().get(refName).getName(), "skip"); } private void testResponseRemoteRefs(String remoteRef) { @@ -1392,8 +1401,10 @@ public void testIssue291() { Parameter param = resolved.getPaths().get("/test").getGet().getParameters().get(0); - QueryParameter qp = (QueryParameter) param; - //assertEquals(qp.getCollectionFormat(), "csv"); + String refName = ReferenceUtils.getRefName(param.get$ref()); + Components components = resolved.getComponents(); + QueryParameter refParameter = (QueryParameter) components.getParameters().get(refName); + assertEquals(refParameter.getName(), "test"); } @Test diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java index 42cab31d92..2b0bccaf99 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java @@ -18,6 +18,7 @@ import io.swagger.v3.parser.core.models.AuthorizationValue; import io.swagger.v3.parser.core.models.ParseOptions; import io.swagger.v3.parser.core.models.SwaggerParseResult; +import io.swagger.v3.parser.reference.ReferenceUtils; import io.swagger.v3.parser.util.SchemaTypeUtil; import org.apache.commons.io.FileUtils; import org.hamcrest.CoreMatchers; @@ -184,7 +185,13 @@ public void testParametersAndResponsesAsNumbers() { Assert.assertNotNull(result); Assert.assertNotNull(result.getOpenAPI()); - Assert.assertEquals(result.getOpenAPI().getPaths().get("/api/deal/{dealId}").getGet().getParameters().get(0).getName(), "dealId"); + + Parameter param = result.getOpenAPI().getPaths().get("/api/deal/{dealId}").getGet().getParameters().get(0); + String refName = ReferenceUtils.getRefName(param.get$ref()); + Components components = result.getOpenAPI().getComponents(); + Parameter refParameter = components.getParameters().get(refName); + Assert.assertEquals(refParameter.getName(), "dealId"); + Assert.assertEquals(result.getOpenAPI().getPaths().get("/api/deal/{dealId}").getGet().getResponses().get("200").getDescription(), "Success"); } @@ -1334,14 +1341,22 @@ public void testRemotePathItemIssue1103() { OpenAPI result = new OpenAPIV3Parser().read("issue-1103/remote-pathItem-swagger.yaml"); Assert.assertNotNull(result); Assert.assertNotNull(result.getPaths().get("/Translation/{lang}")); - Assert.assertEquals(result.getPaths().get("/Translation/{lang}").getPut().getParameters().get(0).getName(), "lang"); + Parameter param = result.getPaths().get("/Translation/{lang}").getPut().getParameters().get(0); + String refName = ReferenceUtils.getRefName(param.get$ref()); + Components components = result.getComponents(); + Parameter refParameter = components.getParameters().get(refName); + Assert.assertEquals(refParameter.getName(), "lang"); } @Test public void testRemoteParameterIssue1103() { OpenAPI result = new OpenAPIV3Parser().read("issue-1103/remote-parameter-swagger.yaml"); Assert.assertNotNull(result); - Assert.assertEquals(result.getPaths().get("/Translation/{lang}").getPut().getParameters().get(0).getName(), "lang"); + Parameter param = result.getPaths().get("/Translation/{lang}").getPut().getParameters().get(0); + String refName = ReferenceUtils.getRefName(param.get$ref()); + Components components = result.getComponents(); + Parameter refParameter = components.getParameters().get(refName); + Assert.assertEquals(refParameter.getName(), "lang"); } @Test @@ -1974,7 +1989,7 @@ private OpenAPI doRelativeFileTest(String location) { options.setResolveResponses(true); SwaggerParseResult readResult = parser.readLocation(location, null, options); - if (readResult.getMessages().size() > 0) { + if (!readResult.getMessages().isEmpty()) { Json.prettyPrint(readResult.getMessages()); } final OpenAPI openAPI = readResult.getOpenAPI(); @@ -1986,10 +2001,16 @@ private OpenAPI doRelativeFileTest(String location) { final Operation operation = path.getGet(); final List operationParams = operation.getParameters(); - assertParamDetails(operationParams, 0, QueryParameter.class, "param1", "query"); - assertParamDetails(operationParams, 1, HeaderParameter.class, "param2", "header"); - assertParamDetails(operationParams, 2, PathParameter.class, "param3", "path"); - assertParamDetails(operationParams, 3, HeaderParameter.class, "param4", "header"); + List componentParameters = operationParams.stream() + .map(param -> { + String refName = ReferenceUtils.getRefName(param.get$ref()); + return openAPI.getComponents().getParameters().get(refName); + }).collect(Collectors.toList()); + + assertParamDetails(componentParameters, 0, QueryParameter.class, "param1", "query"); + assertParamDetails(componentParameters, 1, HeaderParameter.class, "param2", "header"); + assertParamDetails(componentParameters, 2, PathParameter.class, "param3", "path"); + assertParamDetails(componentParameters, 3, HeaderParameter.class, "param4", "header"); final Map responsesMap = operation.getResponses(); @@ -2264,9 +2285,10 @@ public void testIssue358() { final OpenAPI openAPI = parser.read("src/test/resources/issue_358.yaml"); assertNotNull(openAPI); List parms = openAPI.getPaths().get("/testApi").getGet().getParameters(); - assertEquals(1, parms.size()); - assertEquals("pathParam", parms.get(0).getName()); - assertEquals("string", parms.get(0).getSchema().getType()); + // FIXME nid 19.11.2025 : I do not think the behaviour is right. See spec > https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.4.md#path-item-object + assertEquals(parms.size(), 1); + assertEquals(parms.get(0).getName(), "pathParam"); + assertEquals(parms.get(0).getSchema().getType(), "string"); } @Test @@ -2523,6 +2545,7 @@ public void shouldParseParameters() { parseOptions.setResolveFully(true); OpenAPI openAPI = new OpenAPIV3Parser().read("src/test/resources/issue_877.yaml", null, parseOptions); Parameter parameter = openAPI.getPaths().get("/adopt").getGet().getParameters().get(0); + // FIXME nid 19.11.2025 : ResolveFully should inline here. assertNotNull(parameter); assertEquals(parameter.getIn(), "path"); assertEquals(parameter.getName(), "playerId"); @@ -2770,11 +2793,17 @@ public void testIssue1063() { // then OpenAPI api = result.getOpenAPI(); - assertEquals(api.getPaths().get("/anPath").getGet().getParameters().get(0).getName(), "customer-id"); - assertEquals(api.getPaths().get("/anPath").getGet().getParameters().get(1).getName(), "unit-id"); + Components components = api.getComponents(); - assertThat(result.getMessages(), equalTo(emptyList())); + Parameter customerIdParameter = api.getPaths().get("/anPath").getGet().getParameters().get(0); + String customerIdRefName = ReferenceUtils.getRefName(customerIdParameter.get$ref()); + Assert.assertEquals(components.getParameters().get(customerIdRefName).getName(), "customer-id"); + Parameter unitIdParameter = api.getPaths().get("/anPath").getGet().getParameters().get(1); + String unitIdRefName = ReferenceUtils.getRefName(unitIdParameter.get$ref()); + Assert.assertEquals(components.getParameters().get(unitIdRefName).getName(), "unit-id"); + + assertThat(result.getMessages(), equalTo(emptyList())); } @Test diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3RefTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3RefTest.java index 5cfaf6af16..9fd015903d 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3RefTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3RefTest.java @@ -8,7 +8,10 @@ import java.util.stream.Collectors; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.parser.core.models.SwaggerParseResult; +import io.swagger.v3.parser.reference.ReferenceUtils; import org.junit.Before; import org.junit.Test; import org.testng.Assert; @@ -45,7 +48,10 @@ public void testRefContainingDot() { Assert.assertNotNull(result.getOpenAPI()); Assert.assertTrue(result.getMessages().isEmpty(), "No error messages should be present"); Assert.assertNotNull(result.getOpenAPI().getPaths().get("/endpoint").getGet().getParameters()); - Assert.assertEquals(result.getOpenAPI().getPaths().get("/endpoint").getGet().getParameters().get(0).getName(), "FbtPrincipalIdentity"); + Parameter parameter = result.getOpenAPI().getPaths().get("/endpoint").getGet().getParameters().get(0); + String refName = ReferenceUtils.getRefName(parameter.get$ref()); + Components components = result.getOpenAPI().getComponents(); + Assert.assertEquals(components.getParameters().get(refName).getName(), "FbtPrincipalIdentity"); } @Test @@ -57,7 +63,10 @@ public void testExternalRefContainingDot() { Assert.assertNotNull(result.getOpenAPI()); Assert.assertTrue(result.getMessages().isEmpty(), "No error messages should be present"); Assert.assertNotNull(result.getOpenAPI().getPaths().get("/endpoint").getGet().getParameters()); - Assert.assertEquals(result.getOpenAPI().getPaths().get("/endpoint").getGet().getParameters().get(0).getName(), "FbtPrincipalIdentity"); + Parameter parameter = result.getOpenAPI().getPaths().get("/endpoint").getGet().getParameters().get(0); + String refName = ReferenceUtils.getRefName(parameter.get$ref()); + Components components = result.getOpenAPI().getComponents(); + Assert.assertEquals(components.getParameters().get(refName).getName(), "FbtPrincipalIdentity"); } @Test diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/ParserDeduplicationParameterTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/ParserDeduplicationParameterTest.java index 568d7f616b..6c10c6fe1a 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/ParserDeduplicationParameterTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/ParserDeduplicationParameterTest.java @@ -1,9 +1,11 @@ package io.swagger.v3.parser.test; +import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.parser.OpenAPIV3Parser; import io.swagger.v3.parser.core.models.ParseOptions; +import io.swagger.v3.parser.reference.ReferenceUtils; import org.testng.annotations.Test; import java.util.List; @@ -45,8 +47,19 @@ public void testDuplicatedParameterNameFromRef() { options.setFlatten(true); OpenAPI openAPI = openApiParser.read("issue-2102/openapi30.json", null, options); - assertEquals(openAPI.getPaths().get("/myoperation").getGet().getParameters().size(), 2); - assertEquals((int) openAPI.getPaths().get("/myoperation").getGet().getParameters().stream().filter(param -> param.getName().equals("myParam")).count(), 2); + List parameters = openAPI.getPaths().get("/myoperation").getGet().getParameters(); + assertEquals(parameters.size(), 2); + + long namedParameterCount = parameters.stream() + .map(param -> { + String refName = ReferenceUtils.getRefName(param.get$ref()); + Components components = openAPI.getComponents(); + return components.getParameters().get(refName); + }) + .filter(param -> param.getName().equals("myParam")) + .count(); + + assertEquals((int)namedParameterCount, 2); } @Test(description = "Duplicated parameter name with different locations")