spec/cc/analyzer/source_fingerprint_spec.rb (82 lines of code) (raw):

require "spec_helper" module CC::Analyzer describe SourceFingerprint do describe "#compute" do let(:output) do output = { "check_name" => "Check/Name", "location" => { "path" => "spec/fixtures/source.rb" }, } end it "computes a fingerprint by path, check_name, and source" do output["location"]["lines"] = { "begin" => 2, "end" => 4 } issue = Issue.new("", output.to_json) fingerprint = SourceFingerprint.new(issue) expect(fingerprint.compute).to eq("30f53a688723a198cd83d3e3377da7d0") end it "supports positions syntax" do output["location"]["positions"] = { "begin" => { "line" => 2, "column" => 7, }, "end" => { "offset" => 43, }, } issue = Issue.new("", output.to_json) fingerprint = SourceFingerprint.new(issue) expect(fingerprint.compute).to eq("a3429245fd5f37cfddc9f1a6c7fd31b3") end it "incorporates partially available source in the fingerprint" do output["location"]["lines"] = { "begin" => 5, "end" => 100 } issue = Issue.new("", output.to_json) fingerprint = SourceFingerprint.new(issue) expect(fingerprint.compute).to eq("84fbb18391c45d63ddc6f8d528d18ae6") end it "only incorporates source if source is available" do output["location"]["lines"] = { "begin" => 1000, "end" => 1000 } issue = Issue.new("", output.to_json) fingerprint = SourceFingerprint.new(issue) expect(fingerprint.compute).to eq("eef541a28f83417a45808139d58b631d") end it "clears out invalid UTF-8 bytes" do output["location"] = { "lines" => { "begin" => 1, "end" => 1 }, "path" => "spec/fixtures/stub.rb" } allow(File).to receive(:file?).and_return(true) allow(File).to receive(:read).and_return("hi \255".force_encoding(Encoding::UTF_8)) issue = Issue.new("", output.to_json) fingerprint = SourceFingerprint.new(issue) expect(fingerprint.compute).to eq("717ddedd698e51037903bad1d2b06c1b") end it "excludes the source when the file doesn't exist" do output["location"] = { "lines" => { "begin" => 1, "end" => 1 }, "path" => "doesnotexist" } issue = Issue.new("", output.to_json) fingerprint = SourceFingerprint.new(issue) expect(fingerprint.compute).to eq("8b425ee5d6c63f873d62d9985676b2d9") end end end end