From 4c57f630163499d740596f1a38e4aff8644ed89b Mon Sep 17 00:00:00 2001 From: Ricardo Zanini Date: Tue, 28 May 2024 13:20:42 -0300 Subject: [PATCH] Fix #232 - Add Errors validation to skipMessages Signed-off-by: Ricardo Zanini --- .../validation/WorkflowValidatorImpl.java | 7 +- .../test/WorkflowValidationTest.java | 127 +++++++++++------- 2 files changed, 81 insertions(+), 53 deletions(-) diff --git a/validation/src/main/java/io/serverlessworkflow/validation/WorkflowValidatorImpl.java b/validation/src/main/java/io/serverlessworkflow/validation/WorkflowValidatorImpl.java index 972593f4..25a9c08c 100644 --- a/validation/src/main/java/io/serverlessworkflow/validation/WorkflowValidatorImpl.java +++ b/validation/src/main/java/io/serverlessworkflow/validation/WorkflowValidatorImpl.java @@ -44,8 +44,8 @@ public class WorkflowValidatorImpl implements WorkflowValidator { private static final Logger logger = LoggerFactory.getLogger(WorkflowValidatorImpl.class); private boolean schemaValidationEnabled = true; - private List validationErrors = new ArrayList<>(); - private JsonNode workflowSchema = WorkflowSchemaLoader.getWorkflowSchema(); + private final List validationErrors = new ArrayList<>(); + private final JsonNode workflowSchema = WorkflowSchemaLoader.getWorkflowSchema(); private String source; private Workflow workflow; @@ -398,7 +398,8 @@ private boolean isMissingRetryDefinition(String retryName, List Set.of( "$.start: string found, object expected", "$.functions: array found, object expected", - "$.retries: array found, object expected"); + "$.retries: array found, object expected", + "$.errors: array found, object expected"); private void addValidationError(String message, String type) { if (skipMessages.contains(message)) { diff --git a/validation/src/test/java/io/serverlessworkflow/validation/test/WorkflowValidationTest.java b/validation/src/test/java/io/serverlessworkflow/validation/test/WorkflowValidationTest.java index 81d21330..237cb573 100644 --- a/validation/src/test/java/io/serverlessworkflow/validation/test/WorkflowValidationTest.java +++ b/validation/src/test/java/io/serverlessworkflow/validation/test/WorkflowValidationTest.java @@ -18,9 +18,11 @@ import static io.serverlessworkflow.api.states.DefaultState.Type.OPERATION; import static io.serverlessworkflow.api.states.DefaultState.Type.SLEEP; +import com.fasterxml.jackson.databind.ObjectMapper; import io.serverlessworkflow.api.Workflow; import io.serverlessworkflow.api.actions.Action; import io.serverlessworkflow.api.end.End; +import io.serverlessworkflow.api.error.ErrorDefinition; import io.serverlessworkflow.api.events.EventDefinition; import io.serverlessworkflow.api.events.EventRef; import io.serverlessworkflow.api.functions.FunctionDefinition; @@ -30,9 +32,11 @@ import io.serverlessworkflow.api.retry.RetryDefinition; import io.serverlessworkflow.api.start.Start; import io.serverlessworkflow.api.states.ForEachState; +import io.serverlessworkflow.api.states.InjectState; import io.serverlessworkflow.api.states.OperationState; import io.serverlessworkflow.api.states.SleepState; import io.serverlessworkflow.api.validation.ValidationError; +import io.serverlessworkflow.api.workflow.Errors; import io.serverlessworkflow.api.workflow.Events; import io.serverlessworkflow.api.workflow.Functions; import io.serverlessworkflow.api.workflow.Retries; @@ -376,60 +380,83 @@ void testActionDefForEach() { public void testValidateRetry() { WorkflowValidator workflowValidator = new WorkflowValidatorImpl(); List validationErrors = - workflowValidator - .setSource( - "{\n" - + " \"id\": \"workflow_1\",\n" - + " \"name\": \"workflow_1\",\n" - + " \"description\": \"workflow_1\",\n" - + " \"version\": \"1.0\",\n" - + " \"specVersion\": \"0.8\",\n" - + " \"start\": \"Task1\",\n" - + " \"functions\": [\n" - + " {\n" - + " \"name\": \"increment\",\n" - + " \"type\": \"custom\",\n" - + " \"operation\": \"worker\"\n" - + " }\n" - + " ],\n" - + " \"retries\": [\n" - + " {\n" - + " \"maxAttempts\": 3\n" - + " },\n" - + " {\n" - + " \"name\": \"testRetry\" \n" - + " }\n" - + " ],\n" - + " \"states\": [\n" - + " {\n" - + " \"name\": \"Task1\",\n" - + " \"type\": \"operation\",\n" - + " \"actionMode\": \"sequential\",\n" - + " \"actions\": [\n" - + " {\n" - + " \"functionRef\": {\n" - + " \"refName\": \"increment\",\n" - + " \"arguments\": {\n" - + " \"input\": \"some text\"\n" - + " }\n" - + " },\n" - + " \"retryRef\": \"const\",\n" - + " \"actionDataFilter\": {\n" - + " \"toStateData\": \"${ .result }\"\n" - + " }\n" - + " }\n" - + " ],\n" - + " \"end\": true\n" - + " }\n" - + " ]\n" - + "}") - .validate(); + workflowValidator + .setSource( + "{\n" + + " \"id\": \"workflow_1\",\n" + + " \"name\": \"workflow_1\",\n" + + " \"description\": \"workflow_1\",\n" + + " \"version\": \"1.0\",\n" + + " \"specVersion\": \"0.8\",\n" + + " \"start\": \"Task1\",\n" + + " \"functions\": [\n" + + " {\n" + + " \"name\": \"increment\",\n" + + " \"type\": \"custom\",\n" + + " \"operation\": \"worker\"\n" + + " }\n" + + " ],\n" + + " \"retries\": [\n" + + " {\n" + + " \"maxAttempts\": 3\n" + + " },\n" + + " {\n" + + " \"name\": \"testRetry\" \n" + + " }\n" + + " ],\n" + + " \"states\": [\n" + + " {\n" + + " \"name\": \"Task1\",\n" + + " \"type\": \"operation\",\n" + + " \"actionMode\": \"sequential\",\n" + + " \"actions\": [\n" + + " {\n" + + " \"functionRef\": {\n" + + " \"refName\": \"increment\",\n" + + " \"arguments\": {\n" + + " \"input\": \"some text\"\n" + + " }\n" + + " },\n" + + " \"retryRef\": \"const\",\n" + + " \"actionDataFilter\": {\n" + + " \"toStateData\": \"${ .result }\"\n" + + " }\n" + + " }\n" + + " ],\n" + + " \"end\": true\n" + + " }\n" + + " ]\n" + + "}") + .validate(); Assertions.assertNotNull(validationErrors); Assertions.assertEquals(2, validationErrors.size()); Assertions.assertEquals("Retry name should not be empty", validationErrors.get(0).getMessage()); Assertions.assertEquals( - "Operation State action 'null' retryRef does not reference an existing workflow retry definition", - validationErrors.get(1).getMessage()); + "Operation State action 'null' retryRef does not reference an existing workflow retry definition", + validationErrors.get(1).getMessage()); + } + + /** + * @see WorkflowValidator + * validate Wrokflow.tojson(workflow) failed + */ + @Test + void testErrorsArrayParsing() { + final Workflow workflow = + new Workflow() + .withId("test-workflow") + .withName("test-workflow") + .withVersion("1.0") + .withStart(new Start().withStateName("testingErrors")) + .withErrors(new Errors(Arrays.asList(new ErrorDefinition()))) + .withStates( + Arrays.asList( + new InjectState() + .withName("testingErrors") + .withData(new ObjectMapper().createObjectNode().put("name", "Skywalker")) + .withEnd(new End()))); + Assertions.assertTrue( + new WorkflowValidatorImpl().setSource(Workflow.toJson(workflow)).isValid()); } }