Skip to content

Commit f9d8633

Browse files
authored
Merge pull request #1733 from frankbille/master
Paths defined as $ref wont add parameters to each operation
2 parents 4c74190 + 608fc7b commit f9d8633

File tree

5 files changed

+154
-6
lines changed

5 files changed

+154
-6
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ public void processPaths() {
6060
for (String pathStr : pathMap.keySet()) {
6161
PathItem pathItem = pathMap.get(pathStr);
6262

63-
addParametersToEachOperation(pathItem);
64-
6563
if (pathItem.get$ref() != null) {
6664

6765
PathItem resolvedPath = processReferencePath(pathItem);
@@ -76,6 +74,8 @@ public void processPaths() {
7674
}
7775
}
7876

77+
addParametersToEachOperation(pathItem);
78+
7979
//at this point we can process this path
8080
final List<Parameter> processedPathParameters = parameterProcessor.processParameters(pathItem.getParameters());
8181
pathItem.setParameters(processedPathParameters);
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package io.swagger.v3.parser.processors;
2+
3+
import io.swagger.v3.oas.models.OpenAPI;
4+
import io.swagger.v3.oas.models.Operation;
5+
import io.swagger.v3.oas.models.PathItem;
6+
import io.swagger.v3.oas.models.PathItem.HttpMethod;
7+
import io.swagger.v3.parser.OpenAPIV3Parser;
8+
import org.testng.annotations.Test;
9+
10+
import java.util.Map.Entry;
11+
12+
import static java.lang.String.format;
13+
import static org.testng.Assert.assertFalse;
14+
15+
public class PathsProcessorTest {
16+
17+
@Test
18+
public void testProcessPaths_parameters_internalTopLevelDefinition() {
19+
OpenAPI openAPI = new OpenAPIV3Parser().read("src/test/resources/issue-1733/api.yaml");
20+
21+
assertOperationsHasParameters(openAPI, "/internal/test/{id}/toplevelparam");
22+
}
23+
24+
@Test
25+
public void testProcessPaths_parameters_internalOperationLevelDefinition() {
26+
OpenAPI openAPI = new OpenAPIV3Parser().read("src/test/resources/issue-1733/api.yaml");
27+
28+
assertOperationsHasParameters(openAPI, "/internal/test/{id}/operationlevelparam");
29+
}
30+
31+
@Test
32+
public void testProcessPaths_parameters_refTopLevelDefinition() {
33+
OpenAPI openAPI = new OpenAPIV3Parser().read("src/test/resources/issue-1733/api.yaml");
34+
35+
assertOperationsHasParameters(openAPI, "/ref/test/{id}/toplevelparam");
36+
}
37+
38+
@Test
39+
public void testProcessPaths_parameters_refOperationLevelDefinition() {
40+
OpenAPI openAPI = new OpenAPIV3Parser().read("src/test/resources/issue-1733/api.yaml");
41+
42+
assertOperationsHasParameters(openAPI, "/ref/test/{id}/operationlevelparam");
43+
}
44+
45+
private void assertOperationsHasParameters(OpenAPI openAPI, String path) {
46+
PathItem pathItem = openAPI.getPaths().get(path);
47+
48+
assertFalse(pathItem.readOperations().isEmpty(), format("Expected operations for %s but found none", path));
49+
50+
for (Entry<HttpMethod, Operation> operationEntry : pathItem.readOperationsMap().entrySet()) {
51+
HttpMethod httpMethod = operationEntry.getKey();
52+
Operation operation = operationEntry.getValue();
53+
54+
assertFalse(operation.getParameters() == null || operation.getParameters().isEmpty(), format("Expected parameters on %s operation for %s but found none", httpMethod, path));
55+
}
56+
}
57+
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2205,13 +2205,14 @@ private OpenAPI doRelativeFileTest(String location) {
22052205
assertEquals(path.getClass(), PathItem.class); //we successfully converted the RefPath to a Path
22062206

22072207
final List<Parameter> parameters = path.getParameters();
2208-
assertParamDetails(parameters, 0, QueryParameter.class, "param1", "query");
2209-
assertParamDetails(parameters, 1, HeaderParameter.class, "param2", "header");
2208+
assertNull(parameters);
22102209

22112210
final Operation operation = path.getGet();
22122211
final List<Parameter> operationParams = operation.getParameters();
2213-
assertParamDetails(operationParams, 0, PathParameter.class, "param3", "path");
2214-
assertParamDetails(operationParams, 1, HeaderParameter.class, "param4", "header");
2212+
assertParamDetails(operationParams, 0, QueryParameter.class, "param1", "query");
2213+
assertParamDetails(operationParams, 1, HeaderParameter.class, "param2", "header");
2214+
assertParamDetails(operationParams, 2, PathParameter.class, "param3", "path");
2215+
assertParamDetails(operationParams, 3, HeaderParameter.class, "param4", "header");
22152216

22162217
final Map<String, ApiResponse> responsesMap = operation.getResponses();
22172218

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
openapi: 3.0.0
2+
3+
info:
4+
title: Sample API
5+
version: 1.0.2
6+
7+
paths:
8+
/internal/test/{id}/toplevelparam:
9+
parameters:
10+
- in: path
11+
name: id
12+
required: true
13+
schema:
14+
type: string
15+
enum:
16+
- one
17+
- two
18+
get:
19+
summary: Test of path params defined on top level
20+
responses:
21+
200:
22+
description: OK
23+
tags:
24+
- Tests
25+
26+
/internal/test/{id}/operationlevelparam:
27+
get:
28+
summary: Test of path params defined on top level
29+
parameters:
30+
- in: path
31+
name: id
32+
required: true
33+
schema:
34+
type: string
35+
enum:
36+
- one
37+
- two
38+
responses:
39+
200:
40+
description: OK
41+
tags:
42+
- Tests
43+
44+
/ref/test/{id}/toplevelparam:
45+
$ref: "./test-endpoints.yaml#/paths/~1ref~1test~1{id}~1toplevelparam"
46+
47+
/ref/test/{id}/operationlevelparam:
48+
$ref: "./test-endpoints.yaml#/paths/~1ref~1test~1{id}~1operationlevelparam"
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
openapi: 3.0.0
2+
3+
info:
4+
title: Sample API
5+
version: 1.0.2
6+
7+
paths:
8+
/ref/test/{id}/toplevelparam:
9+
parameters:
10+
- in: path
11+
name: id
12+
required: true
13+
schema:
14+
type: string
15+
enum:
16+
- one
17+
- two
18+
get:
19+
summary: Test of path params defined on top level
20+
responses:
21+
200:
22+
description: OK
23+
tags:
24+
- Tests
25+
26+
/ref/test/{id}/operationlevelparam:
27+
get:
28+
summary: Test of path params defined on top level
29+
parameters:
30+
- in: path
31+
name: id
32+
required: true
33+
schema:
34+
type: string
35+
enum:
36+
- one
37+
- two
38+
responses:
39+
200:
40+
description: OK
41+
tags:
42+
- Tests

0 commit comments

Comments
 (0)