Skip to content

Commit 8086474

Browse files
committed
Add validation of Reusable Parameter Object
1 parent 0978e3c commit 8086474

File tree

2 files changed

+82
-34
lines changed

2 files changed

+82
-34
lines changed

src/main/java/com/apiflows/parser/OpenAPIWorkflowValidator.java

Lines changed: 60 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,14 @@ List<String> validateStep(Step step, String workflowId ) {
171171

172172
if(step.getParameters() != null) {
173173
for(Parameter parameter : step.getParameters()) {
174-
errors.addAll(validateParameter(parameter, workflowId, null));
175-
176-
if(step.getWorkflowId() != null) {
177-
// when the step in context specifies a workflowId the parameter IN must be defined
178-
if(parameter.getIn() == null) {
174+
if(isRuntimeExpression(parameter.getName())) {
175+
errors.addAll(validateReusableParameter(parameter, workflowId, null));
176+
} else {
177+
errors.addAll(validateParameter(parameter, workflowId, null));
178+
}
179+
if(step.getWorkflowId() == null) {
180+
// when the step in context is NOT a workflowId the parameter IN must be defined
181+
if(!isRuntimeExpression(parameter.getName()) && parameter.getIn() == null) {
179182
errors.add("'Workflow[" + workflowId + "]' parameter IN must be defined");
180183
}
181184
}
@@ -208,12 +211,12 @@ List<String> validateStep(Step step, String workflowId ) {
208211
return errors;
209212
}
210213

211-
List<String> validateParameter(Parameter parameter, String workflowId, String componentName ) {
214+
List<String> validateParameter(Parameter parameter, String workflowId, String componentName) {
212215
List<String> SUPPORTED_VALUES = Arrays.asList("path", "query", "header", "cookie", "body", "workflow");
213216

214217
String source;
215218

216-
if(workflowId != null) {
219+
if (workflowId != null) {
217220
source = "Workflow[" + workflowId + "]";
218221
} else {
219222
source = "Component[" + componentName + "]";
@@ -222,37 +225,57 @@ List<String> validateParameter(Parameter parameter, String workflowId, String co
222225

223226
List<String> errors = new ArrayList<>();
224227

225-
if(parameter.get$ref() != null) {
226-
// Reference object
227-
// check is URI
228-
} else {
229-
// Parameter object
230-
String name = parameter.getName();
228+
// Parameter object
229+
String name = parameter.getName();
231230

232-
if(name == null) {
233-
errors.add(source + " parameter has no name");
234-
}
235-
if(parameter.getIn() != null) {
236-
if(!SUPPORTED_VALUES.contains(parameter.getIn())) {
237-
if(name != null) {
238-
errors.add(source + "parameter " + name + " type (" + parameter.getIn() + ") is invalid");
239-
} else {
240-
errors.add(source + " parameter type (" + parameter.getIn() + ") is invalid");
241-
}
242-
}
243-
}
244-
if(parameter.getValue() == null) {
245-
if(name != null) {
246-
errors.add(source + " parameter " + name + " has no value");
231+
if (name == null) {
232+
errors.add(source + " parameter has no name");
233+
}
234+
if (parameter.getIn() != null) {
235+
if (!SUPPORTED_VALUES.contains(parameter.getIn())) {
236+
if (name != null) {
237+
errors.add(source + "parameter " + name + " in (" + parameter.getIn() + ") is invalid");
247238
} else {
248-
errors.add(source + " parameter has no value");
239+
errors.add(source + " parameter in (" + parameter.getIn() + ") is invalid");
249240
}
250241
}
251-
if(parameter.getTarget() != null) {
252-
if(!isValidJsonPointer(parameter.getTarget())) {
253-
errors.add(source + " parameter " + name + " target is not a valid Json Pointer");
254-
}
242+
}
243+
if (parameter.getValue() == null) {
244+
if (name != null) {
245+
errors.add(source + " parameter " + name + " has no value");
246+
} else {
247+
errors.add(source + " parameter has no value");
248+
}
249+
}
250+
if(isRuntimeExpression(parameter.getName())) {
251+
errors.add(source + " parameter " + name + " is a Reusable Parameter object");
252+
}
253+
254+
return errors;
255+
}
256+
257+
List<String> validateReusableParameter(Parameter parameter, String workflowId, String componentName ) {
258+
259+
String source;
260+
261+
if(workflowId != null) {
262+
source = "Workflow[" + workflowId + "]";
263+
} else {
264+
source = "Component[" + componentName + "]";
265+
}
266+
267+
List<String> errors = new ArrayList<>();
268+
269+
if(isRuntimeExpression(parameter.getName())) {
270+
// Reusable Parameter object
271+
String name = parameter.getName();
272+
273+
if(parameter.getIn() != null) {
274+
errors.add(source + "parameter " + name + " in (" + parameter.getIn() + ") should not be provided for a Reusable Parameter Object");
255275
}
276+
277+
// TODO: check reusable parameter exists in Components
278+
256279
}
257280
return errors;
258281
}
@@ -561,4 +584,8 @@ public boolean isValidJsonPointer(String jsonPointerString) {
561584
return ret;
562585
}
563586

587+
boolean isRuntimeExpression(String name) {
588+
return name.startsWith("$");
589+
}
590+
564591
}

src/test/java/com/apiflows/parser/OpenAPIWorkflowValidatorTest.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ void validateStepWithoutInAttribute() {
188188
Step step = new Step()
189189
.stepId("step-one")
190190
.description("First step in the workflow")
191-
.workflowId("workflow-id-2");
191+
.operationId("op-id-2");
192192
step.addParameter(new Parameter()
193193
.name("param")
194194
.value("value"));
@@ -198,6 +198,27 @@ void validateStepWithoutInAttribute() {
198198
assertEquals(1, validator.validateStep(step, worklowId).size());
199199
}
200200

201+
@Test
202+
void validateReusableParameter() {
203+
Parameter parameter = new Parameter()
204+
.name("$components.parameters.page")
205+
.value("1");
206+
String worklowId = "q1";
207+
208+
assertEquals(0, validator.validateReusableParameter(parameter, worklowId, null).size());
209+
}
210+
211+
@Test
212+
void validateReusableParameterWithInAttribute() {
213+
Parameter parameter = new Parameter()
214+
.name("$components.parameters.page")
215+
.value("1")
216+
.in("query");
217+
String worklowId = "q1";
218+
219+
// error: must not define IN attribute
220+
assertEquals(1, validator.validateReusableParameter(parameter, worklowId, null).size());
221+
}
201222

202223
@Test
203224
void validateParameter() {

0 commit comments

Comments
 (0)