Class: PrometheusExporter::Ext::RSpec::SendMetricsMatcher

Inherits:
Object
  • Object
show all
Includes:
Matchers, RSpec::Matchers::Composable, RSpec::Matchers::DSL::DefaultImplementations
Defined in:
lib/prometheus_exporter/ext/rspec/send_metrics_matcher.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Matchers

#a_counter_metric, #a_gauge_metric, #a_gauge_with_expire_metric, #a_histogram_metric, #a_prometheus_metric, #a_summary_metric, #send_metrics

Constructor Details

#initialize(expected) ⇒ SendMetricsMatcher

Returns a new instance of SendMetricsMatcher.

Parameters:

  • expected (Array<Hash(Symbol)>, nil)


12
13
14
15
16
# File 'lib/prometheus_exporter/ext/rspec/send_metrics_matcher.rb', line 12

def initialize(expected)
  @expected = expected
  @ordered = false
  @times = nil
end

Instance Attribute Details

#actualObject (readonly)

Returns the value of attribute actual.



9
10
11
# File 'lib/prometheus_exporter/ext/rspec/send_metrics_matcher.rb', line 9

def actual
  @actual
end

#expectedObject (readonly)

Returns the value of attribute expected.



9
10
11
# File 'lib/prometheus_exporter/ext/rspec/send_metrics_matcher.rb', line 9

def expected
  @expected
end

Instance Method Details

#description_of(object) ⇒ Object



75
76
77
# File 'lib/prometheus_exporter/ext/rspec/send_metrics_matcher.rb', line 75

def description_of(object)
  RSpec::Support::ObjectFormatter.new(nil).format(object)
end

#failure_messageObject



44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/prometheus_exporter/ext/rspec/send_metrics_matcher.rb', line 44

def failure_message
  if expected
    expected_value = @ordered ? expected : match_array(expected)
    +"expected #{name} to receive #{description_of(expected_value)}, but got\n    #{description_of(actual)}"
  elsif @times
    values_match?(@times, actual.size)
    +"expected #{name} to receive #{@times} metrics, but got #{actual.size}\n    #{description_of(actual)}"
  else
    actual.size
    +"expected #{name} to receive more than 1 metric, but got #{actual.size}\n    #{description_of(actual)}"
  end
end

#matches?(actual_proc) ⇒ Boolean

Returns:

  • (Boolean)

Raises:

  • (ArgumentError)


26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/prometheus_exporter/ext/rspec/send_metrics_matcher.rb', line 26

def matches?(actual_proc)
  raise ArgumentError, "#{name} matcher supports only block expectations" unless actual_proc.is_a?(Proc)

  metrics_before = PrometheusExporter::Ext::RSpec::TestClient.instance.metrics
  actual_proc.call
  metrics_after = PrometheusExporter::Ext::RSpec::TestClient.instance.metrics - metrics_before
  @actual = metrics_after.map { |metric| deep_symbolize_keys(metric) }

  if expected
    expected_value = @ordered ? expected : match_array(expected)
    values_match?(expected_value, actual)
  elsif @times
    values_match?(@times, actual.size)
  else
    actual.size >= 1
  end
end

#nameObject



18
19
20
# File 'lib/prometheus_exporter/ext/rspec/send_metrics_matcher.rb', line 18

def name
  'sends metrics to prometheus'
end

#orderedObject

Raises:

  • (ArgumentError)


57
58
59
60
61
62
63
# File 'lib/prometheus_exporter/ext/rspec/send_metrics_matcher.rb', line 57

def ordered
  raise ArgumentError, 'ordered cannot be when expected not provided' if expected.nil?
  raise ArgumentError, 'ordered cannot be used with times' if @times

  @ordered = true
  self
end

#supports_block_expectations?Boolean

Returns:

  • (Boolean)


22
23
24
# File 'lib/prometheus_exporter/ext/rspec/send_metrics_matcher.rb', line 22

def supports_block_expectations?
  true
end

#times(qty) ⇒ Object

Raises:

  • (ArgumentError)


65
66
67
68
69
70
71
72
73
# File 'lib/prometheus_exporter/ext/rspec/send_metrics_matcher.rb', line 65

def times(qty)
  raise ArgumentError, 'times argument must be an integer' unless qty.is_a?(Integer)
  raise ArgumentError, 'times argument must be >= 1' unless qty >= 1
  raise ArgumentError, 'ordered cannot be when expected is provided' unless expected.nil?
  raise ArgumentError, 'ordered cannot be used with times' if @ordered

  @times = qty
  self
end