spec/cc/engine/issue_spec.rb (106 lines of code) (raw):
require "spec_helper"
require "cc/engine/issue"
module CC::Engine
describe Issue do
describe "#to_json" do
let(:offense) do
location = OpenStruct.new
location.first_line = 10
location.last_line = 10
location.column = 3
location.last_column = 99
offense = OpenStruct.new
offense.cop_name = "Metrics/CyclomaticComplexity"
offense.message = "Cyclomatic complexity for complex_method is too high [10/5]"
offense.location = location
offense
end
it "returns a json issue for a Rubocop offense" do
issue = Issue.new(offense, "app/models/user.rb")
attributes = JSON.parse(issue.to_json)
expect(attributes["type"]).to eq("Issue")
expect(attributes["check_name"]).to eq("Rubocop/Metrics/CyclomaticComplexity")
expect(attributes["description"]).to eq("Cyclomatic complexity for complex_method is too high [10/5]")
expect(attributes["categories"]).to eq(["Complexity"])
expect(attributes["remediation_points"]).to eq(1_350_000)
expect(attributes["location"]["path"]).to eq("app/models/user.rb")
expect(attributes["location"]["positions"]["begin"]["line"]).to eq(10)
expect(attributes["location"]["positions"]["end"]["line"]).to eq(10)
expect(attributes["location"]["positions"]["begin"]["column"]).to eq(4)
expect(attributes["location"]["positions"]["end"]["column"]).to eq(100)
expect(attributes["content"]["body"].squish).to include(
"This cop checks that the cyclomatic complexity of methods is not higher than the configured maximum."
)
end
it "sets a fingerprint for method/class offenses" do
offense.cop_name = "Metrics/AbcSize"
issue = Issue.new(offense, "app/models/user.rb")
attributes = JSON.parse(issue.to_json)
expect(attributes).to have_key("fingerprint")
end
it "does not set a fingerprint for other offenses" do
offense.cop_name = "Style/AlignParameters"
issue = Issue.new(offense, "app/models/user.rb")
attributes = JSON.parse(issue.to_json)
expect(attributes).not_to have_key("fingerprint")
end
end
describe "#remediation points" do
describe "cop has configured remediation points" do
describe "without a multiplier" do
it "returns the configured remediation points" do
cop_list = {
"Metrics/BlockNesting" => {
"remediation_points" => 300_000,
}
}
offense = OpenStruct.new
offense.cop_name = "Metrics/BlockNesting"
offense.message = "This has no multiplier"
issue = Issue.new(offense, "/code/file", cop_list: cop_list)
expect(issue.remediation_points).to eq(300_000)
end
end
describe "with a multiplier" do
it "calculates remediation points using the configured base and overage points" do
cop_list = {
"Metrics/AbcSize" => {
"base_points" => 5_000_000,
"overage_points" => 100_000,
}
}
offense = OpenStruct.new
offense.cop_name = "Metrics/AbcSize"
offense.message = "This has a [32/20] multiplier"
issue = Issue.new(offense, "/code/file", cop_list: cop_list)
base_points = 5_000_000
overage_points = 100_000 * 12
expect(issue.remediation_points).to eq(base_points + overage_points)
end
end
end
describe "cop has no configured remediation points" do
describe "without a multiplier" do
it "returns the default remediation points" do
offense = OpenStruct.new
offense.cop_name = "Some/UnconfiguredCop"
offense.message = "This has no multiplier"
issue = Issue.new(offense, "/code/file.rb")
expect(issue.remediation_points).to eq(Issue::DEFAULT_REMEDIATION_POINTS)
end
end
describe "with a multiplier" do
it "calculates remediation points using the default base and overage points" do
offense = OpenStruct.new
offense.cop_name = "Some/UnconfiguredCop"
offense.message = "This has a [22/20] multiplier"
issue = Issue.new(offense, "/code/file")
base_points = Issue::DEFAULT_BASE_POINTS
overage_points = Issue::DEFAULT_OVERAGE_POINTS * 2
expect(issue.remediation_points).to eq(base_points + overage_points)
end
end
end
end
end
end