Skip to content

Commit 7098fc0

Browse files
committed
Fix #1955 Schema refs of array parameters are not resolved for renamed schema components
1 parent 64f1467 commit 7098fc0

File tree

5 files changed

+121
-6
lines changed

5 files changed

+121
-6
lines changed

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/PathsProcessor.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ else if(model.getProperties() != null) {
245245
for(String key : properties.keySet()) {
246246
Schema property = properties.get(key);
247247
if (property != null) {
248-
updateRefs(property, pathRef);
248+
updateRefs(property, "");
249249
}
250250
}
251251
}
@@ -254,22 +254,22 @@ else if(model instanceof ComposedSchema) {
254254
ComposedSchema composedSchema = (ComposedSchema) model;
255255
if (composedSchema.getAllOf() != null) {
256256
for (Schema innerModel : composedSchema.getAllOf()) {
257-
updateRefs(innerModel, pathRef);
257+
updateRefs(innerModel, "");
258258
}
259259
}if (composedSchema.getAnyOf() != null) {
260260
for(Schema innerModel : composedSchema.getAnyOf()) {
261-
updateRefs(innerModel, pathRef);
261+
updateRefs(innerModel, "");
262262
}
263263
}if (composedSchema.getOneOf() != null) {
264264
for (Schema innerModel : composedSchema.getOneOf()) {
265-
updateRefs(innerModel, pathRef);
265+
updateRefs(innerModel, "");
266266
}
267267
}
268268
}
269269
else if(model instanceof ArraySchema) {
270270
ArraySchema arraySchema = (ArraySchema) model;
271271
if(arraySchema.getItems() != null) {
272-
updateRefs(arraySchema.getItems(), pathRef);
272+
updateRefs(arraySchema.getItems(), "");
273273
}
274274
}
275275
}

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/processors/PathsProcessorTest.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,20 @@
44
import io.swagger.v3.oas.models.Operation;
55
import io.swagger.v3.oas.models.PathItem;
66
import io.swagger.v3.oas.models.PathItem.HttpMethod;
7+
import io.swagger.v3.oas.models.media.Schema;
8+
import io.swagger.v3.oas.models.parameters.Parameter;
79
import io.swagger.v3.parser.OpenAPIV3Parser;
10+
import io.swagger.v3.parser.core.models.ParseOptions;
11+
import io.swagger.v3.parser.core.models.SwaggerParseResult;
812
import org.testng.annotations.Test;
913

14+
import java.net.URL;
1015
import java.util.Map.Entry;
16+
import java.util.Objects;
1117

1218
import static java.lang.String.format;
1319
import static org.testng.Assert.assertFalse;
20+
import static org.testng.Assert.assertTrue;
1421

1522
public class PathsProcessorTest {
1623

@@ -42,6 +49,36 @@ public void testProcessPaths_parameters_refOperationLevelDefinition() {
4249
assertOperationsHasParameters(openAPI, "/ref/test/{id}/operationlevelparam");
4350
}
4451

52+
@Test
53+
public void testProcessPaths_refsToRenamedSchemasResolved() {
54+
URL mergeSpecLocation = getClass().getClassLoader().getResource("issue-1955/merged_spec12.yaml");
55+
Objects.requireNonNull(mergeSpecLocation);
56+
ParseOptions parseOptions = new ParseOptions();
57+
parseOptions.setResolve(true);
58+
59+
SwaggerParseResult swaggerParseResult = new OpenAPIV3Parser().readLocation(mergeSpecLocation.toString(), null, parseOptions);
60+
61+
swaggerParseResult.getOpenAPI()
62+
.getPaths().values().stream()
63+
.flatMap(path -> path.readOperationsMap().values().stream())
64+
.flatMap(operation -> operation.getParameters().stream())
65+
.map(Parameter::getSchema)
66+
.forEach(this::assertSchemaNoExternalRefs);
67+
}
68+
69+
private void assertSchemaNoExternalRefs(Schema<?> schema) {
70+
if (schema.get$ref() != null) {
71+
assertSchemaRefInternal(schema.get$ref());
72+
}
73+
if (schema.getItems() != null && schema.getItems().get$ref() != null) {
74+
assertSchemaRefInternal(schema.getItems().get$ref());
75+
}
76+
}
77+
78+
private void assertSchemaRefInternal(String ref) {
79+
assertTrue(ref.startsWith("#"));
80+
}
81+
4582
private void assertOperationsHasParameters(OpenAPI openAPI, String path) {
4683
PathItem pathItem = openAPI.getPaths().get(path);
4784

@@ -54,4 +91,4 @@ private void assertOperationsHasParameters(OpenAPI openAPI, String path) {
5491
assertFalse(operation.getParameters() == null || operation.getParameters().isEmpty(), format("Expected parameters on %s operation for %s but found none", httpMethod, path));
5592
}
5693
}
57-
}
94+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
openapi: 3.0.1
2+
info:
3+
title: merged spec
4+
version: 1.0.0
5+
servers:
6+
- url: http://localhost:8080
7+
8+
paths:
9+
10+
/getEmptyOne:
11+
$ref: "./spec1.yaml#/paths/~1getEmptyOne"
12+
13+
/getEmptyTwo:
14+
$ref: "./spec2.yaml#/paths/~1getEmptyTwo"
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
openapi: 3.0.1
2+
info:
3+
title: spec 1
4+
version: 1.0.0
5+
servers:
6+
- url: http://localhost:8080
7+
8+
paths:
9+
10+
/getEmptyOne:
11+
get:
12+
operationId: getEmptyOne
13+
parameters:
14+
- name: element
15+
in: query
16+
schema:
17+
$ref: '#/components/schemas/myType'
18+
- name: elements
19+
in: query
20+
schema:
21+
type: array
22+
items:
23+
$ref: '#/components/schemas/myType'
24+
responses:
25+
"204":
26+
description: empty
27+
28+
components:
29+
schemas:
30+
31+
myType:
32+
type: string
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
openapi: 3.0.1
2+
info:
3+
title: spec 2
4+
version: 1.0.0
5+
servers:
6+
- url: http://localhost:8080
7+
8+
paths:
9+
10+
/getEmptyTwo:
11+
get:
12+
operationId: getEmptyTwo
13+
parameters:
14+
- name: element
15+
in: query
16+
schema:
17+
$ref: '#/components/schemas/myType'
18+
- name: elements
19+
in: query
20+
schema:
21+
type: array
22+
items:
23+
$ref: '#/components/schemas/myType'
24+
responses:
25+
"204":
26+
description: empty
27+
28+
components:
29+
schemas:
30+
31+
myType:
32+
type: integer

0 commit comments

Comments
 (0)