Skip to content

Commit d4ed992

Browse files
committed
More thorough maximum coverage drop specs + fixes
* fixes accuracy bug in drop calculation * fixes bug when no coverage data present from last run
1 parent e0c5fd1 commit d4ed992

File tree

3 files changed

+110
-10
lines changed

3 files changed

+110
-10
lines changed

Diff for: lib/simplecov/exit_codes/maximum_coverage_drop_check.rb

+19-9
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,32 @@ def compute_coverage_drop_data
5151
{
5252
criterion: criterion,
5353
max_drop: percent,
54-
drop_percent: last_coverage(criterion) -
55-
SimpleCov.round_coverage(
56-
result.coverage_statistics.fetch(criterion).percent
57-
)
54+
drop_percent: drop_percent(criterion)
5855
}
5956
end
6057
end
6158

59+
# if anyone says "max_coverage_drop 0.000000000000000001" I appologize. Please don't.
60+
MAX_DROP_ACCURACY = 10
61+
def drop_percent(criterion)
62+
drop = last_coverage(criterion) -
63+
SimpleCov.round_coverage(
64+
result.coverage_statistics.fetch(criterion).percent
65+
)
66+
67+
# floats, I tell ya.
68+
# irb(main):001:0* 80.01 - 80.0
69+
# => 0.010000000000005116
70+
drop.floor(MAX_DROP_ACCURACY)
71+
end
72+
6273
def last_coverage(criterion)
6374
last_coverage_percent = last_run[:result][criterion]
6475

65-
if !last_coverage_percent && criterion == :line
66-
last_run[:result][:covered_percent]
67-
else
68-
last_coverage_percent
69-
end
76+
# fallback for old file format
77+
last_coverage_percent = last_run[:result][:covered_percent] if !last_coverage_percent && criterion == :line
78+
79+
last_coverage_percent || 0
7080
end
7181
end
7282
end

Diff for: spec/exit_codes/maximum_coverage_drop_check_spec.rb

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# frozen_string_literal: true
2+
3+
require "helper"
4+
5+
RSpec.describe SimpleCov::ExitCodes::MaximumCoverageDropCheck do
6+
let(:result) do
7+
instance_double(SimpleCov::Result, coverage_statistics: stats)
8+
end
9+
let(:stats) do
10+
{
11+
line: SimpleCov::CoverageStatistics.new(covered: 8, missed: 2),
12+
branch: SimpleCov::CoverageStatistics.new(covered: 8, missed: 2)
13+
}
14+
end
15+
let(:last_run) do
16+
{
17+
result: last_coverage
18+
}
19+
end
20+
let(:last_coverage) { {line: 80.0, branch: 80.0} }
21+
let(:maximum_coverage_drop) { {line: 0, branch: 0} }
22+
subject { described_class.new(result, maximum_coverage_drop) }
23+
24+
before :each do
25+
expect(SimpleCov::LastRun).to receive(:read).and_return(last_run)
26+
end
27+
28+
context "we're at the same coverage" do
29+
it { is_expected.not_to be_failing }
30+
end
31+
32+
context "more coverage drop allowed" do
33+
let(:maximum_coverage_drop) { {line: 10, branch: 10} }
34+
35+
it { is_expected.not_to be_failing }
36+
end
37+
38+
context "last coverage lower then new coverage" do
39+
let(:last_coverage) { {line: 70.0, branch: 70.0} }
40+
41+
it { is_expected.not_to be_failing }
42+
end
43+
44+
context "last coverage higher than new coverage" do
45+
let(:last_coverage) { {line: 80.01, branch: 80.01} }
46+
47+
it { is_expected.to be_failing }
48+
49+
context "but allowed drop is within range" do
50+
let(:maximum_coverage_drop) { {line: 0.01, branch: 0.01} }
51+
52+
it { is_expected.not_to be_failing }
53+
end
54+
end
55+
56+
context "one coverage lower than maximum drop" do
57+
let(:last_coverage) { {line: 80.01, branch: 70.0} }
58+
59+
it { is_expected.to be_failing }
60+
61+
context "but allowed drop is within range" do
62+
let(:maximum_coverage_drop) { {line: 0.01} }
63+
64+
it { is_expected.not_to be_failing }
65+
end
66+
end
67+
68+
context "coverage expectation for a coverage that wasn't previously present" do
69+
let(:last_coverage) { {line: 80.0} }
70+
let(:maximum_coverage_drop) { {line: 0, branch: 0} }
71+
72+
it { is_expected.not_to be_failing }
73+
end
74+
75+
context "no last run coverage information" do
76+
let(:last_run) { nil }
77+
78+
it { is_expected.not_to be_failing }
79+
end
80+
81+
context "old last_run.json format" do
82+
let(:last_run) do
83+
{
84+
# this format only considers line coverage
85+
result: {covered_percent: 80.0}
86+
}
87+
end
88+
89+
it { is_expected.not_to be_failing }
90+
end
91+
end

Diff for: spec/exit_codes/minimum_coverage_by_file_check_spec.rb

-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
let(:minimum_coverage_by_file) { {line: 90} }
2727

2828
it "fails" do
29-
p minimum_coverage_by_file
3029
expect(subject).to be_failing
3130
end
3231
end

0 commit comments

Comments
 (0)