@@ -10,6 +10,7 @@ mod unit_tests {
10
10
use serverless_workflow_core:: models:: task:: * ;
11
11
use serverless_workflow_core:: models:: timeout:: * ;
12
12
use std:: collections:: HashMap ;
13
+ use serde_json:: json;
13
14
14
15
#[ test]
15
16
fn build_workflow_should_work ( ) {
@@ -56,10 +57,50 @@ mod unit_tests {
56
57
let raise_error_title = "error-title" ;
57
58
let raise_error_detail = "error-detail" ;
58
59
let raise_error_instance = "error-instance" ;
59
- let run_task_name = "run-task-name" ;
60
+ let run_container_task_name = "run-container-task-name" ;
61
+ let container_image = "container-image-name" ;
62
+ let container_command = "container-command" ;
63
+ let container_ports: HashMap < u16 , u16 > = vec ! [
64
+ ( 8080 , 8081 ) ,
65
+ ( 8082 , 8083 ) ]
66
+ . into_iter ( )
67
+ . collect ( ) ;
68
+ let container_volumes: HashMap < String , String > = vec ! [
69
+ ( "volume-1" . to_string( ) , "/some/fake/path" . to_string( ) ) ]
70
+ . into_iter ( )
71
+ . collect ( ) ;
72
+ let container_environment: HashMap < String , String > = vec ! [
73
+ ( "env1-name" . to_string( ) , "env1-value" . to_string( ) ) ,
74
+ ( "env2-name" . to_string( ) , "env2-value" . to_string( ) ) ]
75
+ . into_iter ( )
76
+ . collect ( ) ;
77
+ let run_script_task_name = "run-script-task-name" ;
78
+ let script_code = "script-code" ;
79
+ let run_shell_task_name = "run-shell-task-name" ;
80
+ let shell_command_name = "run-shell-command" ;
81
+ let run_workflow_task_name = "run-workflow-task-name" ;
82
+ let workflow_namespace = "workflow-namespace" ;
83
+ let workflow_name = "workflow-name" ;
84
+ let workflow_version = "workflow-version" ;
85
+ let workflow_input = AnyValue :: Json ( json ! ( { "hello" : "world" } ) ) ;
60
86
let set_task_name = "set-task-name" ;
87
+ let set_task_variables : HashMap < String , AnyValue > = vec ! [
88
+ ( "var1-name" . to_string( ) , AnyValue :: String ( "var1-value" . to_string( ) ) ) ,
89
+ ( "var2-name" . to_string( ) , AnyValue :: UInt64 ( 69 ) ) ]
90
+ . into_iter ( )
91
+ . collect ( ) ;
61
92
let switch_task_name = "switch-task-name" ;
93
+ let switch_case_name = "switch-case-name" ;
94
+ let switch_case_when = "true" ;
95
+ let switch_case_then = "continue" ;
62
96
let try_task_name = "try-task-name" ;
97
+ let catch_when = "catch-when" ;
98
+ let catch_errors_attributes: HashMap < String , AnyValue > = vec ! [
99
+ ( "var1-name" . to_string( ) , AnyValue :: String ( "var1-value" . to_string( ) ) ) ,
100
+ ( "var2-name" . to_string( ) , AnyValue :: UInt64 ( 69 ) ) ]
101
+ . into_iter ( )
102
+ . collect ( ) ;
103
+ let retry_except_when = "retry-except-when" ;
63
104
let wait_task_name = "wait-task" ;
64
105
let wait_duration = OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_days ( 3 ) ) ;
65
106
@@ -77,57 +118,128 @@ mod unit_tests {
77
118
a. basic ( )
78
119
. with_username ( username)
79
120
. with_password ( password) ; } )
80
- . do_ ( call_task_name, |t | {
81
- t . call ( call_function_name)
121
+ . do_ ( call_task_name, |task | {
122
+ task . call ( call_function_name)
82
123
. with_arguments ( call_task_with. clone ( ) ) ;
83
124
} )
84
- . do_ ( do_task_name, |t | {
85
- t . do_ ( )
125
+ . do_ ( do_task_name, |task | {
126
+ task . do_ ( )
86
127
. do_ ( "fake-wait-task" , |st| {
87
128
st. wait ( OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_seconds ( 25 ) ) ) ;
88
129
} ) ;
89
130
} )
90
- . do_ ( wait_task_name, |t| {
91
- t. wait ( wait_duration. clone ( ) ) ;
92
- } )
93
- . do_ ( emit_task_name, |t| {
94
- t. emit ( |e|{
131
+ . do_ ( emit_task_name, |task| {
132
+ task. emit ( |e|{
95
133
e. with_attributes ( emit_event_attributes. clone ( ) ) ;
96
134
} ) ;
97
135
} )
98
- . do_ ( for_task_name, |t | {
99
- t . for_ ( )
136
+ . do_ ( for_task_name, |task | {
137
+ task . for_ ( )
100
138
. each ( for_each)
101
139
. in_ ( for_each_in)
102
140
. at ( for_each_at)
103
141
. do_ ( "fake-wait-task" , |st| {
104
142
st. wait ( OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_seconds ( 25 ) ) ) ;
105
143
} ) ;
106
144
} )
107
- . do_ ( fork_task_name, |t | {
108
- t . fork ( )
145
+ . do_ ( fork_task_name, |task | {
146
+ task . fork ( )
109
147
. branch ( |b| {
110
148
b. do_ ( "fake-wait-task" , |st| {
111
149
st. wait ( OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_seconds ( 25 ) ) ) ;
112
150
} ) ;
113
151
} ) ;
114
152
} )
115
- . do_ ( listen_task_name, |t | {
116
- t . listen ( )
153
+ . do_ ( listen_task_name, |task | {
154
+ task . listen ( )
117
155
. to ( |e|{
118
156
e. one ( )
119
157
. with ( "key" , AnyValue :: String ( "value" . to_string ( ) ) ) ;
120
158
} ) ;
121
159
} )
122
- . do_ ( raise_task_name, |t | {
123
- t . raise ( )
160
+ . do_ ( raise_task_name, |task | {
161
+ task . raise ( )
124
162
. error ( )
125
163
. with_type ( raise_error_type)
126
164
. with_status ( raise_error_status)
127
165
. with_title ( raise_error_title)
128
166
. with_detail ( raise_error_detail)
129
167
. with_instance ( raise_error_instance) ;
130
168
} )
169
+ . do_ ( run_container_task_name, |task|{
170
+ task. run ( )
171
+ . container ( )
172
+ . with_image ( container_image)
173
+ . with_command ( container_command)
174
+ . with_ports ( container_ports. clone ( ) )
175
+ . with_volumes ( container_volumes. clone ( ) )
176
+ . with_environment_variables ( container_environment. clone ( ) ) ;
177
+ } )
178
+ . do_ ( run_script_task_name, |task|{
179
+ task. run ( )
180
+ . script ( )
181
+ . with_code ( script_code) ;
182
+ } )
183
+ . do_ ( run_shell_task_name, |task|{
184
+ task. run ( )
185
+ . shell ( )
186
+ . with_command ( shell_command_name) ;
187
+ } )
188
+ . do_ ( run_workflow_task_name, |task|{
189
+ task. run ( )
190
+ . workflow ( )
191
+ . with_namespace ( workflow_namespace)
192
+ . with_name ( workflow_name)
193
+ . with_version ( workflow_version)
194
+ . with_input ( workflow_input. clone ( ) ) ;
195
+ } )
196
+ . do_ ( set_task_name, |task|{
197
+ task. set ( )
198
+ . variables ( set_task_variables. clone ( ) ) ;
199
+ } )
200
+ . do_ ( switch_task_name, |task|{
201
+ task. switch ( )
202
+ . case ( switch_case_name, |case|{
203
+ case. when ( switch_case_when)
204
+ . then ( switch_case_then) ;
205
+ } ) ;
206
+
207
+ } )
208
+ . do_ ( try_task_name, |task|{
209
+ task. try_ ( )
210
+ . do_ ( |tasks|{
211
+ tasks
212
+ . do_ ( "fake-wait-task" , |subtask|{
213
+ subtask. wait ( OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_seconds ( 5 ) ) ) ;
214
+ } ) ;
215
+ } )
216
+ . catch ( |catch| {
217
+ catch
218
+ . errors ( |errors|{
219
+ errors
220
+ . with_attributes ( catch_errors_attributes. clone ( ) ) ;
221
+ } )
222
+ . when ( catch_when)
223
+ . retry ( |retry|{
224
+ retry
225
+ . except_when ( retry_except_when)
226
+ . delay ( Duration :: from_seconds ( 1 ) )
227
+ . backoff ( |backoff|{
228
+ backoff
229
+ . linear ( )
230
+ . with_increment ( Duration :: from_milliseconds ( 500 ) ) ;
231
+ } )
232
+ . jitter ( |jitter|{
233
+ jitter
234
+ . from ( Duration :: from_seconds ( 1 ) )
235
+ . to ( Duration :: from_seconds ( 3 ) ) ;
236
+ } ) ;
237
+ } ) ;
238
+ } ) ;
239
+ } )
240
+ . do_ ( wait_task_name, |task| {
241
+ task. wait ( wait_duration. clone ( ) ) ;
242
+ } )
131
243
. build ( ) ;
132
244
133
245
//assert
@@ -262,6 +374,108 @@ mod unit_tests {
262
374
raise_error_title,
263
375
raise_error_detail,
264
376
raise_error_instance) ;
377
+ assert ! (
378
+ workflow
379
+ . do_
380
+ . entries
381
+ . iter( )
382
+ . any( |entry| entry. get( & run_container_task_name. to_string( ) ) . map_or( false , |task| {
383
+ if let TaskDefinition :: Run ( run_task) = task {
384
+ if let Some ( container) = & run_task. run. container {
385
+ container. image == container_image
386
+ && container. command == Some ( container_command. to_string( ) )
387
+ && container. ports == Some ( container_ports. clone( ) )
388
+ && container. volumes == Some ( container_volumes. clone( ) )
389
+ && container. environment == Some ( container_environment. clone( ) )
390
+ } else {
391
+ false
392
+ }
393
+ } else {
394
+ false
395
+ }
396
+ } ) ) ,
397
+ "Expected a task with key '{}' and a RunTaskDefinition with 'container.image'={}, 'container.command'={}, 'container.ports'={:?}, 'container.volumes'={:?}, and 'container.environment'={:?}" ,
398
+ run_container_task_name,
399
+ container_image,
400
+ container_command,
401
+ container_ports,
402
+ container_volumes,
403
+ container_environment) ;
404
+ assert ! (
405
+ workflow
406
+ . do_
407
+ . entries
408
+ . iter( )
409
+ . any( |entry| entry. get( & run_workflow_task_name. to_string( ) ) . map_or( false , |task| {
410
+ if let TaskDefinition :: Run ( run_task) = task {
411
+ if let Some ( subflow) = & run_task. run. workflow{
412
+ subflow. namespace == workflow_namespace. to_string( )
413
+ && subflow. name == workflow_name. to_string( )
414
+ && subflow. version == workflow_version. to_string( )
415
+ && subflow. input == Some ( workflow_input. clone( ) )
416
+ }
417
+ else{
418
+ false
419
+ }
420
+ } else {
421
+ false
422
+ }
423
+ } ) ) ,
424
+ "Expected a task with key '{}' and a RunTaskDefinition with 'workflow.namespace'={}, 'workflow.name'={}, 'workflow.version'={}, and 'workflow.input'={:?}" ,
425
+ run_container_task_name,
426
+ workflow_namespace,
427
+ workflow_name,
428
+ workflow_version,
429
+ workflow_input) ;
430
+ assert ! (
431
+ workflow
432
+ . do_
433
+ . entries
434
+ . iter( )
435
+ . any( |entry| entry. get( & set_task_name. to_string( ) ) . map_or( false , |task|{
436
+ if let TaskDefinition :: Set ( set_task) = task {
437
+ set_task. set == set_task_variables. clone( )
438
+ }
439
+ else{
440
+ false
441
+ }
442
+ } ) ) ,
443
+ "Expected a task with key '{}' and a SetTaskDefinition with specified variables" ,
444
+ set_task_name) ;
445
+ assert ! (
446
+ workflow
447
+ . do_
448
+ . entries
449
+ . iter( )
450
+ . any( |entry| entry. get( & switch_task_name. to_string( ) ) . map_or( false , |task|{
451
+ if let TaskDefinition :: Switch ( switch_task) = task{
452
+ switch_task
453
+ . switch
454
+ . entries
455
+ . iter( )
456
+ . any( |case| case. contains_key( switch_case_name) )
457
+ }
458
+ else{
459
+ false
460
+ }
461
+ } ) ) ,
462
+ "Expected a task with key '{}' and a SwitchTaskDefinition with a case named '{}'" ,
463
+ set_task_name,
464
+ switch_case_name) ;
465
+ assert ! (
466
+ workflow. do_
467
+ . entries
468
+ . iter( )
469
+ . any( |entry| entry. get( & try_task_name. to_string( ) ) . map_or( false , |task| {
470
+ if let TaskDefinition :: Try ( try_task) = task {
471
+ try_task. catch. when == Some ( catch_when. to_string( ) )
472
+ } else {
473
+ false
474
+ }
475
+ } ) ) ,
476
+ "Expected a task with key '{}' and a TryTaskDefinition with 'catch.when'={}" ,
477
+ try_task_name,
478
+ catch_when) ;
265
479
assert ! (
266
480
workflow. do_
267
481
. entries
0 commit comments