77import * as os from 'os' ;
88import { ux } from '@oclif/core' ;
99import { dim , underline } from 'chalk' ;
10- import { CodeCoverageWarnings , DeployResult , Failures , Successes } from '@salesforce/source-deploy-retrieve' ;
10+ import {
11+ CodeCoverage ,
12+ CodeCoverageWarnings ,
13+ DeployResult ,
14+ Failures ,
15+ MetadataApiDeployStatus ,
16+ RunTestResult ,
17+ Successes ,
18+ } from '@salesforce/source-deploy-retrieve' ;
1119import { ensureArray } from '@salesforce/kit' ;
1220import { TestLevel , Verbosity } from '../utils/types' ;
1321import { tableHeader , error , success , check } from '../utils/output' ;
@@ -34,11 +42,11 @@ export class TestResultsFormatter {
3442 return ;
3543 }
3644
37- this . displayVerboseTestFailures ( ) ;
45+ displayVerboseTestFailures ( this . result . response ) ;
3846
3947 if ( this . verbosity === 'verbose' ) {
40- this . displayVerboseTestSuccesses ( ) ;
41- this . displayVerboseTestCoverage ( ) ;
48+ displayVerboseTestSuccesses ( this . result . response . details . runTestResult ?. successes ) ;
49+ displayVerboseTestCoverage ( this . result . response . details . runTestResult ?. codeCoverage ) ;
4250 }
4351
4452 ux . log ( ) ;
@@ -59,60 +67,58 @@ export class TestResultsFormatter {
5967 if ( this . flags . verbose ) return 'verbose' ;
6068 return 'normal' ;
6169 }
70+ }
6271
63- private displayVerboseTestCoverage ( ) : void {
64- const codeCoverage = ensureArray ( this . result . response . details . runTestResult ?. codeCoverage ) ;
65- if ( codeCoverage . length ) {
66- const coverage = codeCoverage . sort ( ( a , b ) => ( a . name . toUpperCase ( ) > b . name . toUpperCase ( ) ? 1 : - 1 ) ) ;
67- ux . log ( ) ;
68- ux . log ( tableHeader ( 'Apex Code Coverage' ) ) ;
69-
70- ux . table ( coverage . map ( coverageOutput ) , {
71- name : { header : 'Name' } ,
72- numLocations : { header : '% Covered' } ,
73- lineNotCovered : { header : 'Uncovered Lines' } ,
74- } ) ;
72+ const displayVerboseTestSuccesses = ( resultSuccesses : RunTestResult [ 'successes' ] ) : void => {
73+ const successes = ensureArray ( resultSuccesses ) . sort ( testResultSort ) ;
74+ if ( successes . length > 0 ) {
75+ ux . log ( ) ;
76+ ux . log ( success ( `Test Success [${ successes . length } ]` ) ) ;
77+ for ( const test of successes ) {
78+ const testName = underline ( `${ test . name } .${ test . methodName } ` ) ;
79+ ux . log ( `${ check } ${ testName } ` ) ;
7580 }
7681 }
82+ } ;
7783
78- private displayVerboseTestSuccesses ( ) : void {
79- const successes = ensureArray ( this . result . response . details . runTestResult ?. successes ) ;
80- if ( successes . length > 0 ) {
81- const testSuccesses = sortTestResults ( successes ) ;
82- ux . log ( ) ;
83- ux . log ( success ( `Test Success [${ successes . length } ]` ) ) ;
84- for ( const test of testSuccesses ) {
85- const testName = underline ( `${ test . name } .${ test . methodName } ` ) ;
86- ux . log ( `${ check } ${ testName } ` ) ;
87- }
84+ /** display the Test failures if there are any testErrors in the mdapi deploy response */
85+ const displayVerboseTestFailures = ( response : MetadataApiDeployStatus ) : void => {
86+ if ( ! response . numberTestErrors ) return ;
87+ const failures = ensureArray ( response . details . runTestResult ?. failures ) . sort ( testResultSort ) ;
88+ const failureCount = response . details . runTestResult ?. numFailures ;
89+ ux . log ( ) ;
90+ ux . log ( error ( `Test Failures [${ failureCount } ]` ) ) ;
91+ for ( const test of failures ) {
92+ const testName = underline ( `${ test . name } .${ test . methodName } ` ) ;
93+ ux . log ( `• ${ testName } ` ) ;
94+ ux . log ( ` ${ dim ( 'message' ) } : ${ test . message } ` ) ;
95+ if ( test . stackTrace ) {
96+ const stackTrace = test . stackTrace . replace ( / \n / g, `${ os . EOL } ` ) ;
97+ ux . log ( ` ${ dim ( 'stacktrace' ) } : ${ os . EOL } ${ stackTrace } ` ) ;
8898 }
99+ ux . log ( ) ;
89100 }
101+ } ;
90102
91- private displayVerboseTestFailures ( ) : void {
92- if ( ! this . result . response . numberTestErrors ) return ;
93- const failures = ensureArray ( this . result . response . details . runTestResult ?. failures ) ;
94- const failureCount = this . result . response . details . runTestResult ?. numFailures ;
95- const testFailures = sortTestResults ( failures ) ;
103+ /**
104+ * Display the table if there is at least one coverage item in the result
105+ */
106+ const displayVerboseTestCoverage = ( coverage ?: CodeCoverage | CodeCoverage [ ] ) : void => {
107+ const codeCoverage = ensureArray ( coverage ) ;
108+ if ( codeCoverage . length ) {
96109 ux . log ( ) ;
97- ux . log ( error ( `Test Failures [${ failureCount } ]` ) ) ;
98- for ( const test of testFailures ) {
99- const testName = underline ( `${ test . name } .${ test . methodName } ` ) ;
100- ux . log ( `• ${ testName } ` ) ;
101- ux . log ( ` ${ dim ( 'message' ) } : ${ test . message } ` ) ;
102- if ( test . stackTrace ) {
103- const stackTrace = test . stackTrace . replace ( / \n / g, `${ os . EOL } ` ) ;
104- ux . log ( ` ${ dim ( 'stacktrace' ) } : ${ os . EOL } ${ stackTrace } ` ) ;
105- }
106- ux . log ( ) ;
107- }
110+ ux . log ( tableHeader ( 'Apex Code Coverage' ) ) ;
111+
112+ ux . table ( codeCoverage . sort ( coverageSort ) . map ( coverageOutput ) , {
113+ name : { header : 'Name' } ,
114+ coveragePercent : { header : '% Covered' } ,
115+ linesNotCovered : { header : 'Uncovered Lines' } ,
116+ } ) ;
108117 }
109- }
118+ } ;
110119
111- function sortTestResults < T extends Failures | Successes > ( results : T [ ] ) : T [ ] {
112- return results . sort ( ( a , b ) => {
113- if ( a . methodName === b . methodName ) {
114- return a . name . localeCompare ( b . name ) ;
115- }
116- return a . methodName . localeCompare ( b . methodName ) ;
117- } ) ;
118- }
120+ const testResultSort = < T extends Successes | Failures > ( a : T , b : T ) : number =>
121+ a . methodName === b . methodName ? a . name . localeCompare ( b . name ) : a . methodName . localeCompare ( b . methodName ) ;
122+
123+ const coverageSort = ( a : CodeCoverage , b : CodeCoverage ) : number =>
124+ a . name . toUpperCase ( ) > b . name . toUpperCase ( ) ? 1 : - 1 ;
0 commit comments