Skip to content

Commit db2c140

Browse files
committed
Use deployResult.json as an input
1 parent db2ff4b commit db2c140

File tree

2 files changed

+49
-25
lines changed

2 files changed

+49
-25
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "sfdx-notify",
3-
"version": "0.0.14",
3+
"version": "0.0.15",
44
"author": "Gil Avignon",
55
"bugs": "https://github.com/gavignon/sfdx-notify/issues",
66
"dependencies": {

src/commands/notify/tests/teams.ts

+48-24
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,18 @@ export default class Teams extends SfdxCommand {
4545
let coverageHeader = '"Apex Class"' + this.flags.separator + '"Coverage (%)"\n';
4646

4747
for(let test of failedTests){
48-
failCsvContent += '"' + test.FullName + '"' + this.flags.separator + '"' + test.Message + '\n' + test.StackTrace + '"\n';
48+
failCsvContent += '"' + test.name + '"' + this.flags.separator + '"' + test.message + '\n' + test.stackTrace + '"\n';
4949
}
5050

5151
await writeFile(failTestCsvPath, failCsvContent);
5252

5353
let goodCoverageContent = coverageHeader;
5454
let badCoverageContent = coverageHeader;
5555
for(let coverage of coverageData){
56-
if(coverage.coveredPercent >= 85){
57-
goodCoverageContent += '"' + coverage.name + '"' + this.flags.separator + '"' + coverage.coveredPercent + '"\n';
56+
if(coverage.coverage >= 85){
57+
goodCoverageContent += '"' + coverage.name + '"' + this.flags.separator + '"' + coverage.coverage + '"\n';
5858
}else{
59-
badCoverageContent += '"' + coverage.name + '"' + this.flags.separator + '"' + coverage.coveredPercent + '"\n';
59+
badCoverageContent += '"' + coverage.name + '"' + this.flags.separator + '"' + coverage.coverage + '"\n';
6060
}
6161
}
6262
await writeFile(goodCoverageFilePath, goodCoverageContent);
@@ -124,40 +124,64 @@ export default class Teams extends SfdxCommand {
124124
let fileContent = await readFile(this.flags.path);
125125
let testResult = JSON.parse(fileContent);
126126

127-
let statusColor = testResult.result.summary.outcome == 'Passed' ? 'green' : 'red';
128-
let summaryTitle = 'Test Execution in ' + this.flags.env + ' - ' + testResult.result.summary.testStartTime;
129-
let summaryContent = '<strong>TestRunId: </strong>' + testResult.result.summary.testRunId + ' (Execution Time: ' + this.formatMilliseconds(testResult.result.summary.testExecutionTime.replace(' ms','')) + ')'
130-
+ '\n\n' + '<strong>Status: </strong><span style="color:' + statusColor + ';">' + testResult.result.summary.outcome + '</span>'
131-
+ '\n\n' + '<strong>Coverage: </strong>' + testResult.result.summary.testRunCoverage + ' (Test Run Coverage) ' + testResult.result.summary.orgWideCoverage + ' (Org Wide Coverage)'
132-
+ '\n\n' + '<strong>Tests Ran: </strong>' + testResult.result.summary.testsRan
133-
+ '\n\n' + '<strong>Tests Passed: </strong>' + testResult.result.summary.passing + ' (' + testResult.result.summary.passRate + ')'
134-
+ '\n\n' + '<strong>Tests Failed: </strong>' + testResult.result.summary.failing + ' (' + testResult.result.summary.failRate + ')';
135-
136-
let failedTests = new Array();
137-
let coverageApexClasses = testResult.result.coverage.coverage;
138-
139-
for(let test of testResult.result.tests){
140-
if(test.Outcome == 'Fail' || test.Outcome == 'CompileFail'){
127+
let failedTests = new Array();
128+
let coverageApexClasses = new Array();
129+
130+
// Calculate Code Coverage
131+
this.ux.startSpinner('Calculate code coverage');
132+
let globalNumLines = 0;
133+
let globalNumLinesNotCovered = 0;
134+
let mapCoverageByClass = new Map<string, number>();
135+
for(let codeCoverageObj of testResult.result.details.runTestResult.codeCoverage){
136+
globalNumLines += codeCoverageObj.numLocations;
137+
globalNumLinesNotCovered += codeCoverageObj.numLocationsNotCovered;
138+
139+
let currentCoverage = Math.round((1 - (codeCoverageObj.numLocationsNotCovered / codeCoverageObj.numLocations)) * 100);
140+
mapCoverageByClass.set(codeCoverageObj.name, currentCoverage);
141+
142+
let currentClass = {
143+
name: codeCoverageObj.name,
144+
coverage: currentCoverage
145+
};
146+
coverageApexClasses.push(currentClass);
147+
}
148+
let globalCoverage = Math.round((1 - (globalNumLinesNotCovered / globalNumLines)) * 100);
149+
this.ux.stopSpinner('done');
150+
151+
// Generate Global information
152+
let status = testResult.result.numberTestErrors > 0 ? 'Failed' : 'Passed';
153+
let statusColor = status == 'Passed' ? 'green' : 'red';
154+
let summaryTitle = 'Test Execution in ' + this.flags.env + ' - ' + testResult.result.startDate;
155+
let summaryContent = '<strong>TestRunId: </strong>' + testResult.result.id + ' (Execution Time: ' + this.formatMilliseconds(testResult.result.details.runTestResult.totalTime) + ')'
156+
+ '\n\n' + '<strong>Status: </strong><span style="color:' + statusColor + ';">' + status + '</span>'
157+
+ '\n\n' + '<strong>Code Coverage: </strong>' + globalCoverage + '%'
158+
+ '\n\n' + '<strong>Tests Ran: </strong>' + testResult.result.numberTestsTotal
159+
+ '\n\n' + '<strong>Tests Passed: </strong>' + testResult.result.numberTestsCompleted
160+
+ '\n\n' + '<strong>Tests Failed: </strong>' + testResult.result.numberTestErrors;
161+
162+
163+
164+
for(let test of testResult.result.details.runTestResult.failures){
165+
test.coverage = mapCoverageByClass.get(test.name);
141166
failedTests.push(test);
142-
}
143167
}
144168

145169
// Create files
146170
this.ux.startSpinner('Generate coverage files');
147171

148172
// Sort
149173
failedTests.sort((obj1, obj2) => {
150-
if (obj1.FullName > obj2.FullName) {
174+
if (obj1.name > obj2.name) {
151175
return 1;
152-
}if (obj1.FullName < obj2.FullName) {
176+
}if (obj1.name < obj2.name) {
153177
return -1;
154178
}
155179
return 0;
156180
});
157181
coverageApexClasses.sort((obj1, obj2) => {
158-
if (obj1.FullName > obj2.FullName) {
182+
if (obj1.name > obj2.name) {
159183
return 1;
160-
}if (obj1.FullName < obj2.FullName) {
184+
}if (obj1.name < obj2.name) {
161185
return -1;
162186
}
163187
return 0;
@@ -178,7 +202,7 @@ export default class Teams extends SfdxCommand {
178202
break;
179203
}
180204
}
181-
this.ux.stopSpinner('Done!');
205+
this.ux.stopSpinner('done');
182206

183207
// Generate URLs
184208
let failedTestsUrl = this.flags.hosturl.toString().concat(failTestFilePath);

0 commit comments

Comments
 (0)