Module: Autotest::CucumberMixin

Included in:
Cucumber, CucumberRails, CucumberRailsRspec, CucumberRailsRspec2, CucumberRspec, CucumberRspec2
Defined in:
lib/autotest/cucumber_mixin.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#features_to_runObject

Returns the value of attribute features_to_run


13
14
15
# File 'lib/autotest/cucumber_mixin.rb', line 13

def features_to_run
  @features_to_run
end

Class Method Details

.included(receiver) ⇒ Object


9
10
11
# File 'lib/autotest/cucumber_mixin.rb', line 9

def self.included(receiver)
  receiver::ALL_HOOKS << %i[run_features ran_features]
end

Instance Method Details

#all_features_goodObject


48
49
50
# File 'lib/autotest/cucumber_mixin.rb', line 48

def all_features_good
  features_to_run == ''
end

#created_args(features_to_run, profile) ⇒ Object


117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/autotest/cucumber_mixin.rb', line 117

def created_args(features_to_run, profile)
  args = if profile
           ['--profile', profile]
         else
           %w[--format] << (features_to_run == :all ? 'progress' : 'pretty')
         end
  # No --color option as some IDEs (Netbeans) don't output them very well (1 failed step)
  args += %w[--format rerun --out] << dirty_features_filename
  args << (features_to_run == :all ? '' : features_to_run)

  # All steps becom undefined during rerun unless the following is run.
  args << 'features/step_definitions' << 'features/support' unless features_to_run == :all

  args.join(' ')
end

#get_to_greenObject

rubocop:disable Naming/AccessorMethodName


52
53
54
55
56
57
58
59
# File 'lib/autotest/cucumber_mixin.rb', line 52

def get_to_green # rubocop:disable Naming/AccessorMethodName
  loop do
    super
    run_features
    wait_for_changes unless all_features_good
    break if all_features_good
  end
end

#initializeObject


15
16
17
18
# File 'lib/autotest/cucumber_mixin.rb', line 15

def initialize
  super
  reset_features
end

#make_cucumber_cmd(features_to_run, _dirty_features_filename) ⇒ Object


99
100
101
102
103
104
105
106
107
108
109
# File 'lib/autotest/cucumber_mixin.rb', line 99

def make_cucumber_cmd(features_to_run, _dirty_features_filename)
  return '' if features_to_run.empty?

  profile_loader = Cucumber::Cli::ProfileLoader.new

  profile = profile(profile_loader)

  args = created_args(features_to_run, profile)

  "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} #{args}"
end

#profile(profile_loader) ⇒ Object


111
112
113
114
115
# File 'lib/autotest/cucumber_mixin.rb', line 111

def profile(profile_loader)
  profile ||= 'autotest-all' if profile_loader.profile?('autotest-all') && features_to_run == :all
  profile ||= 'autotest'     if profile_loader.profile?('autotest')
  profile || nil
end

#rerun_all_featuresObject


61
62
63
64
# File 'lib/autotest/cucumber_mixin.rb', line 61

def rerun_all_features
  reset_features
  run_features
end

#reset_featuresObject


66
67
68
# File 'lib/autotest/cucumber_mixin.rb', line 66

def reset_features
  self.features_to_run = :all
end

#runObject


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
# File 'lib/autotest/cucumber_mixin.rb', line 20

def run
  hook :initialize
  reset
  reset_features
  add_sigint_handler

  loop do # ^c handler
    begin
      get_to_green
      if tainted
        rerun_all_tests
        rerun_all_features if all_good
      else
        hook :all_good
      end
      wait_for_changes
      # Once tests and features are green, reset features every
      # time a file is changed to see if anything breaks.
      reset_features
    rescue Interrupt
      break if wants_to_quit
      reset
      reset_features
    end
  end
  hook :quit
end

#run_featuresObject


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
# File 'lib/autotest/cucumber_mixin.rb', line 70

def run_features
  hook :run_features
  Tempfile.open('autotest-cucumber') do |dirty_features_file|
    cmd = make_cucumber_cmd(features_to_run, dirty_features_file.path)
    break if cmd.empty?
    old_sync = $stdout.sync
    $stdout.sync = true
    self.results = []
    line = []
    begin
      open("| #{cmd}", 'r') do |f| # rubocop:disable Security/Open
        until f.eof?
          c = f.getc || break
          print(c)
          line << c
          next unless c == "\n"
          results << line.join
          line.clear
        end
      end
    ensure
      $stdout.sync = old_sync
    end
    self.features_to_run = dirty_features_file.read.strip
    self.tainted = true unless features_to_run == ''
  end
  hook :ran_features
end