Class: TestProf::FactoryDoctor::RSpecListener

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/test_prof/factory_doctor/rspec.rb

Overview

:nodoc:

Constant Summary collapse

SUCCESS_MESSAGE =
'FactoryDoctor says: "Looks good to me!"'
NOTIFICATIONS =
%i[
  example_started
  example_finished
].freeze

Constants included from Logging

Logging::COLORS

Instance Method Summary collapse

Methods included from Logging

#build_log_msg, #colorize, #log

Constructor Details

#initializeRSpecListener

Returns a new instance of RSpecListener.



18
19
20
21
22
# File 'lib/test_prof/factory_doctor/rspec.rb', line 18

def initialize
  @count = 0
  @time = 0.0
  @example_groups = Hash.new { |h, k| h[k] = [] }
end

Instance Method Details

#example_finished(notification) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/test_prof/factory_doctor/rspec.rb', line 28

def example_finished(notification)
  FactoryDoctor.stop
  return if notification.example.pending?

  result = FactoryDoctor.result

  return unless result.bad?

  group = notification.example.example_group.parent_groups.last
  notification.example..merge!(
    factories: result.count,
    time: result.time
  )
  @example_groups[group] << notification.example
  @count += 1
  @time += result.time
end

#example_started(_notification) ⇒ Object



24
25
26
# File 'lib/test_prof/factory_doctor/rspec.rb', line 24

def example_started(_notification)
  FactoryDoctor.start
end


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
# File 'lib/test_prof/factory_doctor/rspec.rb', line 46

def print
  return log(:info, SUCCESS_MESSAGE) if @example_groups.empty?

  msgs = []

  msgs <<
    <<~MSG
      FactoryDoctor report

      Total (potentially) bad examples: #{@count}
      Total wasted time: #{@time.duration}

    MSG

  @example_groups.each do |group, examples|
    msgs << "#{group.description} (#{group.[:location]})\n"
    examples.each do |ex|
      msgs << "  #{ex.description} (#{ex.[:location]}) "\
              "#{pluralize_records(ex.[:factories])} created, "\
              "#{ex.[:time].duration}\n"
    end
    msgs << "\n"
  end

  log :info, msgs.join
end