Skip to content

Commit 75edf41

Browse files
Merge pull request #362 from ricardozanini/issue-232
Fix #232 - Add Errors validation to skipMessages
2 parents ee02617 + 4c57f63 commit 75edf41

File tree

2 files changed

+81
-53
lines changed

2 files changed

+81
-53
lines changed

validation/src/main/java/io/serverlessworkflow/validation/WorkflowValidatorImpl.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ public class WorkflowValidatorImpl implements WorkflowValidator {
4444

4545
private static final Logger logger = LoggerFactory.getLogger(WorkflowValidatorImpl.class);
4646
private boolean schemaValidationEnabled = true;
47-
private List<ValidationError> validationErrors = new ArrayList<>();
48-
private JsonNode workflowSchema = WorkflowSchemaLoader.getWorkflowSchema();
47+
private final List<ValidationError> validationErrors = new ArrayList<>();
48+
private final JsonNode workflowSchema = WorkflowSchemaLoader.getWorkflowSchema();
4949
private String source;
5050
private Workflow workflow;
5151

@@ -398,7 +398,8 @@ private boolean isMissingRetryDefinition(String retryName, List<RetryDefinition>
398398
Set.of(
399399
"$.start: string found, object expected",
400400
"$.functions: array found, object expected",
401-
"$.retries: array found, object expected");
401+
"$.retries: array found, object expected",
402+
"$.errors: array found, object expected");
402403

403404
private void addValidationError(String message, String type) {
404405
if (skipMessages.contains(message)) {

validation/src/test/java/io/serverlessworkflow/validation/test/WorkflowValidationTest.java

+77-50
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818
import static io.serverlessworkflow.api.states.DefaultState.Type.OPERATION;
1919
import static io.serverlessworkflow.api.states.DefaultState.Type.SLEEP;
2020

21+
import com.fasterxml.jackson.databind.ObjectMapper;
2122
import io.serverlessworkflow.api.Workflow;
2223
import io.serverlessworkflow.api.actions.Action;
2324
import io.serverlessworkflow.api.end.End;
25+
import io.serverlessworkflow.api.error.ErrorDefinition;
2426
import io.serverlessworkflow.api.events.EventDefinition;
2527
import io.serverlessworkflow.api.events.EventRef;
2628
import io.serverlessworkflow.api.functions.FunctionDefinition;
@@ -30,9 +32,11 @@
3032
import io.serverlessworkflow.api.retry.RetryDefinition;
3133
import io.serverlessworkflow.api.start.Start;
3234
import io.serverlessworkflow.api.states.ForEachState;
35+
import io.serverlessworkflow.api.states.InjectState;
3336
import io.serverlessworkflow.api.states.OperationState;
3437
import io.serverlessworkflow.api.states.SleepState;
3538
import io.serverlessworkflow.api.validation.ValidationError;
39+
import io.serverlessworkflow.api.workflow.Errors;
3640
import io.serverlessworkflow.api.workflow.Events;
3741
import io.serverlessworkflow.api.workflow.Functions;
3842
import io.serverlessworkflow.api.workflow.Retries;
@@ -376,60 +380,83 @@ void testActionDefForEach() {
376380
public void testValidateRetry() {
377381
WorkflowValidator workflowValidator = new WorkflowValidatorImpl();
378382
List<ValidationError> validationErrors =
379-
workflowValidator
380-
.setSource(
381-
"{\n"
382-
+ " \"id\": \"workflow_1\",\n"
383-
+ " \"name\": \"workflow_1\",\n"
384-
+ " \"description\": \"workflow_1\",\n"
385-
+ " \"version\": \"1.0\",\n"
386-
+ " \"specVersion\": \"0.8\",\n"
387-
+ " \"start\": \"Task1\",\n"
388-
+ " \"functions\": [\n"
389-
+ " {\n"
390-
+ " \"name\": \"increment\",\n"
391-
+ " \"type\": \"custom\",\n"
392-
+ " \"operation\": \"worker\"\n"
393-
+ " }\n"
394-
+ " ],\n"
395-
+ " \"retries\": [\n"
396-
+ " {\n"
397-
+ " \"maxAttempts\": 3\n"
398-
+ " },\n"
399-
+ " {\n"
400-
+ " \"name\": \"testRetry\" \n"
401-
+ " }\n"
402-
+ " ],\n"
403-
+ " \"states\": [\n"
404-
+ " {\n"
405-
+ " \"name\": \"Task1\",\n"
406-
+ " \"type\": \"operation\",\n"
407-
+ " \"actionMode\": \"sequential\",\n"
408-
+ " \"actions\": [\n"
409-
+ " {\n"
410-
+ " \"functionRef\": {\n"
411-
+ " \"refName\": \"increment\",\n"
412-
+ " \"arguments\": {\n"
413-
+ " \"input\": \"some text\"\n"
414-
+ " }\n"
415-
+ " },\n"
416-
+ " \"retryRef\": \"const\",\n"
417-
+ " \"actionDataFilter\": {\n"
418-
+ " \"toStateData\": \"${ .result }\"\n"
419-
+ " }\n"
420-
+ " }\n"
421-
+ " ],\n"
422-
+ " \"end\": true\n"
423-
+ " }\n"
424-
+ " ]\n"
425-
+ "}")
426-
.validate();
383+
workflowValidator
384+
.setSource(
385+
"{\n"
386+
+ " \"id\": \"workflow_1\",\n"
387+
+ " \"name\": \"workflow_1\",\n"
388+
+ " \"description\": \"workflow_1\",\n"
389+
+ " \"version\": \"1.0\",\n"
390+
+ " \"specVersion\": \"0.8\",\n"
391+
+ " \"start\": \"Task1\",\n"
392+
+ " \"functions\": [\n"
393+
+ " {\n"
394+
+ " \"name\": \"increment\",\n"
395+
+ " \"type\": \"custom\",\n"
396+
+ " \"operation\": \"worker\"\n"
397+
+ " }\n"
398+
+ " ],\n"
399+
+ " \"retries\": [\n"
400+
+ " {\n"
401+
+ " \"maxAttempts\": 3\n"
402+
+ " },\n"
403+
+ " {\n"
404+
+ " \"name\": \"testRetry\" \n"
405+
+ " }\n"
406+
+ " ],\n"
407+
+ " \"states\": [\n"
408+
+ " {\n"
409+
+ " \"name\": \"Task1\",\n"
410+
+ " \"type\": \"operation\",\n"
411+
+ " \"actionMode\": \"sequential\",\n"
412+
+ " \"actions\": [\n"
413+
+ " {\n"
414+
+ " \"functionRef\": {\n"
415+
+ " \"refName\": \"increment\",\n"
416+
+ " \"arguments\": {\n"
417+
+ " \"input\": \"some text\"\n"
418+
+ " }\n"
419+
+ " },\n"
420+
+ " \"retryRef\": \"const\",\n"
421+
+ " \"actionDataFilter\": {\n"
422+
+ " \"toStateData\": \"${ .result }\"\n"
423+
+ " }\n"
424+
+ " }\n"
425+
+ " ],\n"
426+
+ " \"end\": true\n"
427+
+ " }\n"
428+
+ " ]\n"
429+
+ "}")
430+
.validate();
427431

428432
Assertions.assertNotNull(validationErrors);
429433
Assertions.assertEquals(2, validationErrors.size());
430434
Assertions.assertEquals("Retry name should not be empty", validationErrors.get(0).getMessage());
431435
Assertions.assertEquals(
432-
"Operation State action 'null' retryRef does not reference an existing workflow retry definition",
433-
validationErrors.get(1).getMessage());
436+
"Operation State action 'null' retryRef does not reference an existing workflow retry definition",
437+
validationErrors.get(1).getMessage());
438+
}
439+
440+
/**
441+
* @see <a href="https://github.com/serverlessworkflow/sdk-java/issues/232">WorkflowValidator
442+
* validate Wrokflow.tojson(workflow) failed</a>
443+
*/
444+
@Test
445+
void testErrorsArrayParsing() {
446+
final Workflow workflow =
447+
new Workflow()
448+
.withId("test-workflow")
449+
.withName("test-workflow")
450+
.withVersion("1.0")
451+
.withStart(new Start().withStateName("testingErrors"))
452+
.withErrors(new Errors(Arrays.asList(new ErrorDefinition())))
453+
.withStates(
454+
Arrays.asList(
455+
new InjectState()
456+
.withName("testingErrors")
457+
.withData(new ObjectMapper().createObjectNode().put("name", "Skywalker"))
458+
.withEnd(new End())));
459+
Assertions.assertTrue(
460+
new WorkflowValidatorImpl().setSource(Workflow.toJson(workflow)).isValid());
434461
}
435462
}

0 commit comments

Comments
 (0)