class RuboCop::Cop::RSpec::Rails::NegationBeValid


expect(foo).to be_invalid
# good
expect(foo).not_to be_valid
# bad
@example EnforcedStyle: be_invalid
expect(foo).not_to be_valid
# good
expect(foo).to be_invalid
# bad
@example EnforcedStyle: not_to (default)
the test target is an instance of ‘ActiveModel::Validations“.
This cop is unsafe because it cannot guarantee that
@safety
Enforces use of `be_invalid` or `not_to` for negated be_valid.

def message(_matcher)

def message(_matcher)
  format(MSG,
         runner: replaced_runner,
         matcher: replaced_matcher)
end

def offense?(node)

def offense?(node)
  case style
  when :not_to
    be_invalid?(node)
  when :be_invalid
    not_to?(node)
  end
end

def offense_range(node)

def offense_range(node)
  node.parent.loc.selector.with(end_pos: node.loc.selector.end_pos)
end

def on_send(node)

def on_send(node)
  return unless offense?(node.parent)
  add_offense(offense_range(node),
              message: message(node.method_name)) do |corrector|
    corrector.replace(node.parent.loc.selector, replaced_runner)
    corrector.replace(node.loc.selector, replaced_matcher)
  end
end

def replaced_matcher

def replaced_matcher
  case style
  when :not_to
    'be_valid'
  when :be_invalid
    'be_invalid'
  end
end

def replaced_runner

def replaced_runner
  case style
  when :not_to
    'not_to'
  when :be_invalid
    'to'
  end
end