Skip to content

Commit 092ac4f

Browse files
add ability to compare total coverage number against new total_delta (anuraag016#36)
Co-authored-by: Eric Alas <alas.eric@gmail.com>
1 parent 2e0d638 commit 092ac4f

File tree

4 files changed

+148
-7
lines changed

4 files changed

+148
-7
lines changed

__tests__/DiffChecker.test.ts

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {DiffChecker} from '../src/DiffChecker'
1+
import { DiffChecker } from '../src/DiffChecker'
22

33
describe('DiffChecker', () => {
44
const mock100Coverage = {
@@ -13,6 +13,12 @@ describe('DiffChecker', () => {
1313
skipped: 1,
1414
pct: 99
1515
}
16+
const mock98Coverage = {
17+
total: 100,
18+
covered: 98,
19+
skipped: 1,
20+
pct: 98
21+
}
1622
const mockEmptyCoverage = {
1723
total: 100,
1824
covered: 0,
@@ -31,6 +37,12 @@ describe('DiffChecker', () => {
3137
functions: mock100Coverage,
3238
lines: mock100Coverage
3339
}
40+
const mock98CoverageFile = {
41+
statements: mock98Coverage,
42+
branches: mock98Coverage,
43+
functions: mock98Coverage,
44+
lines: mock98Coverage
45+
}
3446
const mockEmptyCoverageFile = {
3547
statements: mockEmptyCoverage,
3648
branches: mockEmptyCoverage,
@@ -65,4 +77,118 @@ describe('DiffChecker', () => {
6577
' :x: | ~~file4~~ | ~~100~~ | ~~100~~ | ~~100~~ | ~~100~~'
6678
])
6779
})
80+
describe("testing checkIfTestCoverageFallsBelowDelta", () => {
81+
describe("respects total_delta for total and delta for other files", () => {
82+
it("returns true because delta diff is too high, even if total_delta is okay", () => {
83+
const codeCoverageOld = {
84+
total: mock100CoverageFile,
85+
file1: mock100CoverageFile
86+
}
87+
const codeCoverageNew = {
88+
total: mock98CoverageFile,
89+
file1: mock98CoverageFile
90+
}
91+
const diffChecker = new DiffChecker(codeCoverageNew, codeCoverageOld)
92+
const isTestCoverageFallsBelowDelta = diffChecker.checkIfTestCoverageFallsBelowDelta(1, 50)
93+
expect(isTestCoverageFallsBelowDelta).toBeTruthy();
94+
})
95+
it("returns true because total_delta diff is too high, even if delta is okay", () => {
96+
const codeCoverageOld = {
97+
total: mock100CoverageFile,
98+
file1: mock100CoverageFile
99+
}
100+
const codeCoverageNew = {
101+
total: mock98CoverageFile,
102+
file1: mock98CoverageFile
103+
}
104+
const diffChecker = new DiffChecker(codeCoverageNew, codeCoverageOld)
105+
const isTestCoverageFallsBelowDelta = diffChecker.checkIfTestCoverageFallsBelowDelta(50, 1)
106+
expect(isTestCoverageFallsBelowDelta).toBeTruthy();
107+
})
108+
it("returns true if delta diff is too high - total_delta is not defined", () => {
109+
const codeCoverageOld = {
110+
total: mock100CoverageFile,
111+
file1: mock100CoverageFile
112+
}
113+
const codeCoverageNew = {
114+
total: mock98CoverageFile,
115+
file1: mock98CoverageFile
116+
}
117+
const diffChecker = new DiffChecker(codeCoverageNew, codeCoverageOld)
118+
const isTestCoverageFallsBelowDelta = diffChecker.checkIfTestCoverageFallsBelowDelta(1, null)
119+
expect(isTestCoverageFallsBelowDelta).toBeTruthy();
120+
})
121+
it("returns false if total_delta and delta are okay", () => {
122+
const codeCoverageOld = {
123+
total: mock100CoverageFile,
124+
file1: mock100CoverageFile
125+
}
126+
const codeCoverageNew = {
127+
total: mock98CoverageFile,
128+
file1: mock98CoverageFile
129+
}
130+
const diffChecker = new DiffChecker(codeCoverageNew, codeCoverageOld)
131+
const isTestCoverageFallsBelowDelta = diffChecker.checkIfTestCoverageFallsBelowDelta(50, 50)
132+
expect(isTestCoverageFallsBelowDelta).toBeFalsy();
133+
})
134+
it("returns false if delta is okay - total_delta is not defined", () => {
135+
const codeCoverageOld = {
136+
total: mock100CoverageFile,
137+
file1: mock100CoverageFile
138+
}
139+
const codeCoverageNew = {
140+
total: mock98CoverageFile,
141+
file1: mock98CoverageFile
142+
}
143+
const diffChecker = new DiffChecker(codeCoverageNew, codeCoverageOld)
144+
const isTestCoverageFallsBelowDelta = diffChecker.checkIfTestCoverageFallsBelowDelta(50, null)
145+
expect(isTestCoverageFallsBelowDelta).toBeFalsy();
146+
})
147+
})
148+
it("detects that total coverage dropped below total_delta", () => {
149+
const codeCoverageOld = {
150+
total: mock100CoverageFile,
151+
}
152+
const codeCoverageNew = {
153+
total: mock98CoverageFile,
154+
}
155+
const diffChecker = new DiffChecker(codeCoverageNew, codeCoverageOld)
156+
const isTestCoverageFallsBelowDelta = diffChecker.checkIfTestCoverageFallsBelowDelta(2, 1)
157+
expect(isTestCoverageFallsBelowDelta).toBeTruthy();
158+
})
159+
it("detects that total coverage did not drop below total_delta", () => {
160+
const codeCoverageOld = {
161+
total: mock100CoverageFile,
162+
}
163+
const codeCoverageNew = {
164+
total: mock98CoverageFile,
165+
}
166+
const diffChecker = new DiffChecker(codeCoverageNew, codeCoverageOld)
167+
const isTestCoverageFallsBelowDelta = diffChecker.checkIfTestCoverageFallsBelowDelta(1, 5)
168+
expect(isTestCoverageFallsBelowDelta).toBeFalsy();
169+
})
170+
it("detects that total coverage dropped below delta", () => {
171+
const codeCoverageOld = {
172+
total: mock100CoverageFile,
173+
}
174+
const codeCoverageNew = {
175+
total: mock98CoverageFile,
176+
}
177+
const diffChecker = new DiffChecker(codeCoverageNew, codeCoverageOld)
178+
const isTestCoverageFallsBelowDelta = diffChecker.checkIfTestCoverageFallsBelowDelta(1, null)
179+
expect(isTestCoverageFallsBelowDelta).toBeTruthy();
180+
})
181+
it("detects that total coverage did not drop below delta", () => {
182+
const codeCoverageOld = {
183+
total: mock100CoverageFile,
184+
}
185+
const codeCoverageNew = {
186+
total: mock98CoverageFile,
187+
}
188+
const diffChecker = new DiffChecker(codeCoverageNew, codeCoverageOld)
189+
const isTestCoverageFallsBelowDelta = diffChecker.checkIfTestCoverageFallsBelowDelta(2, null)
190+
expect(isTestCoverageFallsBelowDelta).toBeFalsy();
191+
})
192+
193+
})
68194
})

action.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ inputs:
1717
delta:
1818
description: 'Difference between the old and final test coverage'
1919
default: 100
20+
total_delta:
21+
description: 'Difference between the old and final test coverage at the total level'
22+
default: null
2023
useSameComment:
2124
description: 'While commenting on the PR update the exisiting comment'
2225
default: false

src/DiffChecker.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,13 @@ export class DiffChecker {
6767
return returnStrings
6868
}
6969

70-
checkIfTestCoverageFallsBelowDelta(delta: number): boolean {
71-
const keys = Object.keys(this.diffCoverageReport)
72-
for (const key of keys) {
73-
const diffCoverageData = this.diffCoverageReport[key]
70+
checkIfTestCoverageFallsBelowDelta(
71+
delta: number,
72+
totalDelta: number | null
73+
): boolean {
74+
const files = Object.keys(this.diffCoverageReport)
75+
for (const file of files) {
76+
const diffCoverageData = this.diffCoverageReport[file]
7477
const keys: ('lines' | 'statements' | 'branches' | 'functions')[] = <
7578
('lines' | 'statements' | 'branches' | 'functions')[]
7679
>Object.keys(diffCoverageData)
@@ -84,7 +87,11 @@ export class DiffChecker {
8487
}
8588
for (const key of keys) {
8689
if (diffCoverageData[key].oldPct !== diffCoverageData[key].newPct) {
87-
if (-this.getPercentageDiff(diffCoverageData[key]) > delta) {
90+
const deltaToCompareWith =
91+
file === 'total' && totalDelta !== null ? totalDelta : delta
92+
if (
93+
-this.getPercentageDiff(diffCoverageData[key]) > deltaToCompareWith
94+
) {
8895
return true
8996
}
9097
}

src/main.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,18 @@ async function run(): Promise<void> {
1818
const commandToRun = core.getInput('runCommand')
1919
const commandAfterSwitch = core.getInput('afterSwitchCommand')
2020
const delta = Number(core.getInput('delta'))
21+
const rawTotalDelta = core.getInput('total_delta')
2122
const githubClient = github.getOctokit(githubToken)
2223
const prNumber = github.context.issue.number
2324
const branchNameBase = github.context.payload.pull_request?.base.ref
2425
const branchNameHead = github.context.payload.pull_request?.head.ref
2526
const useSameComment = JSON.parse(core.getInput('useSameComment'))
2627
const commentIdentifier = `<!-- codeCoverageDiffComment -->`
2728
const deltaCommentIdentifier = `<!-- codeCoverageDeltaComment -->`
29+
let totalDelta = null
30+
if (rawTotalDelta !== null) {
31+
totalDelta = Number(rawTotalDelta)
32+
}
2833
let commentId = null
2934
execSync(commandToRun)
3035
const codeCoverageNew = <CoverageReport>(
@@ -81,7 +86,7 @@ async function run(): Promise<void> {
8186
)
8287

8388
// check if the test coverage is falling below delta/tolerance.
84-
if (diffChecker.checkIfTestCoverageFallsBelowDelta(delta)) {
89+
if (diffChecker.checkIfTestCoverageFallsBelowDelta(delta, totalDelta)) {
8590
if (useSameComment) {
8691
commentId = await findComment(
8792
githubClient,

0 commit comments

Comments
 (0)