Skip to content

Commit 6a9df4d

Browse files
committed
oas3.1 initial support - tests and param resolution fix
1 parent 4f47551 commit 6a9df4d

File tree

11 files changed

+161
-7
lines changed

11 files changed

+161
-7
lines changed

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -759,7 +759,22 @@ public String processRefToExternalParameter(String $ref, RefFormat refFormat) {
759759
if (parameter.get$ref() != null) {
760760
RefFormat format = computeRefFormat(parameter.get$ref());
761761
if (isAnExternalRefFormat(format)) {
762-
parameter.set$ref(processRefToExternalParameter(parameter.get$ref(), format));
762+
String fullRef = parameter.get$ref();
763+
if (!format.equals(RefFormat.URL)) {
764+
String parent = file.substring(0, file.lastIndexOf('/'));
765+
if (!parent.isEmpty()) {
766+
if (fullRef.contains("#/")) {
767+
String[] parts = fullRef.split("#/");
768+
String fullRefFilePart = parts[0];
769+
String fullRefInternalRefPart = parts[1];
770+
fullRef = Paths.get(parent, fullRefFilePart).normalize().toString() + "#/" + fullRefInternalRefPart;
771+
} else {
772+
fullRef = Paths.get(parent, fullRef).normalize().toString();
773+
}
774+
}
775+
776+
}
777+
parameter.set$ref(processRefToExternalParameter(fullRef, format));
763778
} else {
764779
processRefToExternalParameter(file + parameter.get$ref(), RefFormat.RELATIVE);
765780
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ public OperationProcessor(ResolverCache cache, OpenAPI openAPI, boolean openapi3
3838
}
3939

4040
public void processOperation(Operation operation) {
41+
if (operation.getParameters() != null) {
42+
for (Parameter parameter : operation.getParameters()) {
43+
parameterProcessor.processParameter(parameter);
44+
}
45+
}
4146
final List<Parameter> processedOperationParameters = parameterProcessor.processParameters(operation.getParameters());
4247
if(processedOperationParameters != null) {
4348
operation.setParameters(processedOperationParameters);

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV31ParserTest.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.github.tomakehurst.wiremock.WireMockServer;
44
import com.github.tomakehurst.wiremock.client.WireMock;
55
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
6+
import io.swagger.v3.core.util.Yaml;
67
import io.swagger.v3.core.util.Yaml31;
78
import io.swagger.v3.parser.OpenAPIV3Parser;
89
import io.swagger.v3.parser.core.models.ParseOptions;
@@ -22,6 +23,7 @@
2223
import static com.github.tomakehurst.wiremock.client.WireMock.get;
2324
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching;
2425
import static org.testng.Assert.assertEquals;
26+
import static org.testng.Assert.assertNotNull;
2527
import static org.testng.Assert.assertTrue;
2628

2729
public class OpenAPIV31ParserTest {
@@ -47,6 +49,53 @@ private void tearDownWireMockServer() {
4749
}
4850

4951

52+
@Test
53+
public void testREf() throws Exception {
54+
ParseOptions p = new ParseOptions();
55+
p.setResolve(true);
56+
SwaggerParseResult swaggerParseResult = new OpenAPIV3Parser().readLocation("http://localhost:8082/root.yaml", null, p);
57+
Yaml.prettyPrint(swaggerParseResult);
58+
assertNotNull(swaggerParseResult.getOpenAPI());
59+
assertTrue(swaggerParseResult.getMessages().isEmpty());
60+
61+
}
62+
63+
@Test
64+
public void testREf2() throws Exception {
65+
ParseOptions p = new ParseOptions();
66+
p.setResolve(true);
67+
SwaggerParseResult swaggerParseResult = new OpenAPIV3Parser().readLocation("/html2/root.yaml", null, p);
68+
Yaml.prettyPrint(swaggerParseResult);
69+
assertNotNull(swaggerParseResult.getOpenAPI());
70+
assertTrue(swaggerParseResult.getMessages().isEmpty());
71+
72+
}
73+
74+
@Test
75+
public void testREf3() throws Exception {
76+
ParseOptions p = new ParseOptions();
77+
p.setResolve(true);
78+
SwaggerParseResult swaggerParseResult = new OpenAPIV3Parser().readLocation("/dati/dev/progetti/swagger/projects/swagger-parser/modules/swagger-parser-v3/src/test/resources/issue-1292/petstore.yml", null, p);
79+
80+
Yaml.prettyPrint(swaggerParseResult);
81+
assertNotNull(swaggerParseResult.getOpenAPI());
82+
assertTrue(swaggerParseResult.getMessages().isEmpty());
83+
84+
}
85+
86+
@Test
87+
public void testREf407() throws Exception {
88+
ParseOptions p = new ParseOptions();
89+
p.setResolve(true);
90+
SwaggerParseResult swaggerParseResult = new OpenAPIV3Parser().readLocation("/dati/dev/progetti/swagger/projects/swagger-parser/modules/swagger-parser-v3/src/test/resources/issue-407/petstore.yml", null, p);
91+
92+
Yaml.prettyPrint(swaggerParseResult);
93+
assertNotNull(swaggerParseResult.getOpenAPI());
94+
assertTrue(swaggerParseResult.getMessages().isEmpty());
95+
96+
}
97+
98+
5099
@Test
51100
public void testBasic() throws IOException {
52101
String pathFile = FileUtils.readFileToString(new File("src/test/resources/3.1.0/resolve/domain.yaml"), "UTF-8");

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/RelativeReferenceTest.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.swagger.v3.parser.test;
22

33

4+
import io.swagger.v3.core.util.Yaml;
45
import io.swagger.v3.oas.models.OpenAPI;
56
import io.swagger.v3.oas.models.parameters.RequestBody;
67
import io.swagger.v3.parser.OpenAPIV3Parser;
@@ -138,21 +139,41 @@ public void testIssue409() {
138139
OpenAPI swagger = (new OpenAPIV3Parser().readContents(yaml,null, null)).getOpenAPI();
139140
assertNotNull(swagger.getComponents().getSchemas().get("ID"));
140141
}
141-
142+
142143
@Test
143144
public void testResolveRelativePaths() {
144145
ParseOptions options = new ParseOptions();
145146
options.setResolve(true);
146147
SwaggerParseResult parseResult = new OpenAPIV3Parser().readLocation("/relative-references-example/openapi.yaml", null, options);
147-
148+
148149
Assert.assertNotNull(parseResult.getOpenAPI());
149-
150+
150151
HashSet<String> validationMessages = new HashSet<>(null != parseResult.getMessages() ? parseResult.getMessages() : new ArrayList<>());
151-
152-
152+
153+
153154
//validationMessages.forEach(msg->System.out.println(msg));
154155
//OpenAPI specification = parseResult.getOpenAPI();
155156
Assert.assertTrue(validationMessages.isEmpty(), validationMessages.toString());
156-
157+
158+
}
159+
160+
@Test
161+
public void testResolveRelativePaths2() {
162+
ParseOptions options = new ParseOptions();
163+
options.setResolve(true);
164+
//SwaggerParseResult parseResult = new OpenAPIV3Parser().readLocation("/relativeParent/root/root.yaml", null, options);
165+
SwaggerParseResult parseResult = new OpenAPIV3Parser().readLocation("/dati/dev/progetti/swagger/projects/swagger-parser/modules/swagger-parser-v3/src/test/resources/relativeParent/root/root.yaml", null, options);
166+
167+
168+
Assert.assertNotNull(parseResult.getOpenAPI());
169+
Yaml.prettyPrint(parseResult);
170+
171+
HashSet<String> validationMessages = new HashSet<>(null != parseResult.getMessages() ? parseResult.getMessages() : new ArrayList<>());
172+
173+
174+
//validationMessages.forEach(msg->System.out.println(msg));
175+
//OpenAPI specification = parseResult.getOpenAPI();
176+
Assert.assertTrue(validationMessages.isEmpty(), validationMessages.toString());
177+
157178
}
158179
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
components:
2+
schemas:
3+
Pet:
4+
$ref: "./def2.yml#/components/schemas/Pet"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
components:
2+
schemas:
3+
Pet:
4+
type: number
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
get:
2+
operationId: listPets
3+
responses:
4+
"200":
5+
content:
6+
application/json:
7+
schema:
8+
$ref: "./def.yml#/components/schemas/Pet"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
content:
2+
application/json:
3+
schema:
4+
$ref: "./def.yml#/components/schemas/Pet"
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
openapi: "3.0.0"
2+
info:
3+
version: 1.0.0
4+
title: Swagger Petstore
5+
servers:
6+
- url: http://petstore.swagger.io/v1
7+
paths:
8+
/pets:
9+
$ref: "./pets/pets.yml"
10+
/petres:
11+
get:
12+
operationId: aaget
13+
responses:
14+
200:
15+
$ref: "./pets/response.yml"
16+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
openapi: 3.0.0
2+
info:
3+
title: MyExampleSpec
4+
description: >-
5+
paths: {}
6+
components:
7+
schemas:
8+
MyExampleSchema:
9+
description: >-
10+
properties:
11+
id:
12+
description: The id of MyExampleSchema.
13+
type: string
14+
message:
15+
description: The message of MyExampleSchema.
16+
$ref: ../specs/specs.yaml#/components/schemas/Message

0 commit comments

Comments
 (0)