diff --git a/changelog/new_add_new_minitest_no_focus_cop.md b/changelog/new_add_new_minitest_no_focus_cop.md new file mode 100644 index 0000000..ba6da74 --- /dev/null +++ b/changelog/new_add_new_minitest_no_focus_cop.md @@ -0,0 +1 @@ +* [#301](https://github.com/rubocop/rubocop-minitest/issues/301): Add new Minitest/Focus cop. ([@jaredmoody][]) diff --git a/config/default.yml b/config/default.yml index afc2167..e042bd9 100644 --- a/config/default.yml +++ b/config/default.yml @@ -188,6 +188,11 @@ Minitest/NoAssertions: Enabled: false VersionAdded: '0.12' +Minitest/NoFocus: + Description: 'Checks for focused tests.' + Enabled: pending + VersionAdded: '<>' + Minitest/NoTestCases: Description: 'Checks if test class contains any test cases.' Enabled: false diff --git a/lib/rubocop/cop/minitest/focus.rb b/lib/rubocop/cop/minitest/focus.rb new file mode 100644 index 0000000..9e1dc65 --- /dev/null +++ b/lib/rubocop/cop/minitest/focus.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Minitest + # Enforces tests are not focused + # + # @example + # # bad + # focus test 'foo' do + # end + # + # # bad + # focus + # test 'foo' do + # end + # + # # good + # test 'foo' do + # end + # + class NoFocus < Base + MSG = 'Remove `focus` from tests.' + RESTRICT_ON_SEND = [:focus].freeze + + def_node_matcher :focused?, <<~PATTERN + (send nil? :focus ...) + PATTERN + + def on_send(node) + return unless focused?(node) + + add_offense node + end + end + end + end +end diff --git a/lib/rubocop/cop/minitest_cops.rb b/lib/rubocop/cop/minitest_cops.rb index 014a861..b36921d 100644 --- a/lib/rubocop/cop/minitest_cops.rb +++ b/lib/rubocop/cop/minitest_cops.rb @@ -30,6 +30,7 @@ require_relative 'minitest/assert_truthy' require_relative 'minitest/duplicate_test_run' require_relative 'minitest/empty_line_before_assertion_methods' +require_relative 'minitest/focus' require_relative 'minitest/non_executable_test_method' require_relative 'minitest/redundant_message_argument' require_relative 'minitest/return_in_test_method' diff --git a/test/rubocop/cop/minitest/focus_test.rb b/test/rubocop/cop/minitest/focus_test.rb new file mode 100644 index 0000000..99ba01f --- /dev/null +++ b/test/rubocop/cop/minitest/focus_test.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require_relative '../../../test_helper' + +class FocusTest < Minitest::Test + def test_registers_offense_when_using_direct_focus + assert_offense(<<~RUBY) + class FooTest < Minitest::Test + focus test 'foo' do + ^^^^^^^^^^^^^^^^ Remove `focus` from tests. + end + end + RUBY + end + + def test_registers_offense_when_using_indirect_focus + assert_offense(<<~RUBY) + class FooTest < Minitest::Test + focus + ^^^^^ Remove `focus` from tests. + test 'foo' do + end + end + RUBY + end + + def test_does_not_register_offense_when_no_focus + assert_no_offenses(<<~RUBY) + class FooTest < Minitest::Test + test 'foo' do + end + end + RUBY + end +end