Class: BoltSpec::Plans::ActionStub
- Inherits:
-
Object
- Object
- BoltSpec::Plans::ActionStub
- Defined in:
- lib/bolt_spec/plans/action_stubs.rb
Direct Known Subclasses
CommandStub, DownloadStub, PlanStub, PublishStub, ScriptStub, TaskStub, UploadStub
Instance Attribute Summary collapse
-
#invocation ⇒ Object
readonly
Returns the value of attribute invocation.
Instance Method Summary collapse
-
#always_return(data) ⇒ Object
Set a default return value for all targets, specific targets may be overridden with return_for_targets.
- #assert_called(object) ⇒ Object
-
#be_called_times(times) ⇒ Object
limit the maximum number of times an allow stub may be called or specify how many times an expect stub must be called.
- #check_plan_result(plan_result, plan_clj) ⇒ Object
- #check_resultset(result_set, object) ⇒ Object
-
#default_for(target) ⇒ Object
Used to create a valid Bolt::Result object from result data.
-
#error_with(data, clazz = Bolt::Error) ⇒ Object
Set a default error result for all targets.
-
#expect_call ⇒ Object
This changes the stub from an allow to an expect which will validate that it has been called.
-
#initialize(expect = false, inventory = nil) ⇒ ActionStub
constructor
A new instance of ActionStub.
-
#not_be_called ⇒ Object
error if the stub is called at all.
- #return(&block) ⇒ Object
-
#return_for_targets(data) ⇒ Object
Set different result values for each target.
-
#with_targets(targets) ⇒ Object
Restricts the stub to only match invocations with the correct targets.
Constructor Details
#initialize(expect = false, inventory = nil) ⇒ ActionStub
Returns a new instance of ActionStub.
37 38 39 40 41 42 43 44 45 46 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 37 def initialize(expect = false, inventory = nil) @calls = 0 @expect = expect @expected_calls = nil # invocation spec @invocation = {} # return value @data = { default: {} } @inventory = inventory end |
Instance Attribute Details
#invocation ⇒ Object (readonly)
Returns the value of attribute invocation.
35 36 37 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 35 def invocation @invocation end |
Instance Method Details
#always_return(data) ⇒ Object
Set a default return value for all targets, specific targets may be overridden with return_for_targets. Follows the same rules for data as return_for_targets.
168 169 170 171 172 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 168 def always_return(data) @data[:default] = data @data_set = true self end |
#assert_called(object) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 48 def assert_called(object) satisfied = if @expect (@expected_calls.nil? && @calls > 0) || @calls == @expected_calls else @expected_calls.nil? || @calls <= @expected_calls end unless satisfied unless (times = @expected_calls) times = @expect ? "at least one" : "any number of" end = "Expected #{object} to be called #{times} times" += " with targets #{@invocation[:targets]}" if @invocation[:targets] if parameters # Print the parameters hash by converting it to JSON and then re-parsing. # This prevents issues in Bolt data types, such as Targets, from generating # gigantic, unreadable, data when converted to string by interpolation. # Targets exhibit this behavior because they have a reference to @inventory. # When the target is converted into a string, it converts the full Inventory # into a string recursively. parameters_str = JSON.parse(parameters.to_json) += " with parameters #{parameters_str}" end raise end end |
#be_called_times(times) ⇒ Object
limit the maximum number of times an allow stub may be called or specify how many times an expect stub must be called.
134 135 136 137 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 134 def be_called_times(times) @expected_calls = times self end |
#check_plan_result(plan_result, plan_clj) ⇒ Object
109 110 111 112 113 114 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 109 def check_plan_result(plan_result, plan_clj) unless plan_result.is_a?(Bolt::PlanResult) raise "Return block for #{plan_clj.closure_name} did not return a Bolt::PlanResult" end plan_result end |
#check_resultset(result_set, object) ⇒ Object
102 103 104 105 106 107 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 102 def check_resultset(result_set, object) unless result_set.is_a?(Bolt::ResultSet) raise "Return block for #{object} did not return a Bolt::ResultSet" end result_set end |
#default_for(target) ⇒ Object
Used to create a valid Bolt::Result object from result data.
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 83 def default_for(target) case @data[:default] when Bolt::PlanFailure # Bolt::PlanFailure needs to be declared before Bolt::Error because # Bolt::PlanFailure is an instance of Bolt::Error, so it can match both # in this case we need to treat Bolt::PlanFailure's in a different way # # raise Bolt::PlanFailure errors so that the PAL can catch them and wrap # them into Bolt::PlanResult's for us. raise @data[:default] when Bolt::Error Bolt::Result.from_exception(target, @data[:default]) when Hash result_for(target, **Bolt::Util.walk_keys(@data[:default], &:to_sym)) else raise 'Default result must be a Hash' end end |
#error_with(data, clazz = Bolt::Error) ⇒ Object
Set a default error result for all targets.
175 176 177 178 179 180 181 182 183 184 185 186 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 175 def error_with(data, clazz = Bolt::Error) data = Bolt::Util.walk_keys(data, &:to_s) if data['msg'] && data['kind'] && (data.keys - %w[msg kind details issue_code]).empty? @data[:default] = clazz.new(data['msg'], data['kind'], data['details'], data['issue_code']) else $stderr.puts "In the future 'error_with()' might require msg and kind, and " \ "optionally accept only details and issue_code." @data[:default] = data end @data_set = true self end |
#expect_call ⇒ Object
This changes the stub from an allow to an expect which will validate that it has been called.
76 77 78 79 80 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 76 def expect_call @expected_calls = 1 @expect = true self end |
#not_be_called ⇒ Object
error if the stub is called at all.
140 141 142 143 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 140 def not_be_called @expected_calls = 0 self end |
#return(&block) ⇒ Object
145 146 147 148 149 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 145 def return(&block) raise "Cannot set return values and return block." if @data_set @return_block = block self end |
#return_for_targets(data) ⇒ Object
Set different result values for each target. May use string or symbol keys, but allowed key names are restricted based on action.
153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 153 def return_for_targets(data) data.each_with_object(@data) do |(target, result), hsh| raise "Mocked results must be hashes: #{target}: #{result}" unless result.is_a? Hash # set the inventory from the BoltSpec::Plans, otherwise if we try to convert # this target to a string, it will fail to string conversion because the # inventory is nil hsh[target] = result_for(Bolt::Target.new(target, @inventory), **Bolt::Util.walk_keys(result, &:to_sym)) end raise "Cannot set return values and return block." if @return_block @data_set = true self end |
#with_targets(targets) ⇒ Object
Restricts the stub to only match invocations with the correct targets
120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/bolt_spec/plans/action_stubs.rb', line 120 def with_targets(targets) targets = Array(targets) @invocation[:targets] = targets.map do |target| if target.is_a? String target else target.name end end self end |