Skip to content

Commit

Permalink
Merge pull request #362 from ricardozanini/issue-232
Browse files Browse the repository at this point in the history
Fix #232 - Add Errors validation to skipMessages
  • Loading branch information
ricardozanini authored May 28, 2024
2 parents ee02617 + 4c57f63 commit 75edf41
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ public class WorkflowValidatorImpl implements WorkflowValidator {

private static final Logger logger = LoggerFactory.getLogger(WorkflowValidatorImpl.class);
private boolean schemaValidationEnabled = true;
private List<ValidationError> validationErrors = new ArrayList<>();
private JsonNode workflowSchema = WorkflowSchemaLoader.getWorkflowSchema();
private final List<ValidationError> validationErrors = new ArrayList<>();
private final JsonNode workflowSchema = WorkflowSchemaLoader.getWorkflowSchema();
private String source;
private Workflow workflow;

Expand Down Expand Up @@ -398,7 +398,8 @@ private boolean isMissingRetryDefinition(String retryName, List<RetryDefinition>
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)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -376,60 +380,83 @@ void testActionDefForEach() {
public void testValidateRetry() {
WorkflowValidator workflowValidator = new WorkflowValidatorImpl();
List<ValidationError> 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 <a href="https://github.com/serverlessworkflow/sdk-java/issues/232">WorkflowValidator
* validate Wrokflow.tojson(workflow) failed</a>
*/
@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());
}
}

0 comments on commit 75edf41

Please sign in to comment.