1
+ pub mod services;
2
+
3
+ #[ cfg( test) ]
4
+ mod unit_tests {
5
+
6
+ use serverless_workflow_core:: models:: any:: * ;
7
+ use serverless_workflow_core:: models:: duration:: * ;
8
+ use serverless_workflow_core:: models:: error:: OneOfErrorDefinitionOrReference ;
9
+ use crate :: services:: workflow:: WorkflowBuilder ;
10
+ use serverless_workflow_core:: models:: task:: * ;
11
+ use serverless_workflow_core:: models:: timeout:: * ;
12
+ use std:: collections:: HashMap ;
13
+
14
+ #[ test]
15
+ fn build_workflow_should_work ( ) {
16
+ //arrange
17
+ let dsl_version = "1.0.0" ;
18
+ let namespace = "namespace" ;
19
+ let name = "fake-name" ;
20
+ let version = "1.0.0" ;
21
+ let title = "fake-title" ;
22
+ let summary = "fake-summary" ;
23
+ let tags: HashMap < String , String > = vec ! [
24
+ ( "key1" . to_string( ) , "value1" . to_string( ) ) ,
25
+ ( "key2" . to_string( ) , "value2" . to_string( ) ) ]
26
+ . into_iter ( )
27
+ . collect ( ) ;
28
+ let mut timeout_duration = Duration :: default ( ) ;
29
+ timeout_duration. minutes = Some ( 69 ) ;
30
+ let basic_name = "fake-basic" ;
31
+ let username = "fake-username" ;
32
+ let password = "fake-password" ;
33
+ let call_task_name = "call-task" ;
34
+ let call_function_name = "fake-function" ;
35
+ let call_task_with: HashMap < String , AnyValue > = vec ! [
36
+ ( "key1" . to_string( ) , AnyValue :: String ( "value1" . to_string( ) ) ) ,
37
+ ( "key2" . to_string( ) , AnyValue :: String ( "value2" . to_string( ) ) ) ]
38
+ . into_iter ( )
39
+ . collect ( ) ;
40
+ let do_task_name = "do-task" ;
41
+ let emit_task_name = "emit-task" ;
42
+ let emit_event_attributes: HashMap < String , AnyValue > = vec ! [
43
+ ( "key1" . to_string( ) , AnyValue :: String ( "value1" . to_string( ) ) ) ,
44
+ ( "key2" . to_string( ) , AnyValue :: String ( "value2" . to_string( ) ) ) ]
45
+ . into_iter ( )
46
+ . collect ( ) ;
47
+ let for_task_name = "for-task" ;
48
+ let for_each = "item" ;
49
+ let for_each_in = "items" ;
50
+ let for_each_at = "index" ;
51
+ let fork_task_name = "fork-task" ;
52
+ let listen_task_name = "listen-task" ;
53
+ let raise_task_name = "raise-task-name" ;
54
+ let raise_error_type = "error-type" ;
55
+ let raise_error_status = AnyValue :: Int16 ( 400 ) ;
56
+ let raise_error_title = "error-title" ;
57
+ let raise_error_detail = "error-detail" ;
58
+ let raise_error_instance = "error-instance" ;
59
+ let run_task_name = "run-task-name" ;
60
+ let set_task_name = "set-task-name" ;
61
+ let switch_task_name = "switch-task-name" ;
62
+ let try_task_name = "try-task-name" ;
63
+ let wait_task_name = "wait-task" ;
64
+ let wait_duration = OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_days ( 3 ) ) ;
65
+
66
+ //act
67
+ let workflow = WorkflowBuilder :: new ( )
68
+ . use_dsl ( dsl_version)
69
+ . with_namespace ( namespace)
70
+ . with_name ( name)
71
+ . with_version ( version)
72
+ . with_title ( title)
73
+ . with_summary ( summary)
74
+ . with_tags ( tags. clone ( ) )
75
+ . with_timeout ( |t| { t. after ( timeout_duration. clone ( ) ) ; } )
76
+ . use_authentication ( basic_name, |a| {
77
+ a. basic ( )
78
+ . with_username ( username)
79
+ . with_password ( password) ; } )
80
+ . do_ ( call_task_name, |t| {
81
+ t. call ( call_function_name)
82
+ . with_arguments ( call_task_with. clone ( ) ) ;
83
+ } )
84
+ . do_ ( do_task_name, |t| {
85
+ t. do_ ( )
86
+ . do_ ( "fake-wait-task" , |st| {
87
+ st. wait ( OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_seconds ( 25 ) ) ) ;
88
+ } ) ;
89
+ } )
90
+ . do_ ( wait_task_name, |t| {
91
+ t. wait ( wait_duration. clone ( ) ) ;
92
+ } )
93
+ . do_ ( emit_task_name, |t| {
94
+ t. emit ( |e|{
95
+ e. with_attributes ( emit_event_attributes. clone ( ) ) ;
96
+ } ) ;
97
+ } )
98
+ . do_ ( for_task_name, |t| {
99
+ t. for_ ( )
100
+ . each ( for_each)
101
+ . in_ ( for_each_in)
102
+ . at ( for_each_at)
103
+ . do_ ( "fake-wait-task" , |st| {
104
+ st. wait ( OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_seconds ( 25 ) ) ) ;
105
+ } ) ;
106
+ } )
107
+ . do_ ( fork_task_name, |t| {
108
+ t. fork ( )
109
+ . branch ( |b| {
110
+ b. do_ ( "fake-wait-task" , |st| {
111
+ st. wait ( OneOfDurationOrIso8601Expression :: Duration ( Duration :: from_seconds ( 25 ) ) ) ;
112
+ } ) ;
113
+ } ) ;
114
+ } )
115
+ . do_ ( listen_task_name, |t| {
116
+ t. listen ( )
117
+ . to ( |e|{
118
+ e. one ( )
119
+ . with ( "key" , AnyValue :: String ( "value" . to_string ( ) ) ) ;
120
+ } ) ;
121
+ } )
122
+ . do_ ( raise_task_name, |t| {
123
+ t. raise ( )
124
+ . error ( )
125
+ . with_type ( raise_error_type)
126
+ . with_status ( raise_error_status)
127
+ . with_title ( raise_error_title)
128
+ . with_detail ( raise_error_detail)
129
+ . with_instance ( raise_error_instance) ;
130
+ } )
131
+ . build ( ) ;
132
+
133
+ //assert
134
+ assert_eq ! ( workflow. document. dsl, dsl_version) ;
135
+ assert_eq ! ( workflow. document. namespace, namespace) ;
136
+ assert_eq ! ( workflow. document. name, name) ;
137
+ assert_eq ! ( workflow. document. version, version) ;
138
+ assert_eq ! ( workflow. document. title, Some ( title. to_string( ) ) ) ;
139
+ assert_eq ! ( workflow. document. summary, Some ( summary. to_string( ) ) ) ;
140
+ assert_eq ! ( workflow. document. tags, Some ( tags) ) ;
141
+ assert_eq ! ( workflow. timeout
142
+ . as_ref( )
143
+ . and_then( |t| match t {
144
+ OneOfTimeoutDefinitionOrReference :: Timeout ( definition) => match & definition. after {
145
+ OneOfDurationOrIso8601Expression :: Duration ( duration) => Some ( duration) ,
146
+ OneOfDurationOrIso8601Expression :: Iso8601Expression ( _) => None ,
147
+ } ,
148
+ OneOfTimeoutDefinitionOrReference :: Reference ( _) => None } ) ,
149
+ Some ( & timeout_duration) ) ;
150
+ assert ! (
151
+ workflow. use_. as_ref( )
152
+ . and_then( |component_collection| component_collection. authentications. as_ref( ) )
153
+ . and_then( |authentications| authentications. get( basic_name) )
154
+ . map( |auth_policy| auth_policy. basic. is_some( ) )
155
+ . unwrap_or( false ) ,
156
+ "Expected authentications to contain an entry with the name '{}' and a non-null `basic` property." ,
157
+ basic_name) ;
158
+ assert ! (
159
+ workflow. do_
160
+ . entries
161
+ . iter( )
162
+ . any( |entry| entry. get( & call_task_name. to_string( ) ) . map_or( false , |task| {
163
+ if let TaskDefinition :: Call ( call_task) = task {
164
+ call_task. call == call_function_name && call_task. with == Some ( call_task_with. clone( ) )
165
+ } else {
166
+ false
167
+ }
168
+ } ) ) ,
169
+ "Expected a task with key '{}' and a CallTaskDefinition with 'call'={} and 'with'={:?}" ,
170
+ call_task_name,
171
+ call_function_name,
172
+ call_task_with) ;
173
+ assert ! (
174
+ workflow. do_
175
+ . entries
176
+ . iter( )
177
+ . any( |entry| entry. get( & do_task_name. to_string( ) ) . map_or( false , |task| {
178
+ if let TaskDefinition :: Do ( _do_task) = task {
179
+ true
180
+ } else {
181
+ false
182
+ }
183
+ } ) ) ,
184
+ "Expected a do task with key '{}'" ,
185
+ do_task_name) ;
186
+ assert ! (
187
+ workflow. do_
188
+ . entries
189
+ . iter( )
190
+ . any( |entry| entry. get( & emit_task_name. to_string( ) ) . map_or( false , |task| {
191
+ if let TaskDefinition :: Emit ( emit_task) = task {
192
+ emit_task. emit. event. with == emit_event_attributes. clone( )
193
+ } else {
194
+ false
195
+ }
196
+ } ) ) ,
197
+ "Expected a task with key '{}' and a EmitTaskDefinition with 'emit.event.with' matching supplied attributes" ,
198
+ emit_task_name) ;
199
+ assert ! (
200
+ workflow. do_
201
+ . entries
202
+ . iter( )
203
+ . any( |entry| entry. get( & for_task_name. to_string( ) ) . map_or( false , |task| {
204
+ if let TaskDefinition :: For ( for_task) = task {
205
+ for_task. for_. each == for_each && for_task. for_. in_ == for_each_in && for_task. for_. at == Some ( for_each_at. to_string( ) )
206
+ } else {
207
+ false
208
+ }
209
+ } ) ) ,
210
+ "Expected a task with key '{}' and a ForTaskDefinition with 'for.each'={}, 'for.in'={}' and 'for.at'={}'" ,
211
+ for_task_name,
212
+ for_each,
213
+ for_each_in,
214
+ for_each_at) ;
215
+ assert ! (
216
+ workflow. do_
217
+ . entries
218
+ . iter( )
219
+ . any( |entry| entry. get( & fork_task_name. to_string( ) ) . map_or( false , |task| {
220
+ if let TaskDefinition :: Fork ( _fork_task) = task {
221
+ true
222
+ } else {
223
+ false
224
+ }
225
+ } ) ) ,
226
+ "Expected a fork task with key '{}'" ,
227
+ fork_task_name, ) ;
228
+ assert ! (
229
+ workflow. do_
230
+ . entries
231
+ . iter( )
232
+ . any( |entry| entry. get( & listen_task_name. to_string( ) ) . map_or( false , |task| {
233
+ if let TaskDefinition :: Listen ( _listen_task) = task {
234
+ true
235
+ } else {
236
+ false
237
+ }
238
+ } ) ) ,
239
+ "Expected a listen task with key '{}'" ,
240
+ listen_task_name) ;
241
+ assert ! (
242
+ workflow. do_
243
+ . entries
244
+ . iter( )
245
+ . any( |entry| entry. get( & raise_task_name. to_string( ) ) . map_or( false , |task| {
246
+ if let TaskDefinition :: Raise ( raise_task) = task {
247
+ if let OneOfErrorDefinitionOrReference :: Error ( error) = & raise_task. raise. error {
248
+ error. type_ == raise_error_type
249
+ && error. title == raise_error_title
250
+ && error. detail == Some ( raise_error_detail. to_string( ) )
251
+ && error. instance == Some ( raise_error_instance. to_string( ) )
252
+ } else {
253
+ false
254
+ }
255
+ } else {
256
+ false
257
+ }
258
+ } ) ) ,
259
+ "Expected a task with key '{}' and a RaiseTaskDefinition with 'raise.error.type'={}, 'raise.error.title'={}, 'raise.error.detail'={} and 'raise.error.instance'={}" ,
260
+ raise_task_name,
261
+ raise_error_type,
262
+ raise_error_title,
263
+ raise_error_detail,
264
+ raise_error_instance) ;
265
+ assert ! (
266
+ workflow. do_
267
+ . entries
268
+ . iter( )
269
+ . any( |entry| entry. get( & wait_task_name. to_string( ) ) . map_or( false , |task| {
270
+ if let TaskDefinition :: Wait ( wait_task) = task {
271
+ wait_task. duration == wait_duration
272
+ } else {
273
+ false
274
+ }
275
+ } ) ) ,
276
+ "Expected a task with key '{}' and a WaitTaskDefinition with 'duration'={}" ,
277
+ wait_task_name,
278
+ wait_duration) ;
279
+ }
280
+
281
+ }
0 commit comments