spec/rubocop/cop_patches_spec.rb (148 lines of code) (raw):

require "spec_helper" module CC::Engine describe "Rubocop cops patch" do include RubocopRunner it "patches all relevant cops" do patchable_cops = RuboCop::Cop::Cop.registry.select do |cop| cop.ancestors.include?(RuboCop::Cop::MethodComplexity) || cop.ancestors.include?(RuboCop::Cop::ClassishLength) || cop.ancestors.include?(RuboCop::Cop::TooManyLines) end patched_cops = RuboCop::Cop::Cop.registry.select do |cop| cop.ancestors.include?(RuboCopCopNodeLoc) end expect(patched_cops).to match_array patchable_cops end describe "Metrics::AbcSize patch" do it "includes complete method body for cyclomatic complexity issue" do create_source_file("my_script", <<~EORUBY) #!/usr/bin/env ruby def method() r = 1 #{"r = r.odd? ? r + r : r + 1\n" * 10} r end EORUBY run_engine expect(issues).to include_check "Metrics/AbcSize" issue = issues.find do |i| i["check_name"] == "Rubocop/Metrics/AbcSize" end expect(issue["location"]["positions"]["begin"]["line"]).to eq(3) expect(issue["location"]["positions"]["end"]["line"]).to eq(17) end end describe "Metrics::BlockLength patch" do it "shows full source of long blocks" do create_source_file("test.rb", <<~EORUBY) def method items.map do #{"puts 'hi'\n" * 26} end end EORUBY run_engine expect(issues).to include_check "Metrics/BlockLength" issue = issues.find do |i| i["check_name"] == "Rubocop/Metrics/BlockLength" end expect(issue["location"]["positions"]["begin"]["line"]).to eq(2) expect(issue["location"]["positions"]["end"]["line"]).to eq(30) end end describe "Metrics::ClassLength patch" do it "shows full source of long classes" do create_source_file("test.rb", <<~EORUBY) class Awesome #{"foo = 1\n" * 102} end EORUBY run_engine expect(issues).to include_check "Metrics/ClassLength" issue = issues.find do |i| i["check_name"] == "Rubocop/Metrics/ClassLength" end expect(issue["location"]["positions"]["begin"]["line"]).to eq(1) expect(issue["location"]["positions"]["end"]["line"]).to eq(105) end end describe "Metrics::CyclomaticComplexity patch" do it "includes complete method body for cyclomatic complexity issue" do create_source_file("my_script", <<~EORUBY) #!/usr/bin/env ruby def method(a,b,c,d,e,f,g) r = 1 if a if !b if c if !d if e if !f (1..g).each do |n| r = (r * n) - n end end end end end end end r end EORUBY run_engine expect(issues).to include_check "Metrics/CyclomaticComplexity" issue = issues.find do |i| i["check_name"] == "Rubocop/Metrics/CyclomaticComplexity" end expect(issue["location"]["positions"]["begin"]["line"]).to eq(3) expect(issue["location"]["positions"]["end"]["line"]).to eq(21) end end describe "Metrics::MethodLength patch" do it "shows full source of long methods" do create_source_file("test.rb", <<~EORUBY) def method #{"puts 'hi'\n" * 10} return false end EORUBY run_engine expect(issues).to include_check "Metrics/MethodLength" issue = issues.find do |i| i["check_name"] == "Rubocop/Metrics/MethodLength" end expect(issue["location"]["positions"]["begin"]["line"]).to eq(1) expect(issue["location"]["positions"]["end"]["line"]).to eq(14) end end describe "Metrics::ModuleLength patch" do it "shows full source of long classes" do create_source_file("test.rb", <<~EORUBY) module Awesome #{"foo = 1\n" * 102} end EORUBY run_engine expect(issues).to include_check "Metrics/ModuleLength" issue = issues.find do |i| i["check_name"] == "Rubocop/Metrics/ModuleLength" end expect(issue["location"]["positions"]["begin"]["line"]).to eq(1) expect(issue["location"]["positions"]["end"]["line"]).to eq(105) end end describe "Metrics::PerceivedComplexity patch" do it "includes complete method body for perceived complexity issue" do create_source_file("my_script", <<~EORUBY) #!/usr/bin/env ruby def method() r = 1 #{"r = r.odd? ? r + r : r + 1\n" * 10} r end EORUBY run_engine expect(issues).to include_check "Metrics/PerceivedComplexity" issue = issues.find do |i| i["check_name"] == "Rubocop/Metrics/PerceivedComplexity" end expect(issue["location"]["positions"]["begin"]["line"]).to eq(3) expect(issue["location"]["positions"]["end"]["line"]).to eq(17) end end end end