class CukeLinter::TestShouldUseBackgroundLinter

TODO: Make a new class that it is from the POV of a Feature model instead A linter that detects scenarios and outlines within a feature that all share common beginning steps

Public Instance Methods

message() click to toggle source

The message used to describe the problem that has been found

# File lib/cuke_linter/linters/test_should_use_background_linter.rb, line 24
def message
  'Test shares steps with all other tests in feature. Use a background.'
end
rule(model) click to toggle source

The rule used to determine if a model has a problem

# File lib/cuke_linter/linters/test_should_use_background_linter.rb, line 9
def rule(model)
  return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)

  model_steps          = model.steps || []
  parent_feature_model = model.get_ancestor(:feature)

  return false unless parent_feature_model.tests.count > 1

  matching_steps     = all_first_steps_match?(parent_feature_model, model_steps)
  none_parameterized = no_parameterized_steps?(parent_feature_model)

  matching_steps && none_parameterized
end

Private Instance Methods

all_first_steps_match?(feature_model, model_steps) click to toggle source
# File lib/cuke_linter/linters/test_should_use_background_linter.rb, line 32
def all_first_steps_match?(feature_model, model_steps)
  feature_model.tests.all? do |test|
    test_steps = test.steps || []
    test_steps.first == model_steps.first
  end
end
no_parameterized_steps?(feature_model) click to toggle source
# File lib/cuke_linter/linters/test_should_use_background_linter.rb, line 39
def no_parameterized_steps?(feature_model)
  feature_model.tests.none? do |test|
    next false if test.is_a?(CukeModeler::Scenario)

    test_steps          = test.steps || []
    params_used_by_test = test.examples.map(&:parameters).flatten.uniq

    next false unless test_steps.any?

    parameterized_step?(test_steps.first, parameters: params_used_by_test)
  end
end
parameterized_doc_string?(step_model, parameter) click to toggle source
# File lib/cuke_linter/linters/test_should_use_background_linter.rb, line 66
def parameterized_doc_string?(step_model, parameter)
  return false unless step_model.block.is_a?(CukeModeler::DocString)

  step_model.block.content.include?(parameter)
end
parameterized_step?(step_model, parameters:) click to toggle source
# File lib/cuke_linter/linters/test_should_use_background_linter.rb, line 52
def parameterized_step?(step_model, parameters:)
  parameters.any? do |parameter|
    parameter_string = "<#{parameter}>"

    parameterized_text?(step_model, parameter_string) ||
      parameterized_doc_string?(step_model, parameter_string) ||
      parameterized_table?(step_model, parameter_string)
  end
end
parameterized_table?(step_model, parameter) click to toggle source
# File lib/cuke_linter/linters/test_should_use_background_linter.rb, line 72
def parameterized_table?(step_model, parameter)
  return false unless step_model.block.is_a?(CukeModeler::Table)

  step_model.block.rows.map(&:cells).flatten.map(&:value).any? { |cell_text| cell_text.include?(parameter) }
end
parameterized_text?(step_model, parameter) click to toggle source
# File lib/cuke_linter/linters/test_should_use_background_linter.rb, line 62
def parameterized_text?(step_model, parameter)
  step_model.text.include?(parameter)
end