File: run.rb

package info (click to toggle)
ruby-rspec-puppet 4.0.2%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,444 kB
  • sloc: ruby: 6,377; makefile: 6
file content (161 lines) | stat: -rw-r--r-- 4,612 bytes parent folder | download
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