1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
# frozen_string_literal: true
module RSpec::Puppet
module FunctionMatchers
class Run
def matches?(func_obj)
@func_obj = func_obj
@has_returned = false
begin
# `*nil` does not evaluate to "no params" on ruby 1.8 :-(
@actual_return = @params.nil? ? @func_obj.execute(&@block) : @func_obj.execute(*@params, &@block)
@has_returned = true
rescue Exception => e
@actual_error = e
end
if @has_expected_error
if @has_returned
false
elsif @actual_error.is_a?(@expected_error)
case @expected_error_message
when nil
true
when Regexp
!(@actual_error.message =~ @expected_error_message).nil?
else
@actual_error.message == @expected_error_message
end
else # error did not match
false
end
elsif @has_expected_return
return false unless @has_returned
case @expected_return
when Regexp
!(@actual_return =~ @expected_return).nil?
when RSpec::Mocks::ArgumentMatchers::KindOf, RSpec::Matchers::AliasedMatcher
@expected_return === @actual_return
else
@actual_return == @expected_return
end
else
@has_returned
end
end
def with_params(*params)
@params = params
# stringify immediately to protect us from the params being changed by
# the subject, e.g. with params.shift
@func_args = @params.inspect[1..-2]
self
end
def with_lambda(&block)
@block = block
self
end
def and_return(value)
@has_expected_return = true
@expected_return = value
@desc = if value.is_a? Regexp
"match #{value.inspect}"
else
"return #{value.inspect}"
end
self
end
def and_raise_error(error_or_message, message = nil)
@has_expected_error = true
case error_or_message
when String, Regexp
@expected_error = Exception
@expected_error_message = error_or_message
else
@expected_error = error_or_message
@expected_error_message = message
end
if @expected_error_message.is_a? Regexp
@desc = "raise an #{@expected_error} with the message matching #{@expected_error_message.inspect}"
else
@desc = "raise an #{@expected_error}"
@desc += "with the message #{@expected_error_message.inspect}" unless @expected_error_message.nil?
end
self
end
def failure_message
failure_message_generic(:should, @func_obj)
end
def failure_message_when_negated
failure_message_generic(:should_not, @func_obj)
end
def description
if @desc
"run #{func_name}(#{func_params}) and #{@desc}"
else
"run #{func_name}(#{func_params}) without error"
end
end
def supports_block_expectations
true
end
def supports_value_expectations
true
end
private
def func_name
@func_obj.func_name
end
def func_params
@func_args
end
def failure_message_actual(type)
if type != :should
''
elsif @actual_error
if @has_expected_return
" instead of raising #{@actual_error.class.inspect}(#{@actual_error})\n#{@actual_error.backtrace.join("\n")}"
else
" instead of #{@actual_error.class.inspect}(#{@actual_error})\n#{@actual_error.backtrace.join("\n")}"
end
elsif @has_expected_error # function has returned
" instead of returning #{@actual_return.inspect}"
else
" instead of #{@actual_return.inspect}"
end
end
def failure_message_generic(type, _func_obj)
# message is mutable
message = +"expected #{func_name}(#{func_params}) to "
message << 'not ' if type == :should_not
if @has_expected_return
message << "have returned #{@expected_return.inspect}"
elsif @has_expected_error
message << "have raised #{@expected_error.inspect}"
message << " matching #{@expected_error_message.inspect}" if @expected_error_message
else
message << 'have run successfully'
end
message << failure_message_actual(type)
end
end
end
end
|