diff --git a/src/lib/definitions/callbackstate.ts b/src/lib/definitions/callbackstate.ts index 08e7ec39..e5028f54 100644 --- a/src/lib/definitions/callbackstate.ts +++ b/src/lib/definitions/callbackstate.ts @@ -47,7 +47,12 @@ export class Callbackstate { constructor(model: any) { this.sourceModel = Object.assign({}, model); - const defaultModel = { type: 'callback', usedForCompensation: false }; + const defaultModel = { + id: undefined, + name: undefined, + type: 'callback', + usedForCompensation: false, + }; Object.assign(this, defaultModel, model); overwriteAction(this); @@ -59,7 +64,6 @@ export class Callbackstate { overwriteEnd(this); overwriteMetadata(this); } - /** * Unique state id */ diff --git a/src/lib/definitions/databasedswitchstate.ts b/src/lib/definitions/databasedswitchstate.ts index ea6906e7..81bcadc0 100644 --- a/src/lib/definitions/databasedswitchstate.ts +++ b/src/lib/definitions/databasedswitchstate.ts @@ -40,7 +40,7 @@ export class Databasedswitchstate { constructor(model: any) { this.sourceModel = Object.assign({}, model); - const defaultModel = { type: 'switch', usedForCompensation: false }; + const defaultModel = { id: undefined, name: undefined, type: 'switch', usedForCompensation: false }; Object.assign(this, defaultModel, model); overwriteStateDataFilter(this); diff --git a/src/lib/definitions/eventbasedswitchstate.ts b/src/lib/definitions/eventbasedswitchstate.ts index 2f441ffb..ad4821c8 100644 --- a/src/lib/definitions/eventbasedswitchstate.ts +++ b/src/lib/definitions/eventbasedswitchstate.ts @@ -40,10 +40,7 @@ export class Eventbasedswitchstate { constructor(model: any) { this.sourceModel = Object.assign({}, model); - const defaultModel = { - type: 'switch', - usedForCompensation: false, - }; + const defaultModel = { id: undefined, name: undefined, type: 'switch', usedForCompensation: false }; Object.assign(this, defaultModel, model); overwriteStateDataFilter(this); @@ -53,7 +50,6 @@ export class Eventbasedswitchstate { overwriteDefaultCondition(this); overwriteMetadata(this); } - /** * Unique State id */ diff --git a/src/lib/definitions/eventstate.ts b/src/lib/definitions/eventstate.ts index 714e034c..2d5bab25 100644 --- a/src/lib/definitions/eventstate.ts +++ b/src/lib/definitions/eventstate.ts @@ -20,6 +20,7 @@ import { Onevents } from './onevents'; import { Statedatafilter } from './statedatafilter'; import { Transition } from './transition'; import { + cleanSourceModelProperty, normalizeEnd, normalizeExclusive, normalizeOnErrors, @@ -30,10 +31,9 @@ import { overwriteOnErrors, overwriteOnEvents, overwriteStateDataFilter, + overwriteTimeoutWithStateExecTimeout, overwriteTransition, setEndValueIfNoTransition, - overwriteTimeoutWithStateExecTimeout, - cleanSourceModelProperty, } from './utils'; import { ActionExecTimeout, EventTimeout } from './types'; import { StateExecTimeout } from './stateExecTimeout'; @@ -44,7 +44,12 @@ export class Eventstate /* This state is used to wait for events from event sour constructor(model: any) { this.sourceModel = Object.assign({}, model); - const defaultModel = { type: 'event', exclusive: true }; + const defaultModel = { + id: undefined, + name: undefined, + type: 'event', + exclusive: true, + }; Object.assign(this, defaultModel, model); overwriteOnEvents(this); diff --git a/src/lib/definitions/foreachstate.ts b/src/lib/definitions/foreachstate.ts index d467e1f5..69dd8253 100644 --- a/src/lib/definitions/foreachstate.ts +++ b/src/lib/definitions/foreachstate.ts @@ -20,8 +20,10 @@ import { Metadata } from './metadata'; import { Statedatafilter } from './statedatafilter'; import { Transition } from './transition'; import { + cleanSourceModelProperty, normalizeActions, normalizeEnd, + normalizeMode, normalizeOnErrors, normalizeTransition, normalizeUsedForCompensation, @@ -30,11 +32,9 @@ import { overwriteMetadata, overwriteOnErrors, overwriteStateDataFilter, + overwriteTimeoutWithStateExecTimeout, overwriteTransition, setEndValueIfNoTransition, - normalizeMode, - overwriteTimeoutWithStateExecTimeout, - cleanSourceModelProperty, } from './utils'; import { ActionExecTimeout } from './types'; import { StateExecTimeout } from './stateExecTimeout'; @@ -45,7 +45,13 @@ export class Foreachstate { constructor(model: any) { this.sourceModel = Object.assign({}, model); - const defaultModel = { type: 'foreach', usedForCompensation: false, mode: 'parallel' }; + const defaultModel = { + id: undefined, + name: undefined, + type: 'foreach', + usedForCompensation: false, + mode: 'parallel', + }; Object.assign(this, defaultModel, model); overwriteEnd(this); @@ -120,7 +126,6 @@ export class Foreachstate { * If true, this state is used to compensate another state. Default is false */ usedForCompensation?: boolean; - /** * Specifies how iterations are to be performed (sequentially or in parallel) */ diff --git a/src/lib/definitions/injectstate.ts b/src/lib/definitions/injectstate.ts index 9ea4c265..379908bb 100644 --- a/src/lib/definitions/injectstate.ts +++ b/src/lib/definitions/injectstate.ts @@ -39,7 +39,12 @@ export class Injectstate { constructor(model: any) { this.sourceModel = Object.assign({}, model); - const defaultModel = { type: 'inject', usedForCompensation: false }; + const defaultModel = { + id: undefined, + name: undefined, + type: 'inject', + usedForCompensation: false, + }; Object.assign(this, defaultModel, model); overwriteEnd(this); diff --git a/src/lib/definitions/operationstate.ts b/src/lib/definitions/operationstate.ts index 4d49369e..f8e9c79f 100644 --- a/src/lib/definitions/operationstate.ts +++ b/src/lib/definitions/operationstate.ts @@ -46,6 +46,8 @@ export class Operationstate { this.sourceModel = Object.assign({}, model); const defaultModel = { + id: undefined, + name: undefined, type: 'operation', actionMode: 'sequential', usedForCompensation: false, diff --git a/src/lib/definitions/parallelstate.ts b/src/lib/definitions/parallelstate.ts index 79eb9ce5..df2168e8 100644 --- a/src/lib/definitions/parallelstate.ts +++ b/src/lib/definitions/parallelstate.ts @@ -21,6 +21,7 @@ import { Metadata } from './metadata'; import { Statedatafilter } from './statedatafilter'; import { Transition } from './transition'; import { + cleanSourceModelProperty, normalizeBranches, normalizeCompletionType, normalizeEnd, @@ -32,10 +33,9 @@ import { overwriteMetadata, overwriteOnErrors, overwriteStateDataFilter, + overwriteTimeoutWithStateExecTimeout, overwriteTransition, setEndValueIfNoTransition, - overwriteTimeoutWithStateExecTimeout, - cleanSourceModelProperty, } from './utils'; import { BranchExecTimeout } from './types'; import { StateExecTimeout } from './stateExecTimeout'; @@ -47,6 +47,8 @@ export class Parallelstate { this.sourceModel = Object.assign({}, model); const defaultModel = { + id: undefined, + name: undefined, type: 'parallel', completionType: 'allOf', usedForCompensation: false, diff --git a/src/lib/definitions/sleepstate.ts b/src/lib/definitions/sleepstate.ts index a5be1c04..7052cab8 100644 --- a/src/lib/definitions/sleepstate.ts +++ b/src/lib/definitions/sleepstate.ts @@ -42,6 +42,8 @@ export class Sleepstate { this.sourceModel = Object.assign({}, model); const defaultModel = { + id: undefined, + name: undefined, type: 'sleep', usedForCompensation: false, }; diff --git a/src/lib/definitions/workflow.ts b/src/lib/definitions/workflow.ts index 6b040ea3..f5be143a 100644 --- a/src/lib/definitions/workflow.ts +++ b/src/lib/definitions/workflow.ts @@ -51,9 +51,20 @@ export class Workflow { this.sourceModel = Object.assign({}, model); const defaultModel = { + id: undefined, + name: undefined, + version: undefined, + description: undefined, + specVersion: undefined, + start: undefined, + states: undefined, + functions: undefined, + events: undefined, + retries: undefined, + timeouts: undefined, expressionLang: 'jq', keepActive: true, - } as Specification.Workflow; + }; Object.assign(this, defaultModel, model); diff --git a/tests/examples/applicantrequest.json b/tests/examples/applicantrequest.json index fbae252a..facb84b2 100644 --- a/tests/examples/applicantrequest.json +++ b/tests/examples/applicantrequest.json @@ -1,20 +1,14 @@ { "id": "applicantrequest", - "version": "1.0", - "specVersion": "0.8", "name": "Applicant Request Decision Workflow", + "version": "1.0", "description": "Determine if applicant request is valid", + "specVersion": "0.8", "start": "CheckApplication", - "functions": [ - { - "name": "sendRejectionEmailFunction", - "operation": "http://myapis.org/applicationapi.json#emailRejection" - } - ], "states":[ { - "type":"switch", "name":"CheckApplication", + "type":"switch", "dataConditions": [ { "condition": "${ .applicants | .age >= 18 }", @@ -30,8 +24,8 @@ } }, { - "type": "operation", "name": "StartApplication", + "type": "operation", "actions": [ { "subFlowRef": "startApplicationWorkflowId" @@ -40,9 +34,9 @@ "end": true }, { + "name":"RejectApplication", "type":"operation", "actionMode":"sequential", - "name":"RejectApplication", "actions":[ { "functionRef": { @@ -55,5 +49,11 @@ ], "end": true } + ], + "functions": [ + { + "name": "sendRejectionEmailFunction", + "operation": "http://myapis.org/applicationapi.json#emailRejection" + } ] } \ No newline at end of file diff --git a/tests/examples/booklending.json b/tests/examples/booklending.json index c32d3dad..89ea88d4 100644 --- a/tests/examples/booklending.json +++ b/tests/examples/booklending.json @@ -6,8 +6,8 @@ "start": "Book Lending Request", "states": [ { - "type": "event", "name": "Book Lending Request", + "type": "event", "onEvents": [ { "eventRefs": ["Book Lending Request Event"] @@ -16,8 +16,8 @@ "transition": "Get Book Status" }, { - "type": "operation", "name": "Get Book Status", + "type": "operation", "actions": [ { "functionRef": { @@ -31,8 +31,8 @@ "transition": "Book Status Decision" }, { - "type": "switch", "name": "Book Status Decision", + "type": "switch", "dataConditions": [ { "name": "Book is on loan", @@ -50,8 +50,8 @@ } }, { - "type": "operation", "name": "Report Status To Lender", + "type": "operation", "actions": [ { "functionRef": { @@ -66,8 +66,8 @@ "transition": "Wait for Lender response" }, { - "type": "switch", "name": "Wait for Lender response", + "type": "switch", "eventConditions": [ { "name": "Hold Book", @@ -85,8 +85,8 @@ } }, { - "type": "operation", "name": "Request Hold", + "type": "operation", "actions": [ { "functionRef": { @@ -101,14 +101,14 @@ "transition": "Sleep two weeks" }, { - "type": "sleep", "name": "Sleep two weeks", + "type": "sleep", "duration": "PT2W", "transition": "Get Book Status" }, { - "type": "operation", "name": "Check Out Book", + "type": "operation", "actions": [ { "functionRef": { diff --git a/tests/examples/carauctionbids.json b/tests/examples/carauctionbids.json index dfd76bbf..25880311 100644 --- a/tests/examples/carauctionbids.json +++ b/tests/examples/carauctionbids.json @@ -1,45 +1,49 @@ { "id": "handleCarAuctionBid", - "version": "1.0", - "specVersion": "0.8", "name": "Car Auction Bidding Workflow", + "version": "1.0", "description": "Store a single bid whole the car auction is active", + "specVersion": "0.8", "start": { "stateName": "StoreCarAuctionBid", "schedule": "R/PT2H" }, - "functions": [ - { - "name": "StoreBidFunction", - "operation": "http://myapis.org/carauctionapi.json#storeBid" - } - ], - "events": [ - { - "name": "CarBidEvent", - "type": "carBidMadeType", - "source": "carBidEventSource" - } - ], "states": [ { + "name": "StoreCarAuctionBid", "type": "event", "exclusive": true, - "name": "StoreCarAuctionBid", "onEvents": [ { - "eventRefs": ["CarBidEvent"], - "actions": [{ - "functionRef": { - "refName": "StoreBidFunction", - "arguments": { - "bid": "${ .bid }" + "eventRefs": [ + "CarBidEvent" + ], + "actions": [ + { + "functionRef": { + "refName": "StoreBidFunction", + "arguments": { + "bid": "${ .bid }" + } } } - }] + ] } ], "end": true } + ], + "functions": [ + { + "name": "StoreBidFunction", + "operation": "http://myapis.org/carauctionapi.json#storeBid" + } + ], + "events": [ + { + "name": "CarBidEvent", + "type": "carBidMadeType", + "source": "carBidEventSource" + } ] } \ No newline at end of file diff --git a/tests/examples/checkcarvitals.json b/tests/examples/checkcarvitals.json index 051ff46b..6aba4398 100644 --- a/tests/examples/checkcarvitals.json +++ b/tests/examples/checkcarvitals.json @@ -6,8 +6,8 @@ "start": "WhenCarIsOn", "states": [ { - "type": "event", "name": "WhenCarIsOn", + "type": "event", "onEvents": [ { "eventRefs": ["CarTurnedOnEvent"] @@ -16,8 +16,8 @@ "transition": "DoCarVitalChecks" }, { - "type": "operation", "name": "DoCarVitalChecks", + "type": "operation", "actions": [ { "subFlowRef": "vitalscheck", @@ -29,8 +29,8 @@ "transition": "CheckContinueVitalChecks" }, { - "type": "switch", "name": "CheckContinueVitalChecks", + "type": "switch", "eventConditions": [ { "name": "Car Turned Off Condition", diff --git a/tests/examples/jobmonitoring.json b/tests/examples/jobmonitoring.json index c4894164..7c77ffc0 100644 --- a/tests/examples/jobmonitoring.json +++ b/tests/examples/jobmonitoring.json @@ -1,33 +1,15 @@ { "id": "jobmonitoring", - "version": "1.0", - "specVersion": "0.8", "name": "Job Monitoring", + "version": "1.0", "description": "Monitor finished execution of a submitted job", + "specVersion": "0.8", "start": "SubmitJob", - "functions": [ - { - "name": "submitJob", - "operation": "http://myapis.org/monitorapi.json#doSubmit" - }, - { - "name": "checkJobStatus", - "operation": "http://myapis.org/monitorapi.json#checkStatus" - }, - { - "name": "reportJobSuceeded", - "operation": "http://myapis.org/monitorapi.json#reportSucceeded" - }, - { - "name": "reportJobFailed", - "operation": "http://myapis.org/monitorapi.json#reportFailure" - } - ], "states":[ { + "name":"SubmitJob", "type":"operation", "actionMode":"sequential", - "name":"SubmitJob", "actions":[ { "functionRef": { @@ -47,15 +29,15 @@ "transition": "WaitForCompletion" }, { - "type": "sleep", "name": "WaitForCompletion", + "type": "sleep", "duration": "PT5S", "transition": "GetJobStatus" }, { + "name":"GetJobStatus", "type":"operation", "actionMode":"sequential", - "name":"GetJobStatus", "actions":[ { "functionRef": { @@ -75,8 +57,8 @@ "transition": "DetermineCompletion" }, { - "type":"switch", "name":"DetermineCompletion", + "type":"switch", "dataConditions": [ { "condition": "${ .jobStatus == \"SUCCEEDED\" }", @@ -92,9 +74,9 @@ } }, { + "name":"JobSucceeded", "type":"operation", "actionMode":"sequential", - "name":"JobSucceeded", "actions":[ { "functionRef": { @@ -108,9 +90,9 @@ "end": true }, { + "name":"JobFailed", "type":"operation", "actionMode":"sequential", - "name":"JobFailed", "actions":[ { "functionRef": { @@ -123,5 +105,23 @@ ], "end": true } + ], + "functions": [ + { + "name": "submitJob", + "operation": "http://myapis.org/monitorapi.json#doSubmit" + }, + { + "name": "checkJobStatus", + "operation": "http://myapis.org/monitorapi.json#checkStatus" + }, + { + "name": "reportJobSuceeded", + "operation": "http://myapis.org/monitorapi.json#reportSucceeded" + }, + { + "name": "reportJobFailed", + "operation": "http://myapis.org/monitorapi.json#reportFailure" + } ] } \ No newline at end of file diff --git a/tests/examples/parallel.json b/tests/examples/parallel.json index 02280f34..e63bf848 100644 --- a/tests/examples/parallel.json +++ b/tests/examples/parallel.json @@ -1,15 +1,15 @@ { "id": "parallelexec", - "version": "1.0", - "specVersion": "0.8", "name": "Parallel Execution Workflow", + "version": "1.0", "description": "Executes two branches in parallel", + "specVersion": "0.8", "start": "ParallelExec", "states":[ { + "name": "ParallelExec", "type": "parallel", "completionType": "allOf", - "name": "ParallelExec", "branches": [ { "name": "ShortDelayBranch", diff --git a/tests/examples/provisionorder.json b/tests/examples/provisionorder.json index ba5a5cfd..fbb83e8a 100644 --- a/tests/examples/provisionorder.json +++ b/tests/examples/provisionorder.json @@ -1,32 +1,15 @@ { "id": "provisionorders", - "version": "1.0", - "specVersion": "0.8", "name": "Provision Orders", + "version": "1.0", "description": "Provision Orders and handle errors thrown", + "specVersion": "0.8", "start": "ProvisionOrder", - "functions": [ - { - "name": "provisionOrderFunction", - "operation": "http://myapis.org/provisioningapi.json#doProvision" - } - ], - "errors": [ - { - "name": "Missing order id" - }, - { - "name": "Missing order item" - }, - { - "name": "Missing order quantity" - } - ], "states":[ { + "name":"ProvisionOrder", "type":"operation", "actionMode":"sequential", - "name":"ProvisionOrder", "actions":[ { "functionRef": { @@ -57,8 +40,8 @@ ] }, { - "type": "operation", "name": "MissingId", + "type": "operation", "actions": [ { "subFlowRef": "handleMissingIdExceptionWorkflow" @@ -67,8 +50,8 @@ "end": true }, { - "type": "operation", "name": "MissingItem", + "type": "operation", "actions": [ { "subFlowRef": "handleMissingItemExceptionWorkflow" @@ -77,8 +60,8 @@ "end": true }, { - "type": "operation", "name": "MissingQuantity", + "type": "operation", "actions": [ { "subFlowRef": "handleMissingQuantityExceptionWorkflow" @@ -87,8 +70,8 @@ "end": true }, { - "type": "operation", "name": "ApplyOrder", + "type": "operation", "actions": [ { "subFlowRef": "applyOrderWorkflowId" @@ -96,5 +79,22 @@ ], "end": true } + ], + "functions": [ + { + "name": "provisionOrderFunction", + "operation": "http://myapis.org/provisioningapi.json#doProvision" + } + ], + "errors": [ + { + "name": "Missing order id" + }, + { + "name": "Missing order item" + }, + { + "name": "Missing order quantity" + } ] } \ No newline at end of file diff --git a/tests/examples/sendcloudevent.json b/tests/examples/sendcloudevent.json index 6b3fb5f7..253baf89 100644 --- a/tests/examples/sendcloudevent.json +++ b/tests/examples/sendcloudevent.json @@ -1,26 +1,13 @@ { "id": "sendcloudeventonprovision", + "name": "Send CloudEvent on provision completion", "version": "1.0", "specVersion": "0.8", - "name": "Send CloudEvent on provision completion", "start": "ProvisionOrdersState", - "events": [ - { - "kind": "produced", - "name": "provisioningCompleteEvent", - "type": "provisionCompleteType" - } - ], - "functions": [ - { - "name": "provisionOrderFunction", - "operation": "http://myapis.org/provisioning.json#doProvision" - } - ], "states": [ { - "type": "foreach", "name": "ProvisionOrdersState", + "type": "foreach", "inputCollection": "${ .orders }", "iterationParam": "singleorder", "outputCollection": "${ .provisionedOrders }", @@ -41,5 +28,18 @@ }] } } + ], + "functions": [ + { + "name": "provisionOrderFunction", + "operation": "http://myapis.org/provisioning.json#doProvision" + } + ], + "events": [ + { + "kind": "produced", + "name": "provisioningCompleteEvent", + "type": "provisionCompleteType" + } ] } \ No newline at end of file diff --git a/tests/examples/solvemathproblems.json b/tests/examples/solvemathproblems.json index f95f7e8c..876ffac4 100644 --- a/tests/examples/solvemathproblems.json +++ b/tests/examples/solvemathproblems.json @@ -1,20 +1,14 @@ { "id": "solvemathproblems", - "version": "1.0", - "specVersion": "0.8", "name": "Solve Math Problems Workflow", + "version": "1.0", "description": "Solve math problems", + "specVersion": "0.8", "start": "Solve", - "functions": [ - { - "name": "solveMathExpressionFunction", - "operation": "http://myapis.org/mapthapis.json#solveExpression" - } - ], "states":[ { - "type":"foreach", "name":"Solve", + "type":"foreach", "inputCollection": "${ .expressions }", "iterationParam": "singleexpression", "outputCollection": "${ .results }", @@ -33,5 +27,11 @@ }, "end": true } + ], + "functions": [ + { + "name": "solveMathExpressionFunction", + "operation": "http://myapis.org/mapthapis.json#solveExpression" + } ] } \ No newline at end of file diff --git a/tests/lib/builders/eventstate-builder.spec.ts b/tests/lib/builders/eventstate-builder.spec.ts index ec42ea90..f6d6bee7 100644 --- a/tests/lib/builders/eventstate-builder.spec.ts +++ b/tests/lib/builders/eventstate-builder.spec.ts @@ -30,8 +30,8 @@ describe('eventstateBuilder ', () => { const serializedObject = object.normalize(); expect(JSON.stringify(serializedObject)).toBe( JSON.stringify({ - type: 'event', name: 'Book Lending Request', + type: 'event', onEvents: [ { eventRefs: ['Book Lending Request Event'], diff --git a/tests/lib/builders/operationstate-builder.spec.ts b/tests/lib/builders/operationstate-builder.spec.ts index 9f340753..a7900026 100644 --- a/tests/lib/builders/operationstate-builder.spec.ts +++ b/tests/lib/builders/operationstate-builder.spec.ts @@ -28,8 +28,8 @@ describe('operationstateBuilder ', () => { const serializedObject = object.normalize(); expect(JSON.stringify(serializedObject)).toBe( JSON.stringify({ - type: 'operation', name: 'StartApplication', + type: 'operation', actions: [{ subFlowRef: 'startApplicationWorkflowId' }], end: true, }) diff --git a/tests/lib/definitions/workflow.spec.ts b/tests/lib/definitions/workflow.spec.ts index c5b02efb..59c67262 100644 --- a/tests/lib/definitions/workflow.spec.ts +++ b/tests/lib/definitions/workflow.spec.ts @@ -113,15 +113,15 @@ describe('workflow ', () => { expect(jsonWorkflow).toBe( '{' + '"id":"helloworld",' + - '"version":"1.0",' + - '"specVersion":"0.8",' + '"name":"Hello World Workflow",' + + '"version":"1.0",' + '"description":"Inject Hello World",' + + '"specVersion":"0.8",' + '"start":"Hello State",' + '"states":[' + '{' + - '"type":"inject",' + '"name":"Hello State",' + + '"type":"inject",' + '"data":{' + '"result":"Hello World!"' + '},' + @@ -154,14 +154,14 @@ describe('workflow ', () => { ); expect(yamlWorkflow).toBe( 'id: helloworld\n' + - "version: '1.0'\n" + - "specVersion: '0.8'\n" + 'name: Hello World Workflow\n' + + "version: '1.0'\n" + 'description: Inject Hello World\n' + + "specVersion: '0.8'\n" + 'start: Hello State\n' + 'states:\n' + - ' - type: inject\n' + - ' name: Hello State\n' + + ' - name: Hello State\n' + + ' type: inject\n' + ' data:\n' + ' result: Hello World!\n' + ' end: true\n'