diff --git a/lib/rubocop/cop/type_toolkit/dont_expect_unexpected_nil.rb b/lib/rubocop/cop/type_toolkit/dont_expect_unexpected_nil.rb index 103b919..23b57f3 100644 --- a/lib/rubocop/cop/type_toolkit/dont_expect_unexpected_nil.rb +++ b/lib/rubocop/cop/type_toolkit/dont_expect_unexpected_nil.rb @@ -11,7 +11,7 @@ class DontExpectUnexpectedNil < Base #: (RuboCop::AST::SendNode) -> void def on_send(node) case node.method_name - # when :raise then check_raise(node) + when :raise then check_raise(node) when :assert_raises then check_assert_raises(node) end end diff --git a/spec/rubocop/cop/type_toolkit/dont_expect_unexpected_nil_spec.rb b/spec/rubocop/cop/type_toolkit/dont_expect_unexpected_nil_spec.rb index 9177c98..4a2e8ff 100644 --- a/spec/rubocop/cop/type_toolkit/dont_expect_unexpected_nil_spec.rb +++ b/spec/rubocop/cop/type_toolkit/dont_expect_unexpected_nil_spec.rb @@ -31,7 +31,7 @@ module TypeToolkit RUBY end - it "adds offense when assert_raises is used with do...end block" do + it "adds offense when assert_raises is used with UnexpectedNilError with a do ... end block" do assert_offense(<<~RUBY) assert_raises(UnexpectedNilError) do ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{assert_raises_message} @@ -40,14 +40,38 @@ module TypeToolkit RUBY end - it "adds offense when UnexpectedNilError is among other arguments" do + it "adds offense when assert_raises is used with ::UnexpectedNilError with a do ... end block" do + assert_offense(<<~RUBY) + assert_raises(::UnexpectedNilError) do + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{assert_raises_message} + foo + end + RUBY + end + + it "adds offense when assert_raises is passed UnexpectedNilError among other arguments" do assert_offense(<<~RUBY) assert_raises(ArgumentError, UnexpectedNilError) { foo } ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{assert_raises_message} RUBY + + assert_offense(<<~RUBY) + assert_raises(UnexpectedNilError, ArgumentError) { foo } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{assert_raises_message} + RUBY + + assert_offense(<<~RUBY) + assert_raises(::UnexpectedNilError, ArgumentError) { foo } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{assert_raises_message} + RUBY + + assert_offense(<<~RUBY) + assert_raises(ArgumentError, ::UnexpectedNilError) { foo } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{assert_raises_message} + RUBY end - it "does not add offense when assert_raises uses a different error" do + it "does not add offense when assert_raises is used with a different error" do assert_no_offenses(<<~RUBY) assert_raises(ArgumentError) { foo } RUBY @@ -88,6 +112,17 @@ module TypeToolkit RUBY end + it "adds offense when rescuing ::UnexpectedNilError among other exceptions" do + assert_offense(<<~RUBY) + begin + foo + rescue ::UnexpectedNilError, ArgumentError + ^^^^^^^^^^^^^^^^^^^^ #{rescue_message} + bar + end + RUBY + end + it "does not add offense when rescuing other exceptions" do assert_no_offenses(<<~RUBY) begin @@ -103,28 +138,56 @@ module TypeToolkit it "adds offense when raising UnexpectedNilError" do assert_offense(<<~RUBY) raise UnexpectedNilError - ^^^^^^^^^^^^^^^^^^ #{general_usage_message} + ^^^^^^^^^^^^^^^^^^^^^^^^ #{raise_message} RUBY end it "adds offense when raising UnexpectedNilError with a message" do assert_offense(<<~RUBY) raise UnexpectedNilError, "message" - ^^^^^^^^^^^^^^^^^^ #{general_usage_message} + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{raise_message} + RUBY + end + + it "adds offense when raising ::UnexpectedNilError" do + assert_offense(<<~RUBY) + raise ::UnexpectedNilError + ^^^^^^^^^^^^^^^^^^^^^^^^^^ #{raise_message} + RUBY + end + + it "adds offense when raising ::UnexpectedNilError with a message" do + assert_offense(<<~RUBY) + raise ::UnexpectedNilError, "message" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{raise_message} RUBY end it "adds offense when raising UnexpectedNilError.new" do assert_offense(<<~RUBY) raise UnexpectedNilError.new - ^^^^^^^^^^^^^^^^^^ #{general_usage_message} + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{raise_message} RUBY end - it "adds offense when raising ::UnexpectedNilError" do + it "adds offense when raising UnexpectedNilError.new with a message" do assert_offense(<<~RUBY) - raise ::UnexpectedNilError - ^^^^^^^^^^^^^^^^^^^^ #{general_usage_message} + raise UnexpectedNilError.new, "message" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{raise_message} + RUBY + end + + it "adds offense when raising ::UnexpectedNilError.new" do + assert_offense(<<~RUBY) + raise ::UnexpectedNilError.new + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{raise_message} + RUBY + end + + it "adds offense when raising ::UnexpectedNilError.new with a message" do + assert_offense(<<~RUBY) + raise ::UnexpectedNilError.new, "message" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{raise_message} RUBY end @@ -172,6 +235,10 @@ def rescue_message "Change your code to gracefully handle `nil` instead." end + def raise_message + "TypeToolkit/DontExpectUnexpectedNil: `UnexpectedNilError` should only ever be raised by `NilClass#not_nil!`." + end + def general_usage_message "TypeToolkit/DontExpectUnexpectedNil: `UnexpectedNilError` should only ever be used by `#not_nil!`." end