action_logic 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +72 -0
- data/README.md +6 -0
- data/action_logic.gemspec +24 -0
- data/lib/action_logic/action_context.rb +39 -0
- data/lib/action_logic/action_coordinator.rb +42 -0
- data/lib/action_logic/action_core.rb +45 -0
- data/lib/action_logic/action_task.rb +24 -0
- data/lib/action_logic/action_use_case.rb +28 -0
- data/lib/action_logic/action_validation.rb +111 -0
- data/lib/action_logic/errors.rb +6 -0
- data/lib/action_logic/version.rb +3 -0
- data/spec/action_logic/action_context_spec.rb +75 -0
- data/spec/action_logic/action_coordinator_spec.rb +162 -0
- data/spec/action_logic/action_task_spec.rb +234 -0
- data/spec/action_logic/active_use_case_spec.rb +199 -0
- data/spec/fixtures/constants.rb +46 -0
- data/spec/fixtures/coordinators.rb +564 -0
- data/spec/fixtures/custom_types.rb +5 -0
- data/spec/fixtures/tasks.rb +286 -0
- data/spec/fixtures/use_cases.rb +324 -0
- data/spec/spec_helper.rb +17 -0
- metadata +35 -2
@@ -0,0 +1,564 @@
|
|
1
|
+
require 'action_logic'
|
2
|
+
require 'fixtures/constants'
|
3
|
+
|
4
|
+
class TestCoordinator1
|
5
|
+
include ActionLogic::ActionCoordinator
|
6
|
+
|
7
|
+
def call
|
8
|
+
context.test_coordinator1 = true
|
9
|
+
end
|
10
|
+
|
11
|
+
def plan
|
12
|
+
{
|
13
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
14
|
+
|
15
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
16
|
+
|
17
|
+
TestUseCase3 => { :success => nil }
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class HaltedTestCoordinator1
|
23
|
+
include ActionLogic::ActionCoordinator
|
24
|
+
|
25
|
+
def call
|
26
|
+
context.halted_test_coordinator1 = true
|
27
|
+
end
|
28
|
+
|
29
|
+
def plan
|
30
|
+
{
|
31
|
+
HaltedTestUseCase1 => { :success => nil,
|
32
|
+
:halted => TestUseCase2 },
|
33
|
+
|
34
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
35
|
+
|
36
|
+
TestUseCase3 => { :success => nil }
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class FailureTestCoordinator1
|
42
|
+
include ActionLogic::ActionCoordinator
|
43
|
+
|
44
|
+
def call
|
45
|
+
context.failure_test_coordinator1 = true
|
46
|
+
end
|
47
|
+
|
48
|
+
def plan
|
49
|
+
{
|
50
|
+
FailureTestUseCase1 => { :success => nil,
|
51
|
+
:failure => TestUseCase2 },
|
52
|
+
|
53
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
54
|
+
|
55
|
+
TestUseCase3 => { :success => nil }
|
56
|
+
}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class ValidateBeforeTestCoordinator
|
61
|
+
include ActionLogic::ActionCoordinator
|
62
|
+
|
63
|
+
validates_before Constants::ALL_VALIDATIONS
|
64
|
+
|
65
|
+
def call
|
66
|
+
end
|
67
|
+
|
68
|
+
def plan
|
69
|
+
{
|
70
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
71
|
+
|
72
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
73
|
+
|
74
|
+
TestUseCase3 => { :success => nil }
|
75
|
+
}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class ValidateBeforeCustomTypeTestCoordinator
|
80
|
+
include ActionLogic::ActionCoordinator
|
81
|
+
|
82
|
+
validates_before Constants::CUSTOM_TYPE_VALIDATION1
|
83
|
+
|
84
|
+
def call
|
85
|
+
end
|
86
|
+
|
87
|
+
def plan
|
88
|
+
{
|
89
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
90
|
+
|
91
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
92
|
+
|
93
|
+
TestUseCase3 => { :success => nil }
|
94
|
+
}
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class ValidateBeforePresenceTestCoordinator
|
99
|
+
include ActionLogic::ActionCoordinator
|
100
|
+
|
101
|
+
validates_before Constants::PRESENCE_VALIDATION
|
102
|
+
|
103
|
+
def call
|
104
|
+
end
|
105
|
+
|
106
|
+
def plan
|
107
|
+
{
|
108
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
109
|
+
|
110
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
111
|
+
|
112
|
+
TestUseCase3 => { :success => nil }
|
113
|
+
}
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
class ValidateBeforeCustomPresenceTestCoordinator
|
118
|
+
include ActionLogic::ActionCoordinator
|
119
|
+
|
120
|
+
validates_before Constants::CUSTOM_PRESENCE_VALIDATION
|
121
|
+
|
122
|
+
def call
|
123
|
+
end
|
124
|
+
|
125
|
+
def plan
|
126
|
+
{
|
127
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
128
|
+
|
129
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
130
|
+
|
131
|
+
TestUseCase3 => { :success => nil }
|
132
|
+
}
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
class ValidateBeforeUnrecognizablePresenceTestCoordinator
|
137
|
+
include ActionLogic::ActionCoordinator
|
138
|
+
|
139
|
+
validates_before :integer_test => { :presence => :true }
|
140
|
+
|
141
|
+
def call
|
142
|
+
end
|
143
|
+
|
144
|
+
def plan
|
145
|
+
{
|
146
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
147
|
+
|
148
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
149
|
+
|
150
|
+
TestUseCase3 => { :success => nil }
|
151
|
+
}
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
class ValidateAfterTestCoordinator
|
156
|
+
include ActionLogic::ActionCoordinator
|
157
|
+
|
158
|
+
validates_after Constants::ALL_VALIDATIONS
|
159
|
+
|
160
|
+
def call
|
161
|
+
context.integer_test = 1
|
162
|
+
context.float_test = 1.0
|
163
|
+
context.string_test = "string"
|
164
|
+
context.bool_test = false
|
165
|
+
context.hash_test = {}
|
166
|
+
context.array_test = []
|
167
|
+
context.symbol_test = :symbol
|
168
|
+
context.nil_test = nil
|
169
|
+
end
|
170
|
+
|
171
|
+
def plan
|
172
|
+
{
|
173
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
174
|
+
|
175
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
176
|
+
|
177
|
+
TestUseCase3 => { :success => nil }
|
178
|
+
}
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
class ValidateAfterMissingAttributesTestCoordinator
|
183
|
+
include ActionLogic::ActionCoordinator
|
184
|
+
|
185
|
+
validates_after Constants::ALL_VALIDATIONS
|
186
|
+
|
187
|
+
def call
|
188
|
+
end
|
189
|
+
|
190
|
+
def plan
|
191
|
+
{
|
192
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
193
|
+
|
194
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
195
|
+
|
196
|
+
TestUseCase3 => { :success => nil }
|
197
|
+
}
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
class ValidateAfterInvalidTypeTestCoordinator
|
202
|
+
include ActionLogic::ActionCoordinator
|
203
|
+
|
204
|
+
validates_after Constants::ALL_VALIDATIONS
|
205
|
+
|
206
|
+
def call
|
207
|
+
context.integer_test = nil
|
208
|
+
context.float_test = nil
|
209
|
+
context.string_test = nil
|
210
|
+
context.bool_test = nil
|
211
|
+
context.hash_test = nil
|
212
|
+
context.array_test = nil
|
213
|
+
context.symbol_test = nil
|
214
|
+
context.nil_test = 1
|
215
|
+
end
|
216
|
+
|
217
|
+
def plan
|
218
|
+
{
|
219
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
220
|
+
|
221
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
222
|
+
|
223
|
+
TestUseCase3 => { :success => nil }
|
224
|
+
}
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
class ValidateAfterCustomTypeTestCoordinator
|
229
|
+
include ActionLogic::ActionCoordinator
|
230
|
+
|
231
|
+
validates_after Constants::CUSTOM_TYPE_VALIDATION1
|
232
|
+
|
233
|
+
def call
|
234
|
+
context.custom_type = CustomType1.new
|
235
|
+
end
|
236
|
+
|
237
|
+
def plan
|
238
|
+
{
|
239
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
240
|
+
|
241
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
242
|
+
|
243
|
+
TestUseCase3 => { :success => nil }
|
244
|
+
}
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
class ValidateAfterInvalidCustomTypeTestCoordinator
|
249
|
+
include ActionLogic::ActionCoordinator
|
250
|
+
|
251
|
+
validates_after Constants::CUSTOM_TYPE_VALIDATION2
|
252
|
+
|
253
|
+
def call
|
254
|
+
context.custom_type = CustomType1.new
|
255
|
+
end
|
256
|
+
|
257
|
+
def plan
|
258
|
+
{
|
259
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
260
|
+
|
261
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
262
|
+
|
263
|
+
TestUseCase3 => { :success => nil }
|
264
|
+
}
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
class ValidateAfterPresenceTestCoordinator
|
269
|
+
include ActionLogic::ActionCoordinator
|
270
|
+
|
271
|
+
validates_after Constants::PRESENCE_VALIDATION
|
272
|
+
|
273
|
+
def call
|
274
|
+
context.integer_test = 1
|
275
|
+
end
|
276
|
+
|
277
|
+
def plan
|
278
|
+
{
|
279
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
280
|
+
|
281
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
282
|
+
|
283
|
+
TestUseCase3 => { :success => nil }
|
284
|
+
}
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
class ValidateAfterInvalidPresenceTestCoordinator
|
289
|
+
include ActionLogic::ActionCoordinator
|
290
|
+
|
291
|
+
validates_after Constants::PRESENCE_VALIDATION
|
292
|
+
|
293
|
+
def call
|
294
|
+
context.integer_test = nil
|
295
|
+
end
|
296
|
+
|
297
|
+
def plan
|
298
|
+
{
|
299
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
300
|
+
|
301
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
302
|
+
|
303
|
+
TestUseCase3 => { :success => nil }
|
304
|
+
}
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
class ValidateAfterCustomPresenceTestCoordinator
|
309
|
+
include ActionLogic::ActionCoordinator
|
310
|
+
|
311
|
+
validates_after Constants::CUSTOM_PRESENCE_VALIDATION
|
312
|
+
|
313
|
+
def call
|
314
|
+
context.array_test = [1]
|
315
|
+
end
|
316
|
+
|
317
|
+
def plan
|
318
|
+
{
|
319
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
320
|
+
|
321
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
322
|
+
|
323
|
+
TestUseCase3 => { :success => nil }
|
324
|
+
}
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
class ValidateAfterInvalidCustomPresenceTestCoordinator
|
329
|
+
include ActionLogic::ActionCoordinator
|
330
|
+
|
331
|
+
validates_after Constants::CUSTOM_PRESENCE_VALIDATION
|
332
|
+
|
333
|
+
def call
|
334
|
+
context.array_test = []
|
335
|
+
end
|
336
|
+
|
337
|
+
def plan
|
338
|
+
{
|
339
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
340
|
+
|
341
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
342
|
+
|
343
|
+
TestUseCase3 => { :success => nil }
|
344
|
+
}
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
class ValidateAfterUnrecognizablePresenceTestCoordinator
|
349
|
+
include ActionLogic::ActionCoordinator
|
350
|
+
|
351
|
+
validates_after :integer_test => { :presence => :true }
|
352
|
+
|
353
|
+
def call
|
354
|
+
context.integer_test = 1
|
355
|
+
end
|
356
|
+
|
357
|
+
def plan
|
358
|
+
{
|
359
|
+
TestUseCase1 => { :success => TestUseCase2 },
|
360
|
+
|
361
|
+
TestUseCase2 => { :success => TestUseCase3 },
|
362
|
+
|
363
|
+
TestUseCase3 => { :success => nil }
|
364
|
+
}
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
class TestUseCase1
|
369
|
+
include ActionLogic::ActionUseCase
|
370
|
+
|
371
|
+
def call
|
372
|
+
context.test_use_case1 = true
|
373
|
+
end
|
374
|
+
|
375
|
+
def tasks
|
376
|
+
[TestTask1]
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
class TestHaltUseCase1
|
381
|
+
include ActionLogic::ActionUseCase
|
382
|
+
|
383
|
+
def call
|
384
|
+
context.test_use_case1 = true
|
385
|
+
end
|
386
|
+
|
387
|
+
def tasks
|
388
|
+
[HaltTestTask1]
|
389
|
+
end
|
390
|
+
end
|
391
|
+
|
392
|
+
class TestUseCase2
|
393
|
+
include ActionLogic::ActionUseCase
|
394
|
+
|
395
|
+
def call
|
396
|
+
context.test_use_case2 = true
|
397
|
+
end
|
398
|
+
|
399
|
+
def tasks
|
400
|
+
[TestTask2]
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
class TestUseCase3
|
405
|
+
include ActionLogic::ActionUseCase
|
406
|
+
|
407
|
+
def call
|
408
|
+
context.test_use_case3 = true
|
409
|
+
end
|
410
|
+
|
411
|
+
def tasks
|
412
|
+
[TestTask3]
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
416
|
+
class HaltedTestUseCase1
|
417
|
+
include ActionLogic::ActionUseCase
|
418
|
+
|
419
|
+
def call
|
420
|
+
context.halted_test_use_case1 = true
|
421
|
+
end
|
422
|
+
|
423
|
+
def tasks
|
424
|
+
[HaltedTestTask1]
|
425
|
+
end
|
426
|
+
end
|
427
|
+
|
428
|
+
class HaltedTestUseCase2
|
429
|
+
include ActionLogic::ActionUseCase
|
430
|
+
|
431
|
+
def call
|
432
|
+
context.halted_test_use_case2 = true
|
433
|
+
end
|
434
|
+
|
435
|
+
def tasks
|
436
|
+
[HaltedTestTask2]
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
class HaltedTestUseCase3
|
441
|
+
include ActionLogic::ActionUseCase
|
442
|
+
|
443
|
+
def call
|
444
|
+
context.halted_test_use_case3 = true
|
445
|
+
end
|
446
|
+
|
447
|
+
def tasks
|
448
|
+
[HaltedTestTask3]
|
449
|
+
end
|
450
|
+
end
|
451
|
+
|
452
|
+
class FailureTestUseCase1
|
453
|
+
include ActionLogic::ActionUseCase
|
454
|
+
|
455
|
+
def call
|
456
|
+
context.failure_test_use_case1 = true
|
457
|
+
end
|
458
|
+
|
459
|
+
def tasks
|
460
|
+
[FailureTestTask1]
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
464
|
+
class FailureTestUseCase2
|
465
|
+
include ActionLogic::ActionUseCase
|
466
|
+
|
467
|
+
def call
|
468
|
+
context.failure_test_use_case2 = true
|
469
|
+
end
|
470
|
+
|
471
|
+
def tasks
|
472
|
+
[FailureTestTask2]
|
473
|
+
end
|
474
|
+
end
|
475
|
+
|
476
|
+
class FailureTestUseCase3
|
477
|
+
include ActionLogic::ActionUseCase
|
478
|
+
|
479
|
+
def call
|
480
|
+
context.failure_test_use_case3 = true
|
481
|
+
end
|
482
|
+
|
483
|
+
def tasks
|
484
|
+
[FailureTestTask3]
|
485
|
+
end
|
486
|
+
end
|
487
|
+
|
488
|
+
class TestTask1
|
489
|
+
include ActionLogic::ActionTask
|
490
|
+
|
491
|
+
def call
|
492
|
+
context.test_task1 = true
|
493
|
+
end
|
494
|
+
end
|
495
|
+
|
496
|
+
class TestTask2
|
497
|
+
include ActionLogic::ActionTask
|
498
|
+
|
499
|
+
def call
|
500
|
+
context.test_task2 = true
|
501
|
+
end
|
502
|
+
end
|
503
|
+
|
504
|
+
class TestTask3
|
505
|
+
include ActionLogic::ActionTask
|
506
|
+
|
507
|
+
def call
|
508
|
+
context.test_task3 = true
|
509
|
+
end
|
510
|
+
end
|
511
|
+
|
512
|
+
class HaltedTestTask1
|
513
|
+
include ActionLogic::ActionTask
|
514
|
+
|
515
|
+
def call
|
516
|
+
context.halted_test_task1 = true
|
517
|
+
context.halt!
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
521
|
+
class HaltedTestTask2
|
522
|
+
include ActionLogic::ActionTask
|
523
|
+
|
524
|
+
def call
|
525
|
+
context.halted_test_task2 = true
|
526
|
+
context.halt!
|
527
|
+
end
|
528
|
+
end
|
529
|
+
|
530
|
+
class HaltedTestTask3
|
531
|
+
include ActionLogic::ActionTask
|
532
|
+
|
533
|
+
def call
|
534
|
+
context.halted_test_task3 = true
|
535
|
+
context.halt!
|
536
|
+
end
|
537
|
+
end
|
538
|
+
|
539
|
+
class FailureTestTask1
|
540
|
+
include ActionLogic::ActionTask
|
541
|
+
|
542
|
+
def call
|
543
|
+
context.failure_test_task1 = true
|
544
|
+
context.fail!
|
545
|
+
end
|
546
|
+
end
|
547
|
+
|
548
|
+
class FailureTestTask2
|
549
|
+
include ActionLogic::ActionTask
|
550
|
+
|
551
|
+
def call
|
552
|
+
context.failure_test_task2 = true
|
553
|
+
context.fail!
|
554
|
+
end
|
555
|
+
end
|
556
|
+
|
557
|
+
class FailureTestTask3
|
558
|
+
include ActionLogic::ActionTask
|
559
|
+
|
560
|
+
def call
|
561
|
+
context.failure_test_task3 = true
|
562
|
+
context.fail!
|
563
|
+
end
|
564
|
+
end
|