Skip to content

Commit 0d10a67

Browse files
authored
Merge pull request #2127 from swagger-api/enhancement/parser-resolveResponses-flag
Enhancement/parser resolve responses flag
2 parents 0ab2e8a + 6bed0f6 commit 0d10a67

File tree

7 files changed

+316
-7
lines changed

7 files changed

+316
-7
lines changed

modules/swagger-parser-core/src/main/java/io/swagger/v3/parser/core/models/ParseOptions.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class ParseOptions {
1515
private boolean validateInternalRefs = true;
1616
private boolean legacyYamlDeserialization = false;
1717
private boolean resolveRequestBody = false;
18-
18+
private boolean resolveResponses = false;
1919
private boolean oaiAuthor;
2020
private boolean inferSchemaType = true;
2121
private boolean safelyResolveURL;
@@ -161,4 +161,12 @@ public List<String> getRemoteRefBlockList() {
161161
public void setRemoteRefBlockList(List<String> remoteRefBlockList) {
162162
this.remoteRefBlockList = remoteRefBlockList;
163163
}
164+
165+
public boolean isResolveResponses() {
166+
return resolveResponses;
167+
}
168+
169+
public void setResolveResponses(boolean resolveResponses) {
170+
this.resolveResponses = resolveResponses;
171+
}
164172
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ public void processOperation(Operation operation) {
7070
for (String responseCode : responses.keySet()) {
7171
ApiResponse response = responses.get(responseCode);
7272
if(response != null) {
73-
//This part allows parser to put response inline without the resolveFully option set to true
74-
if (response.get$ref() != null) {
73+
//This part allows parser to put response inline when resolveResponses = true
74+
if (response.get$ref() != null && cache != null && cache.getParseOptions() != null && cache.getParseOptions().isResolveResponses()) {
7575

7676
responseProcessor.processResponse(response);
7777

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

+1
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ public void testIssue411() throws Exception {
272272
OpenAPIV3Parser parser = new OpenAPIV3Parser();
273273
ParseOptions options = new ParseOptions();
274274
options.setResolve(true);
275+
options.setResolveResponses(true);
275276
SwaggerParseResult result = parser.readLocation("http://remote1/resources/swagger.yaml", auths, options);
276277

277278
OpenAPI swagger = result.getOpenAPI();

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

+6-3
Original file line numberDiff line numberDiff line change
@@ -766,8 +766,9 @@ public void testIssue1706() {
766766

767767
ParseOptions options = new ParseOptions();
768768
options.setResolve(true);
769-
// Added this parseOption to make requestBody inline in the operation resolve processing flow.
769+
// Added this parseOption to make requestBody/response inline in the operation resolve processing flow.
770770
options.setResolveRequestBody(true);
771+
options.setResolveResponses(true);
771772

772773
OpenAPI openAPI = new OpenAPIV3Parser().readLocation(path, null, options).getOpenAPI();
773774

@@ -776,7 +777,7 @@ public void testIssue1706() {
776777
assertTrue(openAPI.getPaths().get("/resource").getPost().getRequestBody().getContent() != null);
777778
assertTrue(openAPI.getPaths().get("/resource").getPost().getRequestBody().getContent().get("application/json").getSchema() instanceof ObjectSchema);
778779

779-
// Responses are already by default made inline in case referenced.
780+
// Responses should be inline
780781
assertTrue(openAPI.getPaths().get("/resource").getPost().getResponses().get("200").get$ref() == null);
781782
assertTrue(openAPI.getPaths().get("/resource").getPost().getResponses().get("200").getContent() != null);
782783
assertTrue(openAPI.getPaths().get("/resource").getPost().getResponses().get("200").getContent().get("application/json").getSchema() instanceof ObjectSchema);
@@ -1285,6 +1286,8 @@ public void testSharedSwaggerParametersTest() {
12851286
@Test(description = "resolve top-level responses")
12861287
public void testSharedResponses() {
12871288
final OpenAPI swagger = new OpenAPI();
1289+
ParseOptions parseOptions = new ParseOptions();
1290+
parseOptions.setResolveResponses(true);
12881291
List<Parameter> parameters = new ArrayList<>();
12891292
parameters.add(0,new Parameter().$ref("username"));
12901293
swagger.path("/fun", new PathItem()
@@ -1294,7 +1297,7 @@ public void testSharedResponses() {
12941297

12951298
swagger.components(new Components().addResponses("foo", new ApiResponse().description("ok!")));
12961299

1297-
final OpenAPI resolved = new OpenAPIResolver(swagger, null).resolve();
1300+
final OpenAPI resolved = new OpenAPIResolver(swagger, null, null, null, parseOptions).resolve();
12981301
ApiResponse response = resolved.getPaths().get("/fun").getGet().getResponses().get("200");
12991302
assertTrue(response.getDescription().equals("ok!"));
13001303
assertTrue(response instanceof ApiResponse);

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

+55-1
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ public void testIssue1780() {
170170
public void testParametersAndResponsesAsNumbers() throws Exception {
171171
ParseOptions options = new ParseOptions();
172172
options.setResolve(true);
173+
options.setResolveResponses(true);
173174
SwaggerParseResult result = new OpenAPIV3Parser().readLocation("src/test/resources/parametersAsNumbers/swagger.yaml", null, options);
174175

175176
Assert.assertNotNull(result);
@@ -1214,6 +1215,7 @@ public void testIssue1131() {
12141215
public void testIssue834() {
12151216
ParseOptions options = new ParseOptions();
12161217
options.setResolve(true);
1218+
options.setResolveResponses(true);
12171219
SwaggerParseResult result = new OpenAPIV3Parser().readLocation("issue-834/index.yaml", null, options);
12181220
assertNotNull(result.getOpenAPI());
12191221

@@ -1247,8 +1249,8 @@ public void testIssue811_RefSchema_ToRefSchema() {
12471249
public void testIssue811() {
12481250
ParseOptions options = new ParseOptions();
12491251
options.setResolve(true);
1252+
options.setResolveResponses(true);
12501253
final OpenAPI openAPI = new OpenAPIV3Parser().readLocation("oapi-reference-test/index.yaml", null, options).getOpenAPI();
1251-
12521254
Assert.assertNotNull(openAPI);
12531255
Assert.assertEquals(openAPI.getPaths().get("/").getGet().getResponses().get("200").getContent().get("application/json").getSchema().get$ref(),"#/components/schemas/schema-with-reference");
12541256
}
@@ -1940,7 +1942,9 @@ public void testRelativePath() {
19401942
OpenAPIV3Parser parser = new OpenAPIV3Parser();
19411943
ParseOptions options = new ParseOptions();
19421944
options.setResolve(true);
1945+
options.setResolveResponses(true);
19431946
SwaggerParseResult readResult = parser.readLocation("src/test/resources/relative-issue/api.yaml", null, options);
1947+
Yaml.prettyPrint(readResult.getOpenAPI());
19441948
Assert.assertEquals(readResult.getOpenAPI().getPaths().get("/scans").getGet().getResponses().get("500").getContent().get("application/json").getSchema().get$ref(), "#/components/schemas/ErrorMessage");
19451949
}
19461950

@@ -1949,6 +1953,7 @@ public void testRelativePath2() {
19491953
OpenAPIV3Parser parser = new OpenAPIV3Parser();
19501954
ParseOptions options = new ParseOptions();
19511955
options.setResolve(true);
1956+
options.setResolveResponses(true);
19521957
SwaggerParseResult readResult = parser.readLocation("src/test/resources/codegen-remote-responses/openapi.yaml", null, options);
19531958
Assert.assertEquals(readResult.getOpenAPI().getPaths().get("/pet/findByTags").getGet().getResponses().get("default").getContent().get("application/json").getSchema().get$ref(), "#/components/schemas/ErrorModel");
19541959
}
@@ -1957,6 +1962,7 @@ private OpenAPI doRelativeFileTest(String location) {
19571962
OpenAPIV3Parser parser = new OpenAPIV3Parser();
19581963
ParseOptions options = new ParseOptions();
19591964
options.setResolve(true);
1965+
options.setResolveResponses(true);
19601966
SwaggerParseResult readResult = parser.readLocation(location, null, options);
19611967

19621968
if (readResult.getMessages().size() > 0) {
@@ -2769,6 +2775,7 @@ public void testIssue1177() {
27692775
ParseOptions options = new ParseOptions();
27702776
options.setResolve(true);
27712777
options.setResolveFully(true);
2778+
options.setResolveResponses(true);
27722779

27732780
OpenAPI openAPI = new OpenAPIV3Parser().readLocation(path, auths, options).getOpenAPI();
27742781

@@ -3298,4 +3305,51 @@ public void testIssue2081() {
32983305
assertEquals(openAPI.getComponents().getSchemas().get("PetCreate").getRequired().size(), 1);
32993306
assertEquals(openAPI.getComponents().getSchemas().get("PetCreate").getProperties().size(), 2);
33003307
}
3308+
3309+
@Test(description = "responses should be inline")
3310+
public void testFullyResolveResponses() {
3311+
ParseOptions options = new ParseOptions();
3312+
options.setResolve(true);
3313+
options.setResolveResponses(true);
3314+
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
3315+
SwaggerParseResult parseResult = openApiParser.readLocation("resolve-responses-test.yaml", null, options);
3316+
OpenAPI openAPI = parseResult.getOpenAPI();
3317+
assertNull(openAPI.getPaths().get("/users").getGet().getResponses().get("400").get$ref());
3318+
assertNull(openAPI.getPaths().get("/users").getPost().getResponses().get("400").get$ref());
3319+
assertNull(openAPI.getPaths().get("/users").getPost().getResponses().get("422").get$ref());
3320+
assertNull(openAPI.getPaths().get("/users/{userId}").getGet().getResponses().get("404").get$ref());
3321+
assertNull(openAPI.getPaths().get("/users/{userId}").getPut().getResponses().get("400").get$ref());
3322+
assertNull(openAPI.getPaths().get("/users/{userId}").getPut().getResponses().get("404").get$ref());
3323+
assertNull(openAPI.getPaths().get("/users/{userId}").getDelete().getResponses().get("400").get$ref());
3324+
assertNull(openAPI.getPaths().get("/users/{userId}").getDelete().getResponses().get("404").get$ref());
3325+
}
3326+
3327+
@Test(description = "responses should not be inline")
3328+
public void testResolveResponsesRef() {
3329+
ParseOptions options = new ParseOptions();
3330+
options.setResolve(true);
3331+
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
3332+
SwaggerParseResult parseResult = openApiParser.readLocation("resolve-responses-test.yaml", null, options);
3333+
OpenAPI openAPI = parseResult.getOpenAPI();
3334+
assertEquals(openAPI.getPaths().get("/users").getGet().getResponses().get("400").get$ref(), "#/components/responses/BadRequest");
3335+
assertEquals(openAPI.getPaths().get("/users").getPost().getResponses().get("400").get$ref(), "#/components/responses/BadRequest");
3336+
assertEquals(openAPI.getPaths().get("/users").getPost().getResponses().get("422").get$ref(), "#/components/responses/UnprocessableEntity");
3337+
assertEquals(openAPI.getPaths().get("/users/{userId}").getGet().getResponses().get("404").get$ref(), "#/components/responses/NotFound");
3338+
assertEquals(openAPI.getPaths().get("/users/{userId}").getPut().getResponses().get("400").get$ref(), "#/components/responses/BadRequest");
3339+
assertEquals(openAPI.getPaths().get("/users/{userId}").getPut().getResponses().get("404").get$ref(), "#/components/responses/NotFound");
3340+
assertEquals(openAPI.getPaths().get("/users/{userId}").getDelete().getResponses().get("400").get$ref(), "#/components/responses/BadRequest");
3341+
assertEquals(openAPI.getPaths().get("/users/{userId}").getDelete().getResponses().get("404").get$ref(), "#/components/responses/NotFound");
3342+
}
3343+
3344+
@Test
3345+
public void testResolveOASWithFlatten(){
3346+
ParseOptions options = new ParseOptions();
3347+
options.setResolve(true);
3348+
options.setFlatten(true);
3349+
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
3350+
SwaggerParseResult parseResult = openApiParser.readLocation("resolve-flatten-SH-configuration-test.yaml", null, options);
3351+
OpenAPI openAPI = parseResult.getOpenAPI();
3352+
assertNull(openAPI.getComponents().getSchemas().get("#/components/schemas/inline_response_404"));
3353+
assertNull(openAPI.getComponents().getSchemas().get("#/components/schemas/inline_response_200"));
3354+
}
33013355
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
openapi: 3.0.1
2+
info:
3+
title: Simple API
4+
version: 1.0.0
5+
6+
paths:
7+
/users:
8+
get:
9+
summary: Get list of users
10+
operationId: getUsers
11+
responses:
12+
'200':
13+
$ref: '#/components/responses/SuccessResponse'
14+
'404':
15+
$ref: '#/components/responses/NotFoundResponse'
16+
17+
components:
18+
responses:
19+
SuccessResponse:
20+
description: A successful response
21+
content:
22+
application/json:
23+
schema:
24+
type: array
25+
items:
26+
type: object
27+
properties:
28+
id:
29+
type: integer
30+
name:
31+
type: string
32+
email:
33+
type: string
34+
NotFoundResponse:
35+
description: Not Found response
36+
content:
37+
application/json:
38+
schema:
39+
type: object
40+
properties:
41+
message:
42+
type: string
43+
example: "Resource not found"

0 commit comments

Comments
 (0)