functional-light-service 0.4.4 → 6.0.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.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/project-build.yml +43 -11
  3. data/.rubocop.yml +101 -160
  4. data/AUDIT-functional-light-service.md +352 -0
  5. data/Appraisals +4 -0
  6. data/CHANGELOG.md +118 -0
  7. data/Gemfile +0 -2
  8. data/README.md +1544 -1426
  9. data/Rakefile +1 -1
  10. data/VERSION +1 -1
  11. data/audit/bench.rb +99 -0
  12. data/audit/verify_findings.rb +172 -0
  13. data/functional-light-service.gemspec +15 -16
  14. data/lib/functional-light-service/action.rb +97 -101
  15. data/lib/functional-light-service/configuration.rb +26 -24
  16. data/lib/functional-light-service/context/key_verifier.rb +124 -118
  17. data/lib/functional-light-service/context.rb +63 -20
  18. data/lib/functional-light-service/deprecations.rb +26 -0
  19. data/lib/functional-light-service/errors.rb +8 -6
  20. data/lib/functional-light-service/functional/enum.rb +286 -250
  21. data/lib/functional-light-service/functional/maybe.rb +21 -15
  22. data/lib/functional-light-service/functional/monad.rb +77 -66
  23. data/lib/functional-light-service/functional/null.rb +88 -74
  24. data/lib/functional-light-service/functional/option.rb +100 -97
  25. data/lib/functional-light-service/functional/result.rb +129 -116
  26. data/lib/functional-light-service/localization_adapter.rb +48 -47
  27. data/lib/functional-light-service/organizer/execute.rb +16 -14
  28. data/lib/functional-light-service/organizer/iterate.rb +30 -25
  29. data/lib/functional-light-service/organizer/reduce_if.rb +19 -17
  30. data/lib/functional-light-service/organizer/reduce_until.rb +22 -20
  31. data/lib/functional-light-service/organizer/scoped_reducable.rb +15 -13
  32. data/lib/functional-light-service/organizer/with_callback.rb +28 -26
  33. data/lib/functional-light-service/organizer/with_reducer.rb +81 -71
  34. data/lib/functional-light-service/organizer/with_reducer_factory.rb +20 -18
  35. data/lib/functional-light-service/organizer/with_reducer_log_decorator.rb +110 -105
  36. data/lib/functional-light-service/organizer.rb +114 -104
  37. data/lib/functional-light-service/testing/context_factory.rb +48 -42
  38. data/lib/functional-light-service/testing.rb +3 -1
  39. data/lib/functional-light-service/version.rb +5 -3
  40. data/lib/functional-light-service.rb +30 -28
  41. data/spec/acceptance/after_actions_spec.rb +87 -71
  42. data/spec/acceptance/before_actions_spec.rb +115 -98
  43. data/spec/acceptance/custom_log_from_organizer_spec.rb +61 -60
  44. data/spec/acceptance/deprecation_warnings_spec.rb +82 -0
  45. data/spec/acceptance/fail_spec.rb +52 -50
  46. data/spec/acceptance/message_localization_spec.rb +119 -118
  47. data/spec/acceptance/organizer/add_aliases_spec.rb +28 -0
  48. data/spec/acceptance/organizer/add_to_context_spec.rb +30 -0
  49. data/spec/acceptance/organizer/context_failure_and_skipping_spec.rb +68 -65
  50. data/spec/acceptance/organizer/iterate_spec.rb +7 -0
  51. data/spec/acceptance/organizer/reduce_if_spec.rb +89 -83
  52. data/spec/acceptance/organizer/reduce_until_spec.rb +6 -0
  53. data/spec/acceptance/organizer/with_callback_spec.rb +113 -110
  54. data/spec/acceptance/{not_having_call_method_warning_spec.rb → organizer_entry_point_spec.rb} +10 -7
  55. data/spec/acceptance/rollback_spec.rb +183 -132
  56. data/spec/action_expects_and_promises_spec.rb +97 -93
  57. data/spec/action_promised_keys_spec.rb +126 -122
  58. data/spec/action_spec.rb +8 -0
  59. data/spec/context_spec.rb +289 -197
  60. data/spec/examples/controller_spec.rb +63 -63
  61. data/spec/examples/validate_address_spec.rb +38 -37
  62. data/spec/lib/deterministic/currify_spec.rb +90 -88
  63. data/spec/lib/deterministic/null_spec.rb +6 -1
  64. data/spec/lib/deterministic/option_spec.rb +140 -133
  65. data/spec/lib/deterministic/result/result_map_spec.rb +155 -154
  66. data/spec/lib/deterministic/result/result_shared.rb +3 -2
  67. data/spec/lib/deterministic/result_spec.rb +2 -2
  68. data/spec/lib/edge_cases_spec.rb +156 -0
  69. data/spec/lib/enum_spec.rb +1 -1
  70. data/spec/lib/native_pattern_matching_spec.rb +74 -0
  71. data/spec/organizer_spec.rb +115 -93
  72. data/spec/readme_spec.rb +45 -47
  73. data/spec/sample/calculates_order_tax_action_spec.rb +16 -16
  74. data/spec/sample/calculates_tax_spec.rb +1 -1
  75. data/spec/sample/looks_up_tax_percentage_action_spec.rb +55 -55
  76. data/spec/sample/provides_free_shipping_action_spec.rb +1 -1
  77. data/spec/sample/tax/calculates_order_tax_action.rb +10 -9
  78. data/spec/sample/tax/looks_up_tax_percentage_action.rb +28 -27
  79. data/spec/sample/tax/provides_free_shipping_action.rb +11 -10
  80. data/spec/spec_helper.rb +21 -13
  81. data/spec/test_doubles.rb +628 -564
  82. data/spec/testing/context_factory_spec.rb +21 -0
  83. metadata +49 -117
  84. data/.travis.yml +0 -24
  85. data/lib/functional-light-service/organizer/verify_call_method_exists.rb +0 -29
  86. data/spec/acceptance/include_warning_spec.rb +0 -29
@@ -1,60 +1,61 @@
1
- require 'spec_helper'
2
-
3
- describe "Log from an organizer with a custom logger" do
4
- context "when overriding the global FunctionalLightService organizer" do
5
- let(:global_logger_organizer) do
6
- Class.new do
7
- extend FunctionalLightService::Organizer
8
-
9
- def self.call(number)
10
- with(:number => number).reduce(actions)
11
- end
12
-
13
- def self.actions
14
- [
15
- TestDoubles::AddsOneAction,
16
- TestDoubles::AddsTwoAction,
17
- TestDoubles::AddsThreeAction
18
- ]
19
- end
20
- end
21
- end
22
-
23
- let(:global_logger_string) { StringIO.new }
24
-
25
- let(:custom_logger_string) { StringIO.new }
26
- let(:custom_logger_organizer) do
27
- custom_logger = Logger.new(custom_logger_string)
28
-
29
- Class.new do
30
- extend FunctionalLightService::Organizer
31
- log_with custom_logger
32
-
33
- def self.call(coffee, this_hot = :very_hot)
34
- with(:milk => this_hot, :coffee => coffee)
35
- .reduce(TestDoubles::MakesLatteAction,
36
- TestDoubles::AddsTwoActionWithFetch)
37
- end
38
- end
39
- end
40
-
41
- before do
42
- @original_global_logger = FunctionalLightService::Configuration.logger
43
- FunctionalLightService::Configuration.logger = Logger.new(global_logger_string)
44
- end
45
-
46
- it "logs in own logger" do
47
- global_logger_organizer.call(1)
48
- custom_logger_organizer.call(:coffee => "Cappucino")
49
-
50
- expect(custom_logger_string.string).to include("MakesLatteAction")
51
- expect(custom_logger_string.string).to_not include("AddsOneAction")
52
- expect(global_logger_string.string).to include("AddsOneAction")
53
- expect(global_logger_string.string).to_not include("MakesLatteAction")
54
- end
55
-
56
- after do
57
- FunctionalLightService::Configuration.logger = @original_global_logger
58
- end
59
- end
60
- end
1
+ require 'spec_helper'
2
+
3
+ describe "Log from an organizer with a custom logger" do
4
+ context "when overriding the global FunctionalLightService organizer" do
5
+ let(:global_logger_organizer) do
6
+ Class.new do
7
+ extend FunctionalLightService::Organizer
8
+
9
+ def self.call(number)
10
+ with(:number => number).reduce(actions)
11
+ end
12
+
13
+ def self.actions
14
+ [
15
+ TestDoubles::AddsOneAction,
16
+ TestDoubles::AddsTwoAction,
17
+ TestDoubles::AddsThreeAction
18
+ ]
19
+ end
20
+ end
21
+ end
22
+
23
+ let(:global_logger_string) { StringIO.new }
24
+
25
+ let(:custom_logger_string) { StringIO.new }
26
+ let(:custom_logger_organizer) do
27
+ custom_logger = Logger.new(custom_logger_string)
28
+
29
+ Class.new do
30
+ extend FunctionalLightService::Organizer
31
+
32
+ log_with custom_logger
33
+
34
+ def self.call(coffee, this_hot = :very_hot)
35
+ with(:milk => this_hot, :coffee => coffee)
36
+ .reduce(TestDoubles::MakesLatteAction,
37
+ TestDoubles::AddsTwoActionWithFetch)
38
+ end
39
+ end
40
+ end
41
+
42
+ before do
43
+ @original_global_logger = FunctionalLightService::Configuration.logger
44
+ FunctionalLightService::Configuration.logger = Logger.new(global_logger_string)
45
+ end
46
+
47
+ it "logs in own logger" do
48
+ global_logger_organizer.call(1)
49
+ custom_logger_organizer.call(:coffee => "Cappucino")
50
+
51
+ expect(custom_logger_string.string).to include("MakesLatteAction")
52
+ expect(custom_logger_string.string).to_not include("AddsOneAction")
53
+ expect(global_logger_string.string).to include("AddsOneAction")
54
+ expect(global_logger_string.string).to_not include("MakesLatteAction")
55
+ end
56
+
57
+ after do
58
+ FunctionalLightService::Configuration.logger = @original_global_logger
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+ # Maybe()/Null e il monkey-patch di Object sono opt-in: non fanno parte
3
+ # del require chain di default della gem
4
+ require 'functional-light-service/functional/maybe'
5
+
6
+ describe "deprecation warnings" do
7
+ around do |example|
8
+ FunctionalLightService::Deprecations.silenced = false
9
+ FunctionalLightService::Deprecations.reset!
10
+ example.run
11
+ ensure
12
+ FunctionalLightService::Deprecations.silenced = true
13
+ FunctionalLightService::Deprecations.reset!
14
+ end
15
+
16
+ context "when including FunctionalLightService::Organizer" do
17
+ it "warns on stderr" do
18
+ expect do
19
+ class OrganizerIncludingLS
20
+ include FunctionalLightService::Organizer
21
+ end
22
+ end.to output(/Including FunctionalLightService::Organizer is deprecated/).to_stderr
23
+ end
24
+ end
25
+
26
+ context "when including FunctionalLightService::Action" do
27
+ it "warns on stderr" do
28
+ expect do
29
+ class ActionIncludingLS
30
+ include FunctionalLightService::Action
31
+ end
32
+ end.to output(/Including FunctionalLightService::Action is deprecated/).to_stderr
33
+ end
34
+ end
35
+
36
+ context "when using Maybe/Null" do
37
+ it "warns once per process" do
38
+ expect { Maybe(nil) }
39
+ .to output(%r{Maybe\(\)/Null are deprecated}).to_stderr
40
+ # warn-once: la seconda invocazione non emette nulla
41
+ expect { Maybe(nil) }.not_to output.to_stderr
42
+ end
43
+ end
44
+
45
+ context "when using the exotic operators" do
46
+ include FunctionalLightService::Prelude::Result
47
+
48
+ it "Result#>= warns and delegates to #try" do
49
+ result = nil
50
+ expect { result = Success(1) >= ->(v) { Success(v + 1) } }
51
+ .to output(/Result#>= is deprecated/).to_stderr
52
+ expect(result).to eq(Success(2))
53
+ end
54
+
55
+ it "Result#<< warns and delegates to #pipe" do
56
+ expect { Success(1) << ->(_v) {} }
57
+ .to output(/Result#<< is deprecated/).to_stderr
58
+ end
59
+
60
+ it "Result#+ warns and still combines" do
61
+ result = nil
62
+ expect { result = Success(1) + Success(2) }
63
+ .to output(/Result#\+ is deprecated/).to_stderr
64
+ expect(result).to eq(Success(3))
65
+ end
66
+
67
+ it "Option#+ warns and still combines" do
68
+ some = FunctionalLightService::Option::Some
69
+ result = nil
70
+ expect { result = some.new(1) + some.new(2) }
71
+ .to output(/Option#\+ is deprecated/).to_stderr
72
+ expect(result).to eq(some.new(3))
73
+ end
74
+ end
75
+
76
+ context "when silenced" do
77
+ it "emits nothing" do
78
+ FunctionalLightService::Deprecations.silenced = true
79
+ expect { Maybe(nil) }.not_to output.to_stderr
80
+ end
81
+ end
82
+ end
@@ -1,50 +1,52 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe "fail_and_return!" do
4
- describe "returns immediately from executed block" do
5
- class FailAndReturnAction
6
- extend FunctionalLightService::Action
7
- promises :one, :two
8
-
9
- executed do |ctx|
10
- ctx.one = 1
11
- # Have to set it in Context
12
- ctx.two = nil
13
-
14
- ctx.fail_and_return!('Something went wrong')
15
- ctx.two = 2
16
- end
17
- end
18
-
19
- it "returns immediately from executed block" do
20
- result = FailAndReturnAction.execute
21
-
22
- expect(result).to be_failure
23
- expect(result.two).to be_nil
24
- end
25
- end
26
-
27
- describe "accepts error_code option" do
28
- class FailAndReturnWithErrorCodeAction
29
- extend FunctionalLightService::Action
30
- promises :one, :two
31
-
32
- executed do |ctx|
33
- ctx.one = 1
34
- # Have to set it in Context
35
- ctx.two = nil
36
-
37
- ctx.fail_and_return!('Something went wrong', :error_code => 401)
38
- ctx.two = 2
39
- end
40
- end
41
-
42
- it "returned context contains the error_code" do
43
- result = FailAndReturnWithErrorCodeAction.execute
44
-
45
- expect(result).to be_failure
46
- expect(result.error_code).to eq 401
47
- expect(result.two).to be_nil
48
- end
49
- end
50
- end
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe "fail_and_return!" do
4
+ describe "returns immediately from executed block" do
5
+ class FailAndReturnAction
6
+ extend FunctionalLightService::Action
7
+
8
+ promises :one, :two
9
+
10
+ executed do |ctx|
11
+ ctx.one = 1
12
+ # Have to set it in Context
13
+ ctx.two = nil
14
+
15
+ ctx.fail_and_return!('Something went wrong')
16
+ ctx.two = 2
17
+ end
18
+ end
19
+
20
+ it "returns immediately from executed block" do
21
+ result = FailAndReturnAction.execute
22
+
23
+ expect(result).to be_failure
24
+ expect(result.two).to be_nil
25
+ end
26
+ end
27
+
28
+ describe "accepts error_code option" do
29
+ class FailAndReturnWithErrorCodeAction
30
+ extend FunctionalLightService::Action
31
+
32
+ promises :one, :two
33
+
34
+ executed do |ctx|
35
+ ctx.one = 1
36
+ # Have to set it in Context
37
+ ctx.two = nil
38
+
39
+ ctx.fail_and_return!('Something went wrong', :error_code => 401)
40
+ ctx.two = 2
41
+ end
42
+ end
43
+
44
+ it "returned context contains the error_code" do
45
+ result = FailAndReturnWithErrorCodeAction.execute
46
+
47
+ expect(result).to be_failure
48
+ expect(result.error_code).to eq 401
49
+ expect(result.two).to be_nil
50
+ end
51
+ end
52
+ end
@@ -1,118 +1,119 @@
1
- require "spec_helper"
2
- require "test_doubles"
3
-
4
- class TestsLocalizationAdapter
5
- extend FunctionalLightService::Organizer
6
-
7
- def self.call(pass_or_fail, message_or_key, i18n_options = {})
8
- with(
9
- :pass_or_fail => pass_or_fail,
10
- :message_or_key => message_or_key,
11
- :i18n_options => i18n_options
12
- ).reduce(TestsLocalizationInvocationOptionsAction)
13
- end
14
- end
15
-
16
- class TestsLocalizationInvocationOptionsAction
17
- extend FunctionalLightService::Action
18
- expects :pass_or_fail, :message_or_key, :i18n_options
19
-
20
- executed do |context|
21
- if context.pass_or_fail == true
22
- context.succeed!(context.message_or_key, context.i18n_options)
23
- else
24
- context.fail!(context.message_or_key, context.i18n_options)
25
- end
26
- end
27
- end
28
-
29
- def pass_with(message_or_key, i18n_options = {})
30
- TestsLocalizationAdapter.call(true, message_or_key, i18n_options)
31
- end
32
-
33
- def fail_with(message_or_key, i18n_options = {})
34
- TestsLocalizationAdapter.call(false, message_or_key, i18n_options)
35
- end
36
-
37
- describe "Localization Adapter" do
38
- before do
39
- I18n.backend.store_translations(
40
- :en,
41
- :tests_localization_invocation_options_action =>
42
- {
43
- :light_service => {
44
- :failures => {
45
- :some_failure_reason => "This has failed",
46
- :failure_with_interpolation => "Failed with %{reason}"
47
- },
48
- :successes => {
49
- :some_success_reason => "This has passed",
50
- :success_with_interpolation => "Passed with %{reason}"
51
- }
52
- }
53
- }
54
- )
55
- end
56
-
57
- describe "passing a simple string message" do
58
- describe "by failing the context" do
59
- it "returns the string" do
60
- result = fail_with("string message")
61
-
62
- expect(result).to be_failure
63
- expect(result.message).to eq("string message")
64
- end
65
- end
66
-
67
- describe "by passing the context" do
68
- it "returns the string" do
69
- result = pass_with("string message")
70
-
71
- expect(result).to be_success
72
- expect(result.message).to eq("string message")
73
- end
74
- end
75
- end
76
-
77
- describe "passing a Symbol" do
78
- describe "by failing the context" do
79
- it "performs a translation" do
80
- result = fail_with(:some_failure_reason)
81
-
82
- expect(result).to be_failure
83
- expect(result.message).to eq("This has failed")
84
- end
85
- end
86
-
87
- describe "by passing the contenxt" do
88
- it "performs a translation" do
89
- result = pass_with(:some_success_reason)
90
-
91
- expect(result).to be_success
92
- expect(result.message).to eq("This has passed")
93
- end
94
- end
95
- end
96
-
97
- describe "passing a Symbol with interpolation variables" do
98
- describe "by failing the context" do
99
- it "performs a translation with interpolation" do
100
- result = fail_with(:failure_with_interpolation,
101
- :reason => "bad account")
102
-
103
- expect(result).to be_failure
104
- expect(result.message).to eq("Failed with bad account")
105
- end
106
- end
107
-
108
- describe "by passing the context" do
109
- it "performs a translation with interpolation" do
110
- result = pass_with(:success_with_interpolation,
111
- :reason => "account in good standing")
112
-
113
- expect(result).to be_success
114
- expect(result.message).to eq("Passed with account in good standing")
115
- end
116
- end
117
- end
118
- end
1
+ require "spec_helper"
2
+ require "test_doubles"
3
+
4
+ class TestsLocalizationAdapter
5
+ extend FunctionalLightService::Organizer
6
+
7
+ def self.call(pass_or_fail, message_or_key, i18n_options = {})
8
+ with(
9
+ :pass_or_fail => pass_or_fail,
10
+ :message_or_key => message_or_key,
11
+ :i18n_options => i18n_options
12
+ ).reduce(TestsLocalizationInvocationOptionsAction)
13
+ end
14
+ end
15
+
16
+ class TestsLocalizationInvocationOptionsAction
17
+ extend FunctionalLightService::Action
18
+
19
+ expects :pass_or_fail, :message_or_key, :i18n_options
20
+
21
+ executed do |context|
22
+ if context.pass_or_fail == true
23
+ context.succeed!(context.message_or_key, context.i18n_options)
24
+ else
25
+ context.fail!(context.message_or_key, context.i18n_options)
26
+ end
27
+ end
28
+ end
29
+
30
+ def pass_with(message_or_key, i18n_options = {})
31
+ TestsLocalizationAdapter.call(true, message_or_key, i18n_options)
32
+ end
33
+
34
+ def fail_with(message_or_key, i18n_options = {})
35
+ TestsLocalizationAdapter.call(false, message_or_key, i18n_options)
36
+ end
37
+
38
+ describe "Localization Adapter" do
39
+ before do
40
+ I18n.backend.store_translations(
41
+ :en,
42
+ :tests_localization_invocation_options_action =>
43
+ {
44
+ :light_service => {
45
+ :failures => {
46
+ :some_failure_reason => "This has failed",
47
+ :failure_with_interpolation => "Failed with %{reason}"
48
+ },
49
+ :successes => {
50
+ :some_success_reason => "This has passed",
51
+ :success_with_interpolation => "Passed with %{reason}"
52
+ }
53
+ }
54
+ }
55
+ )
56
+ end
57
+
58
+ describe "passing a simple string message" do
59
+ describe "by failing the context" do
60
+ it "returns the string" do
61
+ result = fail_with("string message")
62
+
63
+ expect(result).to be_failure
64
+ expect(result.message).to eq("string message")
65
+ end
66
+ end
67
+
68
+ describe "by passing the context" do
69
+ it "returns the string" do
70
+ result = pass_with("string message")
71
+
72
+ expect(result).to be_success
73
+ expect(result.message).to eq("string message")
74
+ end
75
+ end
76
+ end
77
+
78
+ describe "passing a Symbol" do
79
+ describe "by failing the context" do
80
+ it "performs a translation" do
81
+ result = fail_with(:some_failure_reason)
82
+
83
+ expect(result).to be_failure
84
+ expect(result.message).to eq("This has failed")
85
+ end
86
+ end
87
+
88
+ describe "by passing the contenxt" do
89
+ it "performs a translation" do
90
+ result = pass_with(:some_success_reason)
91
+
92
+ expect(result).to be_success
93
+ expect(result.message).to eq("This has passed")
94
+ end
95
+ end
96
+ end
97
+
98
+ describe "passing a Symbol with interpolation variables" do
99
+ describe "by failing the context" do
100
+ it "performs a translation with interpolation" do
101
+ result = fail_with(:failure_with_interpolation,
102
+ :reason => "bad account")
103
+
104
+ expect(result).to be_failure
105
+ expect(result.message).to eq("Failed with bad account")
106
+ end
107
+ end
108
+
109
+ describe "by passing the context" do
110
+ it "performs a translation with interpolation" do
111
+ result = pass_with(:success_with_interpolation,
112
+ :reason => "account in good standing")
113
+
114
+ expect(result).to be_success
115
+ expect(result.message).to eq("Passed with account in good standing")
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe FunctionalLightService::Organizer do
4
+ class TestAddAliases
5
+ extend FunctionalLightService::Organizer
6
+
7
+ def self.call(context = FunctionalLightService::Context.make)
8
+ with(context).reduce(steps)
9
+ end
10
+
11
+ def self.steps
12
+ [
13
+ add_to_context(:my_message => "Hello There"),
14
+ # This will add the alias `:a_message` which points
15
+ # to the :my_message key's value
16
+ add_aliases(:my_message => :a_message),
17
+ TestDoubles::CapitalizeMessage
18
+ ]
19
+ end
20
+ end
21
+
22
+ it "adds aliases to the context embedded in the series of actions" do
23
+ result = TestAddAliases.call
24
+
25
+ expect(result).to be_success
26
+ expect(result.final_message).to eq("HELLO THERE")
27
+ end
28
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe FunctionalLightService::Organizer do
4
+ class TestAddToContext
5
+ extend FunctionalLightService::Organizer
6
+
7
+ def self.call(context = FunctionalLightService::Context.make)
8
+ with(context).reduce(steps)
9
+ end
10
+
11
+ def self.steps
12
+ [
13
+ # This will add the `:number` key to the context
14
+ # with the value of 0, so it's available for
15
+ # AddsOneAction
16
+ add_to_context(:number => 0),
17
+ TestDoubles::AddsOneAction,
18
+ add_to_context(:something => "hello")
19
+ ]
20
+ end
21
+ end
22
+
23
+ it "adds items to the context on the fly" do
24
+ result = TestAddToContext.call
25
+
26
+ expect(result).to be_success
27
+ expect(result.number).to eq(1)
28
+ expect(result[:something]).to eq("hello")
29
+ end
30
+ end