@@ -10,6 +10,7 @@ mod unit_tests {
1010 use serverless_workflow_core:: models:: task:: * ;
1111 use serverless_workflow_core:: models:: timeout:: * ;
1212 use std:: collections:: HashMap ;
13+ use serde_json:: json;
1314
1415 #[ test]
1516 fn build_workflow_should_work ( ) {
@@ -56,10 +57,50 @@ mod unit_tests {
5657 let raise_error_title = "error-title" ;
5758 let raise_error_detail = "error-detail" ;
5859 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" } ) ) ;
6086 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 ( ) ;
6192 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" ;
6296 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" ;
63104 let wait_task_name = "wait-task" ;
64105 let wait_duration = OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_days ( 3 ) ) ;
65106
@@ -77,57 +118,128 @@ mod unit_tests {
77118 a. basic ( )
78119 . with_username ( username)
79120 . 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)
82123 . with_arguments ( call_task_with. clone ( ) ) ;
83124 } )
84- . do_ ( do_task_name, |t | {
85- t . do_ ( )
125+ . do_ ( do_task_name, |task | {
126+ task . do_ ( )
86127 . do_ ( "fake-wait-task" , |st| {
87128 st. wait ( OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_seconds ( 25 ) ) ) ;
88129 } ) ;
89130 } )
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|{
95133 e. with_attributes ( emit_event_attributes. clone ( ) ) ;
96134 } ) ;
97135 } )
98- . do_ ( for_task_name, |t | {
99- t . for_ ( )
136+ . do_ ( for_task_name, |task | {
137+ task . for_ ( )
100138 . each ( for_each)
101139 . in_ ( for_each_in)
102140 . at ( for_each_at)
103141 . do_ ( "fake-wait-task" , |st| {
104142 st. wait ( OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_seconds ( 25 ) ) ) ;
105143 } ) ;
106144 } )
107- . do_ ( fork_task_name, |t | {
108- t . fork ( )
145+ . do_ ( fork_task_name, |task | {
146+ task . fork ( )
109147 . branch ( |b| {
110148 b. do_ ( "fake-wait-task" , |st| {
111149 st. wait ( OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_seconds ( 25 ) ) ) ;
112150 } ) ;
113151 } ) ;
114152 } )
115- . do_ ( listen_task_name, |t | {
116- t . listen ( )
153+ . do_ ( listen_task_name, |task | {
154+ task . listen ( )
117155 . to ( |e|{
118156 e. one ( )
119157 . with ( "key" , AnyValue :: String ( "value" . to_string ( ) ) ) ;
120158 } ) ;
121159 } )
122- . do_ ( raise_task_name, |t | {
123- t . raise ( )
160+ . do_ ( raise_task_name, |task | {
161+ task . raise ( )
124162 . error ( )
125163 . with_type ( raise_error_type)
126164 . with_status ( raise_error_status)
127165 . with_title ( raise_error_title)
128166 . with_detail ( raise_error_detail)
129167 . with_instance ( raise_error_instance) ;
130168 } )
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+ } )
131243 . build ( ) ;
132244
133245 //assert
@@ -262,6 +374,108 @@ mod unit_tests {
262374 raise_error_title,
263375 raise_error_detail,
264376 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) ;
265479 assert ! (
266480 workflow. do_
267481 . entries
0 commit comments