From 7004ffcd4a7615ab1b73fa1235221ff09d2e6bdc Mon Sep 17 00:00:00 2001 From: Tihomir Surdilovic Date: Sat, 4 Sep 2021 16:39:23 -0400 Subject: [PATCH] Add actions sleep Signed-off-by: Tihomir Surdilovic --- .../main/resources/schema/actions/action.json | 3 ++ .../main/resources/schema/sleep/sleep.json | 18 +++++++ .../api/test/MarkupToWorkflowTest.java | 43 +++++++++++++++++ .../test/resources/features/actionssleep.json | 47 +++++++++++++++++++ .../test/resources/features/actionssleep.yml | 28 +++++++++++ 5 files changed, 139 insertions(+) create mode 100644 api/src/main/resources/schema/sleep/sleep.json create mode 100644 api/src/test/resources/features/actionssleep.json create mode 100644 api/src/test/resources/features/actionssleep.yml diff --git a/api/src/main/resources/schema/actions/action.json b/api/src/main/resources/schema/actions/action.json index de6caded..b2accd1d 100644 --- a/api/src/main/resources/schema/actions/action.json +++ b/api/src/main/resources/schema/actions/action.json @@ -19,6 +19,9 @@ "description": "References a sub-workflow to invoke", "$ref": "../functions/subflowref.json" }, + "sleep": { + "$ref": "../sleep/sleep.json" + }, "actionDataFilter": { "$ref": "../filters/actiondatafilter.json" } diff --git a/api/src/main/resources/schema/sleep/sleep.json b/api/src/main/resources/schema/sleep/sleep.json new file mode 100644 index 00000000..94807a04 --- /dev/null +++ b/api/src/main/resources/schema/sleep/sleep.json @@ -0,0 +1,18 @@ +{ + "type": "object", + "javaType": "io.serverlessworkflow.api.sleep.Sleep", + "properties": { + "before": { + "type": "string", + "description": "Amount of time (ISO 8601 duration format) to sleep before function/subflow invocation. Does not apply if 'eventRef' is defined." + }, + "after": { + "type": "string", + "description": "Amount of time (ISO 8601 duration format) to sleep after function/subflow invocation. Does not apply if 'eventRef' is defined." + } + }, + "required": [ + "before", + "after" + ] +} \ No newline at end of file diff --git a/api/src/test/java/io/serverlessworkflow/api/test/MarkupToWorkflowTest.java b/api/src/test/java/io/serverlessworkflow/api/test/MarkupToWorkflowTest.java index 5a472097..066053ff 100644 --- a/api/src/test/java/io/serverlessworkflow/api/test/MarkupToWorkflowTest.java +++ b/api/src/test/java/io/serverlessworkflow/api/test/MarkupToWorkflowTest.java @@ -657,4 +657,47 @@ public void testAuthOAuth(String workflowLocation) { assertEquals("${ $SECRETS.clientid }", auth.getOauth().getClientId()); assertEquals("${ $SECRETS.clientsecret }", auth.getOauth().getClientSecret()); } + + @ParameterizedTest + @ValueSource(strings = {"/features/actionssleep.json", "/features/actionssleep.yml"}) + public void testActionsSleep(String workflowLocation) { + Workflow workflow = Workflow.fromSource(WorkflowTestUtils.readWorkflowFile(workflowLocation)); + + assertNotNull(workflow); + assertNotNull(workflow.getId()); + assertNotNull(workflow.getName()); + assertNotNull(workflow.getStates()); + + assertNotNull(workflow.getStates()); + assertEquals(1, workflow.getStates().size()); + + State state = workflow.getStates().get(0); + assertTrue(state instanceof OperationState); + + OperationState operationState = (OperationState) workflow.getStates().get(0); + assertNotNull(operationState.getActions()); + assertEquals(2, operationState.getActions().size()); + + Action action1 = operationState.getActions().get(0); + assertNotNull(action1); + assertNotNull(action1.getFunctionRef()); + assertNotNull(action1.getSleep()); + assertEquals("PT5S", action1.getSleep().getBefore()); + assertEquals("PT10S", action1.getSleep().getAfter()); + FunctionRef functionRef1 = action1.getFunctionRef(); + assertEquals("creditCheckFunction", functionRef1.getRefName()); + assertNull(functionRef1.getArguments()); + + Action action2 = operationState.getActions().get(1); + assertNotNull(action2); + assertNotNull(action2.getFunctionRef()); + assertNotNull(action2.getSleep()); + assertEquals("PT5S", action2.getSleep().getBefore()); + assertEquals("PT10S", action2.getSleep().getAfter()); + FunctionRef functionRef2 = action2.getFunctionRef(); + assertEquals("sendRejectionEmailFunction", functionRef2.getRefName()); + assertEquals(1, functionRef2.getArguments().size()); + assertEquals("${ .customer }", functionRef2.getArguments().get("applicant").asText()); + + } } diff --git a/api/src/test/resources/features/actionssleep.json b/api/src/test/resources/features/actionssleep.json new file mode 100644 index 00000000..3a20f914 --- /dev/null +++ b/api/src/test/resources/features/actionssleep.json @@ -0,0 +1,47 @@ +{ + "id": "functionrefs", + "version": "1.0", + "specVersion": "0.7", + "name": "Customer Credit Check Workflow", + "description": "Perform Customer Credit Check", + "start": "TestFunctionRef", + "functions": [ + { + "name": "creditCheckFunction", + "operation": "http://myapis.org/creditcheckapi.json#doCreditCheck" + }, + { + "name": "sendRejectionEmailFunction", + "operation": "http://myapis.org/creditcheckapi.json#rejectionEmail" + } + ], + "states": [ + { + "name": "TestFunctionRefs", + "type": "operation", + "actionMode": "sequential", + "actions": [ + { + "functionRef": "creditCheckFunction", + "sleep": { + "before": "PT5S", + "after": "PT10S" + } + }, + { + "functionRef": { + "refName": "sendRejectionEmailFunction", + "arguments": { + "applicant": "${ .customer }" + } + }, + "sleep": { + "before": "PT5S", + "after": "PT10S" + } + } + ], + "end": true + } + ] +} \ No newline at end of file diff --git a/api/src/test/resources/features/actionssleep.yml b/api/src/test/resources/features/actionssleep.yml new file mode 100644 index 00000000..ce1a4a40 --- /dev/null +++ b/api/src/test/resources/features/actionssleep.yml @@ -0,0 +1,28 @@ +id: functionrefs +version: '1.0' +specVersion: '0.7' +name: Customer Credit Check Workflow +description: Perform Customer Credit Check +start: TestFunctionRef +functions: + - name: creditCheckFunction + operation: http://myapis.org/creditcheckapi.json#doCreditCheck + - name: sendRejectionEmailFunction + operation: http://myapis.org/creditcheckapi.json#rejectionEmail +states: + - name: TestFunctionRefs + type: operation + actionMode: sequential + actions: + - functionRef: creditCheckFunction + sleep: + before: PT5S + after: PT10S + - functionRef: + refName: sendRejectionEmailFunction + arguments: + applicant: "${ .customer }" + sleep: + before: PT5S + after: PT10S + end: true