Skip to content

Commit 16728fa

Browse files
author
Anatolii Volkodav
committed
fixed bug related to nested definitions within subfolder
1 parent 1f9130c commit 16728fa

File tree

14 files changed

+158
-1
lines changed

14 files changed

+158
-1
lines changed

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package io.swagger.v3.parser.processors;
22

33

4+
import java.io.File;
45
import java.net.URI;
6+
import java.nio.file.Paths;
57
import java.util.Collection;
68
import java.util.LinkedHashMap;
79
import java.util.List;
@@ -111,7 +113,12 @@ public String processRefToExternalSchema(String $ref, RefFormat refFormat) {
111113
if (schema.get$ref() != null) {
112114
RefFormat ref = computeRefFormat(schema.get$ref());
113115
if (isAnExternalRefFormat(ref)) {
114-
schema.set$ref(processRefToExternalSchema(schema.get$ref(), ref));
116+
String schemaFullRef = schema.get$ref();
117+
String parent = file.substring(0, file.lastIndexOf(File.separatorChar));
118+
if (!parent.isEmpty()) {
119+
schemaFullRef = Paths.get(parent, schemaFullRef).normalize().toString();
120+
}
121+
schema.set$ref(processRefToExternalSchema(schemaFullRef, ref));
115122
} else {
116123
processRefToExternalSchema(file + schema.get$ref(), RefFormat.RELATIVE);
117124
}

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

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1296,6 +1296,69 @@ public void testLoadExternalNestedDefinitions() throws Exception {
12961296
assertEquals( definitions.get("k").getTitle(), "k-definition");
12971297
}
12981298

1299+
@Test
1300+
public void testLoadExternalNestedDefinitionsWithReferenceWithinSubfolder() throws Exception {
1301+
OpenAPIV3Parser parser = new OpenAPIV3Parser();
1302+
final OpenAPI openAPI = parser.read("src/test/resources/nested-references-2/main.yaml");
1303+
1304+
Map<String, Schema> definitions = openAPI.getComponents().getSchemas();
1305+
assertTrue(definitions.containsKey("GreetingResponse"));
1306+
assertTrue(definitions.containsKey("GreetingMessage"));
1307+
assertTrue(definitions.containsKey("greeting-message"));
1308+
1309+
String greetingMessageRef = ((Schema) definitions.get("GreetingResponse")
1310+
.getProperties().get("GreetingMessage")).get$ref();
1311+
1312+
assertEquals(greetingMessageRef,"#/components/schemas/GreetingMessage");
1313+
assertEquals(definitions.get("GreetingMessage").get$ref(),"#/components/schemas/greeting-message");
1314+
1315+
String description = ((Schema)definitions.get("greeting-message")
1316+
.getProperties().get("Text")).getDescription();
1317+
assertEquals(description,"Text message");
1318+
}
1319+
1320+
@Test
1321+
public void testLoadExternalNestedDefinitionsWithReferenceWithinSameFolder() throws Exception {
1322+
OpenAPIV3Parser parser = new OpenAPIV3Parser();
1323+
final OpenAPI openAPI = parser.read("src/test/resources/nested-references-3/main.yaml");
1324+
1325+
Map<String, Schema> definitions = openAPI.getComponents().getSchemas();
1326+
assertTrue(definitions.containsKey("GreetingResponse"));
1327+
assertTrue(definitions.containsKey("GreetingMessage"));
1328+
assertTrue(definitions.containsKey("greeting-message"));
1329+
1330+
String greetingMessageRef = ((Schema) definitions.get("GreetingResponse")
1331+
.getProperties().get("GreetingMessage")).get$ref();
1332+
1333+
assertEquals(greetingMessageRef,"#/components/schemas/GreetingMessage");
1334+
assertEquals(definitions.get("GreetingMessage").get$ref(),"#/components/schemas/greeting-message");
1335+
1336+
String description = ((Schema)definitions.get("greeting-message")
1337+
.getProperties().get("Text")).getDescription();
1338+
assertEquals(description,"Text message");
1339+
}
1340+
1341+
@Test
1342+
public void testLoadExternalNestedDefinitionsWithReferenceOnDifferentFolderLevels() throws Exception {
1343+
OpenAPIV3Parser parser = new OpenAPIV3Parser();
1344+
final OpenAPI openAPI = parser.read("src/test/resources/nested-references-4/main.yaml");
1345+
1346+
Map<String, Schema> definitions = openAPI.getComponents().getSchemas();
1347+
assertTrue(definitions.containsKey("GreetingResponse"));
1348+
assertTrue(definitions.containsKey("GreetingMessage"));
1349+
assertTrue(definitions.containsKey("greeting-message"));
1350+
1351+
String greetingMessageRef = ((Schema) definitions.get("GreetingResponse")
1352+
.getProperties().get("GreetingMessage")).get$ref();
1353+
1354+
assertEquals(greetingMessageRef,"#/components/schemas/GreetingMessage");
1355+
assertEquals(definitions.get("GreetingMessage").get$ref(),"#/components/schemas/greeting-message");
1356+
1357+
String description = ((Schema)definitions.get("greeting-message")
1358+
.getProperties().get("Text")).getDescription();
1359+
assertEquals(description,"Text message");
1360+
}
1361+
12991362
@Test
13001363
public void testPetstore() throws Exception {
13011364
OpenAPIV3Parser parser = new OpenAPIV3Parser();
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
openapi: "3.0.0"
3+
info:
4+
title: test
5+
version: '0.0.0'
6+
paths: {}
7+
components:
8+
schemas:
9+
GreetingResponse:
10+
$ref: "./schemas/greeting-response.yaml"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
type: object
2+
properties:
3+
Text:
4+
description: Text message
5+
type: string
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
type: object
2+
properties:
3+
GreetingMessage:
4+
$ref: ./shared-defs.yaml#/components/schemas/GreetingMessage
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
openapi: "3.0.0"
3+
info:
4+
title: shared test
5+
version: '0.0.0'
6+
paths: { }
7+
components:
8+
schemas:
9+
GreetingMessage:
10+
$ref: ./greeting-message.yaml
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
type: object
2+
properties:
3+
Text:
4+
description: Text message
5+
type: string
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
type: object
2+
properties:
3+
GreetingMessage:
4+
$ref: ./shared-defs.yaml#/components/schemas/GreetingMessage
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
openapi: "3.0.0"
3+
info:
4+
title: test
5+
version: '0.0.0'
6+
paths: {}
7+
components:
8+
schemas:
9+
GreetingResponse:
10+
$ref: "./greeting-response.yaml"
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
openapi: "3.0.0"
3+
info:
4+
title: shared test
5+
version: '0.0.0'
6+
paths: { }
7+
components:
8+
schemas:
9+
GreetingMessage:
10+
$ref: ./greeting-message.yaml

0 commit comments

Comments
 (0)