interaktor 0.2.0 → 0.4.0

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.
@@ -3,37 +3,7 @@
3
3
  # rubocop:disable RSpec/ScatteredSetup
4
4
  # rubocop:disable Style/DocumentationMethod
5
5
 
6
- describe "Integration" do
7
- def build_interaktor(&block)
8
- Class.new.tap do |interaktor|
9
- interaktor.send(:include, Interaktor)
10
- interaktor.class_eval(&block) if block
11
- interaktor.class_eval do
12
- optional :steps
13
-
14
- def unexpected_error!
15
- raise "foo"
16
- end
17
- end
18
- end
19
- end
20
-
21
- def build_organizer(options = {}, &block)
22
- Class.new.tap do |organizer|
23
- organizer.send(:include, Interaktor::Organizer)
24
-
25
- organizer.organize(options[:organize]) if options[:organize]
26
- organizer.class_eval(&block) if block
27
- organizer.class_eval do
28
- optional :steps
29
-
30
- def unexpected_error!
31
- raise "foo"
32
- end
33
- end
34
- end
35
- end
36
-
6
+ RSpec.describe "Integration" do
37
7
  # rubocop:disable Style/AsciiComments
38
8
  #
39
9
  # organizer
@@ -52,7 +22,10 @@ describe "Integration" do
52
22
 
53
23
  let(:organizer) {
54
24
  interaktors = [organizer2, interaktor3, organizer4, interaktor5]
55
- build_organizer(organize: interaktors) do
25
+
26
+ FakeInteraktor.build_interaktor(type: Interaktor::Organizer) do
27
+ organize(interaktors)
28
+
56
29
  around do |interaktor|
57
30
  @context.steps << :around_before
58
31
  interaktor.call
@@ -70,7 +43,11 @@ describe "Integration" do
70
43
  }
71
44
 
72
45
  let(:organizer2) {
73
- build_organizer(organize: [interaktor2a, interaktor2b, interaktor2c]) do
46
+ interaktors = [interaktor2a, interaktor2b, interaktor2c]
47
+
48
+ FakeInteraktor.build_interaktor(type: Interaktor::Organizer) do
49
+ organize(interaktors)
50
+
74
51
  around do |interaktor|
75
52
  @context.steps << :around_before2
76
53
  interaktor.call
@@ -88,7 +65,7 @@ describe "Integration" do
88
65
  }
89
66
 
90
67
  let(:interaktor2a) {
91
- build_interaktor do
68
+ FakeInteraktor.build_interaktor do
92
69
  around do |interaktor|
93
70
  @context.steps << :around_before2a
94
71
  interaktor.call
@@ -114,7 +91,7 @@ describe "Integration" do
114
91
  }
115
92
 
116
93
  let(:interaktor2b) {
117
- build_interaktor do
94
+ FakeInteraktor.build_interaktor do
118
95
  around do |interaktor|
119
96
  @context.steps << :around_before2b
120
97
  interaktor.call
@@ -140,7 +117,7 @@ describe "Integration" do
140
117
  }
141
118
 
142
119
  let(:interaktor2c) {
143
- build_interaktor do
120
+ FakeInteraktor.build_interaktor do
144
121
  around do |interaktor|
145
122
  @context.steps << :around_before2c
146
123
  interaktor.call
@@ -166,7 +143,7 @@ describe "Integration" do
166
143
  }
167
144
 
168
145
  let(:interaktor3) {
169
- build_interaktor do
146
+ FakeInteraktor.build_interaktor do
170
147
  around do |interaktor|
171
148
  @context.steps << :around_before3
172
149
  interaktor.call
@@ -192,7 +169,11 @@ describe "Integration" do
192
169
  }
193
170
 
194
171
  let(:organizer4) {
195
- build_organizer(organize: [interaktor4a, interaktor4b, interaktor4c]) do
172
+ interaktors = [interaktor4a, interaktor4b, interaktor4c]
173
+
174
+ FakeInteraktor.build_interaktor(type: Interaktor::Organizer) do
175
+ organize(interaktors)
176
+
196
177
  around do |interaktor|
197
178
  @context.steps << :around_before4
198
179
  interaktor.call
@@ -210,7 +191,7 @@ describe "Integration" do
210
191
  }
211
192
 
212
193
  let(:interaktor4a) {
213
- build_interaktor do
194
+ FakeInteraktor.build_interaktor do
214
195
  around do |interaktor|
215
196
  @context.steps << :around_before4a
216
197
  interaktor.call
@@ -236,7 +217,7 @@ describe "Integration" do
236
217
  }
237
218
 
238
219
  let(:interaktor4b) {
239
- build_interaktor do
220
+ FakeInteraktor.build_interaktor do
240
221
  around do |interaktor|
241
222
  @context.steps << :around_before4b
242
223
  interaktor.call
@@ -262,7 +243,7 @@ describe "Integration" do
262
243
  }
263
244
 
264
245
  let(:interaktor4c) {
265
- build_interaktor do
246
+ FakeInteraktor.build_interaktor do
266
247
  around do |interaktor|
267
248
  @context.steps << :around_before4c
268
249
  interaktor.call
@@ -288,7 +269,7 @@ describe "Integration" do
288
269
  }
289
270
 
290
271
  let(:interaktor5) {
291
- build_interaktor do
272
+ FakeInteraktor.build_interaktor do
292
273
  around do |interaktor|
293
274
  @context.steps << :around_before5
294
275
  interaktor.call
@@ -341,7 +322,10 @@ describe "Integration" do
341
322
  context "when an around hook fails early" do
342
323
  let(:organizer) {
343
324
  interaktors = [organizer2, interaktor3, organizer4, interaktor5]
344
- build_organizer(organize: interaktors) do
325
+
326
+ FakeInteraktor.build_interaktor(type: Interaktor::Organizer) do
327
+ organize(interaktors)
328
+
345
329
  around do |interaktor|
346
330
  @context.fail!
347
331
  @context.steps << :around_before
@@ -370,7 +354,10 @@ describe "Integration" do
370
354
  context "when an around hook errors early" do
371
355
  let(:organizer) {
372
356
  interaktors = [organizer2, interaktor3, organizer4, interaktor5]
373
- build_organizer(organize: interaktors) do
357
+
358
+ FakeInteraktor.build_interaktor(type: Interaktor::Organizer) do
359
+ organize(interaktors)
360
+
374
361
  around do |interaktor|
375
362
  unexpected_error!
376
363
  @context.steps << :around_before
@@ -386,6 +373,10 @@ describe "Integration" do
386
373
  after do
387
374
  @context.steps << :after
388
375
  end
376
+
377
+ def unexpected_error!
378
+ raise "foo"
379
+ end
389
380
  end
390
381
  }
391
382
 
@@ -409,7 +400,10 @@ describe "Integration" do
409
400
  context "when a before hook fails" do
410
401
  let(:organizer) {
411
402
  interaktors = [organizer2, interaktor3, organizer4, interaktor5]
412
- build_organizer(organize: interaktors) do
403
+
404
+ FakeInteraktor.build_interaktor(type: Interaktor::Organizer) do
405
+ organize(interaktors)
406
+
413
407
  around do |interaktor|
414
408
  @context.steps << :around_before
415
409
  interaktor.call
@@ -439,7 +433,10 @@ describe "Integration" do
439
433
  context "when a before hook errors" do
440
434
  let(:organizer) {
441
435
  interaktors = [organizer2, interaktor3, organizer4, interaktor5]
442
- build_organizer(organize: interaktors) do
436
+
437
+ FakeInteraktor.build_interaktor(type: Interaktor::Organizer) do
438
+ organize(interaktors)
439
+
443
440
  around do |interaktor|
444
441
  @context.steps << :around_before
445
442
  interaktor.call
@@ -454,6 +451,10 @@ describe "Integration" do
454
451
  after do
455
452
  @context.steps << :after
456
453
  end
454
+
455
+ def unexpected_error!
456
+ raise "foo"
457
+ end
457
458
  end
458
459
  }
459
460
 
@@ -479,7 +480,10 @@ describe "Integration" do
479
480
  context "when an after hook fails" do
480
481
  let(:organizer) {
481
482
  interaktors = [organizer2, interaktor3, organizer4, interaktor5]
482
- build_organizer(organize: interaktors) do
483
+
484
+ FakeInteraktor.build_interaktor(type: Interaktor::Organizer) do
485
+ organize(interaktors)
486
+
483
487
  around do |interaktor|
484
488
  @context.steps << :around_before
485
489
  interaktor.call
@@ -529,7 +533,10 @@ describe "Integration" do
529
533
  context "when an after hook errors" do
530
534
  let(:organizer) {
531
535
  interaktors = [organizer2, interaktor3, organizer4, interaktor5]
532
- build_organizer(organize: interaktors) do
536
+
537
+ FakeInteraktor.build_interaktor(type: Interaktor::Organizer) do
538
+ organize(interaktors)
539
+
533
540
  around do |interaktor|
534
541
  @context.steps << :around_before
535
542
  interaktor.call
@@ -544,6 +551,10 @@ describe "Integration" do
544
551
  unexpected_error!
545
552
  @context.steps << :after
546
553
  end
554
+
555
+ def unexpected_error!
556
+ raise "foo"
557
+ end
547
558
  end
548
559
  }
549
560
 
@@ -589,7 +600,10 @@ describe "Integration" do
589
600
  context "when an around hook fails late" do
590
601
  let(:organizer) {
591
602
  interaktors = [organizer2, interaktor3, organizer4, interaktor5]
592
- build_organizer(organize: interaktors) do
603
+
604
+ FakeInteraktor.build_interaktor(type: Interaktor::Organizer) do
605
+ organize(interaktors)
606
+
593
607
  around do |interaktor|
594
608
  @context.steps << :around_before
595
609
  interaktor.call
@@ -640,7 +654,10 @@ describe "Integration" do
640
654
  context "when an around hook errors late" do
641
655
  let(:organizer) {
642
656
  interaktors = [organizer2, interaktor3, organizer4, interaktor5]
643
- build_organizer(organize: interaktors) do
657
+
658
+ FakeInteraktor.build_interaktor(type: Interaktor::Organizer) do
659
+ organize(interaktors)
660
+
644
661
  around do |interaktor|
645
662
  @context.steps << :around_before
646
663
  interaktor.call
@@ -655,6 +672,10 @@ describe "Integration" do
655
672
  after do
656
673
  @context.steps << :after
657
674
  end
675
+
676
+ def unexpected_error!
677
+ raise "foo"
678
+ end
658
679
  end
659
680
  }
660
681
 
@@ -700,7 +721,7 @@ describe "Integration" do
700
721
 
701
722
  context "when a nested around hook fails early" do
702
723
  let(:interaktor3) {
703
- build_interaktor do
724
+ FakeInteraktor.build_interaktor do
704
725
  around do |interaktor|
705
726
  @context.fail!
706
727
  @context.steps << :around_before3
@@ -745,7 +766,7 @@ describe "Integration" do
745
766
 
746
767
  context "when a nested around hook errors early" do
747
768
  let(:interaktor3) {
748
- build_interaktor do
769
+ FakeInteraktor.build_interaktor do
749
770
  around do |interaktor|
750
771
  unexpected_error!
751
772
  @context.steps << :around_before3
@@ -768,6 +789,10 @@ describe "Integration" do
768
789
  def rollback
769
790
  @context.steps << :rollback3
770
791
  end
792
+
793
+ def unexpected_error!
794
+ raise "foo"
795
+ end
771
796
  end
772
797
  }
773
798
 
@@ -800,7 +825,7 @@ describe "Integration" do
800
825
 
801
826
  context "when a nested before hook fails" do
802
827
  let(:interaktor3) {
803
- build_interaktor do
828
+ FakeInteraktor.build_interaktor do
804
829
  around do |interaktor|
805
830
  @context.steps << :around_before3
806
831
  interaktor.call
@@ -846,7 +871,7 @@ describe "Integration" do
846
871
 
847
872
  context "when a nested before hook errors" do
848
873
  let(:interaktor3) {
849
- build_interaktor do
874
+ FakeInteraktor.build_interaktor do
850
875
  around do |interaktor|
851
876
  @context.steps << :around_before3
852
877
  interaktor.call
@@ -869,6 +894,10 @@ describe "Integration" do
869
894
  def rollback
870
895
  @context.steps << :rollback3
871
896
  end
897
+
898
+ def unexpected_error!
899
+ raise "foo"
900
+ end
872
901
  end
873
902
  }
874
903
 
@@ -902,7 +931,7 @@ describe "Integration" do
902
931
 
903
932
  context "when a nested call fails" do
904
933
  let(:interaktor3) {
905
- build_interaktor do
934
+ FakeInteraktor.build_interaktor do
906
935
  around do |interaktor|
907
936
  @context.steps << :around_before3
908
937
  interaktor.call
@@ -948,7 +977,7 @@ describe "Integration" do
948
977
 
949
978
  context "when a nested call errors" do
950
979
  let(:interaktor3) {
951
- build_interaktor do
980
+ FakeInteraktor.build_interaktor do
952
981
  around do |interaktor|
953
982
  @context.steps << :around_before3
954
983
  interaktor.call
@@ -971,6 +1000,10 @@ describe "Integration" do
971
1000
  def rollback
972
1001
  @context.steps << :rollback3
973
1002
  end
1003
+
1004
+ def unexpected_error!
1005
+ raise "foo"
1006
+ end
974
1007
  end
975
1008
  }
976
1009
 
@@ -1004,7 +1037,7 @@ describe "Integration" do
1004
1037
 
1005
1038
  context "when a nested after hook fails" do
1006
1039
  let(:interaktor3) {
1007
- build_interaktor do
1040
+ FakeInteraktor.build_interaktor do
1008
1041
  around do |interaktor|
1009
1042
  @context.steps << :around_before3
1010
1043
  interaktor.call
@@ -1051,7 +1084,7 @@ describe "Integration" do
1051
1084
 
1052
1085
  context "when a nested after hook errors" do
1053
1086
  let(:interaktor3) {
1054
- build_interaktor do
1087
+ FakeInteraktor.build_interaktor do
1055
1088
  around do |interaktor|
1056
1089
  @context.steps << :around_before3
1057
1090
  interaktor.call
@@ -1074,6 +1107,10 @@ describe "Integration" do
1074
1107
  def rollback
1075
1108
  @context.steps << :rollback3
1076
1109
  end
1110
+
1111
+ def unexpected_error!
1112
+ raise "foo"
1113
+ end
1077
1114
  end
1078
1115
  }
1079
1116
 
@@ -1108,7 +1145,7 @@ describe "Integration" do
1108
1145
 
1109
1146
  context "when a nested around hook fails late" do
1110
1147
  let(:interaktor3) {
1111
- build_interaktor do
1148
+ FakeInteraktor.build_interaktor do
1112
1149
  around do |interaktor|
1113
1150
  @context.steps << :around_before3
1114
1151
  interaktor.call
@@ -1155,7 +1192,7 @@ describe "Integration" do
1155
1192
 
1156
1193
  context "when a nested around hook errors late" do
1157
1194
  let(:interaktor3) {
1158
- build_interaktor do
1195
+ FakeInteraktor.build_interaktor do
1159
1196
  around do |interaktor|
1160
1197
  @context.steps << :around_before3
1161
1198
  interaktor.call
@@ -1178,6 +1215,10 @@ describe "Integration" do
1178
1215
  def rollback
1179
1216
  @context.steps << :rollback3
1180
1217
  end
1218
+
1219
+ def unexpected_error!
1220
+ raise "foo"
1221
+ end
1181
1222
  end
1182
1223
  }
1183
1224
 
@@ -1212,7 +1253,7 @@ describe "Integration" do
1212
1253
 
1213
1254
  context "when a deeply nested around hook fails early" do
1214
1255
  let(:interaktor4b) {
1215
- build_interaktor do
1256
+ FakeInteraktor.build_interaktor do
1216
1257
  around do |interaktor|
1217
1258
  @context.fail!
1218
1259
  @context.steps << :around_before4b
@@ -1262,7 +1303,7 @@ describe "Integration" do
1262
1303
 
1263
1304
  context "when a deeply nested around hook errors early" do
1264
1305
  let(:interaktor4b) {
1265
- build_interaktor do
1306
+ FakeInteraktor.build_interaktor do
1266
1307
  around do |interaktor|
1267
1308
  unexpected_error!
1268
1309
  @context.steps << :around_before4b
@@ -1285,6 +1326,10 @@ describe "Integration" do
1285
1326
  def rollback
1286
1327
  @context.steps << :rollback4b
1287
1328
  end
1329
+
1330
+ def unexpected_error!
1331
+ raise "foo"
1332
+ end
1288
1333
  end
1289
1334
  }
1290
1335
 
@@ -1322,7 +1367,7 @@ describe "Integration" do
1322
1367
 
1323
1368
  context "when a deeply nested before hook fails" do
1324
1369
  let(:interaktor4b) {
1325
- build_interaktor do
1370
+ FakeInteraktor.build_interaktor do
1326
1371
  around do |interaktor|
1327
1372
  @context.steps << :around_before4b
1328
1373
  interaktor.call
@@ -1373,7 +1418,7 @@ describe "Integration" do
1373
1418
 
1374
1419
  context "when a deeply nested before hook errors" do
1375
1420
  let(:interaktor4b) {
1376
- build_interaktor do
1421
+ FakeInteraktor.build_interaktor do
1377
1422
  around do |interaktor|
1378
1423
  @context.steps << :around_before4b
1379
1424
  interaktor.call
@@ -1396,6 +1441,10 @@ describe "Integration" do
1396
1441
  def rollback
1397
1442
  @context.steps << :rollback4b
1398
1443
  end
1444
+
1445
+ def unexpected_error!
1446
+ raise "foo"
1447
+ end
1399
1448
  end
1400
1449
  }
1401
1450
 
@@ -1434,7 +1483,7 @@ describe "Integration" do
1434
1483
 
1435
1484
  context "when a deeply nested call fails" do
1436
1485
  let(:interaktor4b) {
1437
- build_interaktor do
1486
+ FakeInteraktor.build_interaktor do
1438
1487
  around do |interaktor|
1439
1488
  @context.steps << :around_before4b
1440
1489
  interaktor.call
@@ -1485,7 +1534,7 @@ describe "Integration" do
1485
1534
 
1486
1535
  context "when a deeply nested call errors" do
1487
1536
  let(:interaktor4b) {
1488
- build_interaktor do
1537
+ FakeInteraktor.build_interaktor do
1489
1538
  around do |interaktor|
1490
1539
  @context.steps << :around_before4b
1491
1540
  interaktor.call
@@ -1508,6 +1557,10 @@ describe "Integration" do
1508
1557
  def rollback
1509
1558
  @context.steps << :rollback4b
1510
1559
  end
1560
+
1561
+ def unexpected_error!
1562
+ raise "foo"
1563
+ end
1511
1564
  end
1512
1565
  }
1513
1566
 
@@ -1546,7 +1599,7 @@ describe "Integration" do
1546
1599
 
1547
1600
  context "when a deeply nested after hook fails" do
1548
1601
  let(:interaktor4b) {
1549
- build_interaktor do
1602
+ FakeInteraktor.build_interaktor do
1550
1603
  around do |interaktor|
1551
1604
  @context.steps << :around_before4b
1552
1605
  interaktor.call
@@ -1598,7 +1651,7 @@ describe "Integration" do
1598
1651
 
1599
1652
  context "when a deeply nested after hook errors" do
1600
1653
  let(:interaktor4b) {
1601
- build_interaktor do
1654
+ FakeInteraktor.build_interaktor do
1602
1655
  around do |interaktor|
1603
1656
  @context.steps << :around_before4b
1604
1657
  interaktor.call
@@ -1621,6 +1674,10 @@ describe "Integration" do
1621
1674
  def rollback
1622
1675
  @context.steps << :rollback4b
1623
1676
  end
1677
+
1678
+ def unexpected_error!
1679
+ raise "foo"
1680
+ end
1624
1681
  end
1625
1682
  }
1626
1683
 
@@ -1660,7 +1717,7 @@ describe "Integration" do
1660
1717
 
1661
1718
  context "when a deeply nested around hook fails late" do
1662
1719
  let(:interaktor4b) {
1663
- build_interaktor do
1720
+ FakeInteraktor.build_interaktor do
1664
1721
  around do |interaktor|
1665
1722
  @context.steps << :around_before4b
1666
1723
  interaktor.call
@@ -1712,7 +1769,7 @@ describe "Integration" do
1712
1769
 
1713
1770
  context "when a deeply nested around hook errors late" do
1714
1771
  let(:interaktor4b) {
1715
- build_interaktor do
1772
+ FakeInteraktor.build_interaktor do
1716
1773
  around do |interaktor|
1717
1774
  @context.steps << :around_before4b
1718
1775
  interaktor.call
@@ -1735,6 +1792,10 @@ describe "Integration" do
1735
1792
  def rollback
1736
1793
  @context.steps << :rollback4b
1737
1794
  end
1795
+
1796
+ def unexpected_error!
1797
+ raise "foo"
1798
+ end
1738
1799
  end
1739
1800
  }
1740
1801
 
@@ -1774,7 +1835,17 @@ describe "Integration" do
1774
1835
 
1775
1836
  context "when there are multiple organize calls" do
1776
1837
  it "runs all passed interaktors in correct order" do
1777
- organizer = build_organizer(organize: [organizer2, interaktor3])
1838
+ # organizer = build_organizer(organize: [organizer2, interaktor3])
1839
+ interaktors = ([organizer2, interaktor3])
1840
+
1841
+ organizer = FakeInteraktor.build_interaktor(type: Interaktor::Organizer) do
1842
+ organize(interaktors)
1843
+
1844
+ def unexpected_error!
1845
+ raise "foo"
1846
+ end
1847
+ end
1848
+
1778
1849
  organizer.organize(organizer4, interaktor5)
1779
1850
 
1780
1851
  expect {
@@ -1,5 +1,5 @@
1
1
  module Interaktor
2
- describe Context do
2
+ RSpec.describe Context do
3
3
  describe ".build" do
4
4
  it "converts the given hash to a context" do
5
5
  context = described_class.build(foo: "bar")
@@ -1,7 +1,7 @@
1
1
  # rubocop:disable RSpec/ScatteredSetup
2
2
 
3
3
  module Interaktor
4
- describe Hooks do
4
+ RSpec.describe Hooks do
5
5
  describe "#with_hooks" do
6
6
  def build_hooked(&block)
7
7
  hooked = Class.new.send(:include, Interaktor::Hooks)
@@ -308,7 +308,95 @@ module Interaktor
308
308
  end
309
309
  end
310
310
 
311
- context "with around, before and after hooks" do
311
+ context "with an ensure_hook method" do
312
+ let(:hooked) {
313
+ build_hooked do
314
+ ensure_hook :add_ensure
315
+
316
+ private
317
+
318
+ def add_ensure
319
+ steps << :ensure
320
+ end
321
+ end
322
+ }
323
+
324
+ it "runs the after hook method" do
325
+ expect(hooked.process).to eq([
326
+ :process,
327
+ :ensure,
328
+ ])
329
+ end
330
+ end
331
+
332
+ context "with an ensure_hook block" do
333
+ let(:hooked) {
334
+ build_hooked do
335
+ ensure_hook do
336
+ steps << :ensure
337
+ end
338
+ end
339
+ }
340
+
341
+ it "runs the after hook block" do
342
+ expect(hooked.process).to eq([
343
+ :process,
344
+ :ensure,
345
+ ])
346
+ end
347
+ end
348
+
349
+ context "with an ensure_hook method and block in one call" do
350
+ let(:hooked) {
351
+ build_hooked do
352
+ ensure_hook :add_ensure1 do
353
+ steps << :ensure2
354
+ end
355
+
356
+ private
357
+
358
+ def add_ensure1
359
+ steps << :ensure1
360
+ end
361
+ end
362
+ }
363
+
364
+ it "runs the ensure_hook method and block in order" do
365
+ expect(hooked.process).to eq([
366
+ :process,
367
+ :ensure1,
368
+ :ensure2,
369
+ ])
370
+ end
371
+ end
372
+
373
+ context "with an ensure_hook method and block in multiple calls" do
374
+ let(:hooked) {
375
+ build_hooked do
376
+ ensure_hook do
377
+ steps << :ensure1
378
+ end
379
+
380
+ ensure_hook :add_ensure2
381
+
382
+ private
383
+
384
+ def add_ensure2
385
+ steps << :ensure2
386
+ end
387
+ end
388
+ }
389
+
390
+ it "runs the ensure_hook block and method in order" do
391
+ expect(hooked.process).to eq([
392
+ :process,
393
+ :ensure1,
394
+ :ensure2,
395
+ ])
396
+ end
397
+ end
398
+
399
+ context "with around, before, after and ensure_hook hooks" do
312
400
  let(:hooked) {
313
401
  build_hooked do
314
402
  around do |hooked|
@@ -338,6 +426,14 @@ module Interaktor
338
426
  after do
339
427
  steps << :after2
340
428
  end
429
+
430
+ ensure_hook do
431
+ steps << :ensure1
432
+ end
433
+
434
+ ensure_hook do
435
+ steps << :ensure2
436
+ end
341
437
  end
342
438
  }
343
439
 
@@ -352,6 +448,8 @@ module Interaktor
352
448
  :after1,
353
449
  :around_after2,
354
450
  :around_after1,
451
+ :ensure1,
452
+ :ensure2,
355
453
  ])
356
454
  end
357
455
  end