Skip to content

Commit c8edf78

Browse files
committed
#14 introduced validation for operationId uniqueness across whole spec file
1 parent b11387e commit c8edf78

File tree

4 files changed

+71
-7
lines changed

4 files changed

+71
-7
lines changed

src/main/java/com/github/sylvainlaurent/maven/swaggervalidator/semantic/node/ObjectPropertyRequiredStore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
public class ObjectPropertyRequiredStore {
1010

11-
private static final Map<Object, List<String>> requiredObjectPropertiesMap = synchronizedMap(new IdentityHashMap<Object, List<String>>());
11+
private static final Map<Object, List<String>> requiredObjectPropertiesMap = synchronizedMap(new IdentityHashMap<>());
1212

1313
public static List<String> get(Object objectProperty) {
1414
return requiredObjectPropertiesMap.get(objectProperty);

src/main/java/com/github/sylvainlaurent/maven/swaggervalidator/semantic/validator/path/OperationValidator.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
import com.github.sylvainlaurent.maven.swaggervalidator.semantic.node.path.PathWrapper;
1111
import com.github.sylvainlaurent.maven.swaggervalidator.semantic.validator.error.DefinitionSemanticError;
1212
import com.github.sylvainlaurent.maven.swaggervalidator.semantic.validator.error.SemanticError;
13-
import com.github.sylvainlaurent.maven.swaggervalidator.util.Util;
1413

1514
import io.swagger.models.parameters.Parameter;
1615

16+
import static com.github.sylvainlaurent.maven.swaggervalidator.util.Util.findDuplicates;
17+
1718
public class OperationValidator extends PathValidatorTemplate {
1819

1920
private List<SemanticError> errors = new ArrayList<>();
@@ -41,15 +42,16 @@ public void validate(OperationWrapper operation) {
4142
}
4243

4344
@Override
44-
public void validate(PathWrapper path) {
45+
public void validate(List<PathWrapper> paths) {
4546
// save duplicates at this point to have pretty error messages added later
46-
collectDuplicateOperationIds(path);
47+
collectDuplicateOperationIds(paths);
4748
}
4849

49-
private void collectDuplicateOperationIds(PathWrapper path) {
50-
List<String> operationIds = path.getOperations().values().stream().map(OperationWrapper::getOperationId)
50+
private void collectDuplicateOperationIds(List<PathWrapper> paths) {
51+
List<String> operationIds = paths.stream().flatMap(path -> path.getOperations().values().stream()
52+
.map(OperationWrapper::getOperationId))
5153
.collect(Collectors.toList());
52-
duplicateOperationIds = Util.findDuplicates(operationIds);
54+
duplicateOperationIds = findDuplicates(operationIds);
5355
}
5456

5557
@Override

src/test/java/com/github/sylvainlaurent/maven/swaggervalidator/semantic/validator/path/OperationValidatorTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,24 @@ public void semantic_error_when_path_parameter_not_defined_in_parameters_section
4040
assertEquals("paths./category/{id}/product/{productId}.get", error2.getPath());
4141
}
4242

43+
@Test
44+
public void semantic_error_when_operation_id_is_duplicated_across_different_paths() {
45+
SwaggerDeserializationResult swaggerResult = readDoc(
46+
RESOURCE_FOLDER + "duplicate-operation-ids-different-paths.yml");
47+
List<SemanticError> errors = new SemanticValidationService(swaggerResult.getSwagger()).validate();
48+
logger.info(errors.toString());
49+
50+
assertFalse(errors.isEmpty());
51+
assertEquals(2, errors.size());
52+
DefinitionSemanticError error1 = (DefinitionSemanticError) errors.get(0);
53+
assertEquals("Operations must have unique operationIds. Duplicate: operation", error1.getMessage());
54+
assertEquals("paths./category/{id}/.get", error1.getPath());
55+
56+
DefinitionSemanticError error2 = (DefinitionSemanticError) errors.get(1);
57+
assertEquals("Operations must have unique operationIds. Duplicate: operation", error1.getMessage());
58+
assertEquals("paths./category/{id}/product/{productId}.get", error2.getPath());
59+
}
60+
4361
@Test
4462
public void semantic_error_when_more_than_one_body_parameter() {
4563
SwaggerDeserializationResult swaggerResult = readDoc(
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
swagger: '2.0'
2+
info:
3+
title: Test API
4+
description: Test API
5+
version: "1.0.0"
6+
host: none
7+
schemes:
8+
- https
9+
basePath: /v1
10+
produces:
11+
- application/json
12+
paths:
13+
/category/{id}/product/{productId}:
14+
parameters:
15+
- name: productId
16+
in: path
17+
required: true
18+
type: string
19+
- name: id
20+
in: path
21+
required: true
22+
type: string
23+
get:
24+
operationId: operation
25+
summary: test service
26+
responses:
27+
200:
28+
description: ok
29+
schema:
30+
type: string
31+
/category/{id}/:
32+
parameters:
33+
- name: id
34+
in: path
35+
required: true
36+
type: string
37+
get:
38+
operationId: operation
39+
summary: test service
40+
responses:
41+
200:
42+
description: ok
43+
schema:
44+
type: string

0 commit comments

Comments
 (0)