diff --git a/packages/bruno-cli/src/reporters/junit.js b/packages/bruno-cli/src/reporters/junit.js index aa2b0eb2e..6f73b3214 100644 --- a/packages/bruno-cli/src/reporters/junit.js +++ b/packages/bruno-cli/src/reporters/junit.js @@ -11,8 +11,10 @@ const makeJUnitOutput = async (results, outputPath) => { results.forEach((result) => { const assertionTestCount = result.assertionResults ? result.assertionResults.length : 0; + const preRequestTestCount = result.preRequestTestResults ? result.preRequestTestResults.length : 0; const testCount = result.testResults ? result.testResults.length : 0; - const totalTests = assertionTestCount + testCount; + const postResponseTestCount = result.postResponseTestResults ? result.postResponseTestResults.length : 0; + const totalTests = assertionTestCount + preRequestTestCount + testCount + postResponseTestCount; const suite = { '@name': result.name, @@ -44,6 +46,24 @@ const makeJUnitOutput = async (results, outputPath) => { suite.testcase.push(testcase); }); + result.preRequestTestResults + && result.preRequestTestResults.forEach((test) => { + const testcase = { + '@name': test.description, + '@status': test.status, + '@classname': result.request.url, + '@time': (result.runtime / totalTests).toFixed(3) + }; + + if (test.status === 'fail') { + suite['@failures']++; + + testcase.failure = [{ '@type': 'failure', '@message': test.error }]; + } + + suite.testcase.push(testcase); + }); + result.testResults && result.testResults.forEach((test) => { const testcase = { @@ -62,6 +82,24 @@ const makeJUnitOutput = async (results, outputPath) => { suite.testcase.push(testcase); }); + result.postResponseTestResults + && result.postResponseTestResults.forEach((test) => { + const testcase = { + '@name': test.description, + '@status': test.status, + '@classname': result.request.url, + '@time': (result.runtime / totalTests).toFixed(3) + }; + + if (test.status === 'fail') { + suite['@failures']++; + + testcase.failure = [{ '@type': 'failure', '@message': test.error }]; + } + + suite.testcase.push(testcase); + }); + if (result?.skipped) { suite['@skipped'] = 1; } else if (result.error) { diff --git a/packages/bruno-cli/tests/reporters/junit.spec.js b/packages/bruno-cli/tests/reporters/junit.spec.js index f29bc0340..51183e6fa 100644 --- a/packages/bruno-cli/tests/reporters/junit.spec.js +++ b/packages/bruno-cli/tests/reporters/junit.spec.js @@ -132,4 +132,69 @@ describe('makeJUnitOutput', () => { expect(failcase.error[0]['@type']).toBe('error'); expect(failcase.error[0]['@message']).toBe('timeout of 2000ms exceeded'); }); + + it('should include preRequestTestResults and postResponseTestResults in the junit output', () => { + const results = [ + { + name: 'Tests/Suite A', + request: { + method: 'GET', + url: 'https://ima.test' + }, + preRequestTestResults: [ + { + description: 'A test from Pre Request Script', + status: 'pass' + } + ], + testResults: [ + { + description: 'A test from Tests tab', + status: 'pass' + } + ], + postResponseTestResults: [ + { + description: 'A test from Post Response Script', + status: 'pass' + }, + { + description: 'A failing test from Post Response Script', + status: 'fail', + error: 'expected 200 to equal 404' + } + ], + runtime: 1.2345678 + } + ]; + + makeJUnitOutput(results, '/tmp/testfile.xml'); + expect(createStub).toBeCalled; + + const junit = xmlbuilder.create.mock.calls[0][0]; + + expect(junit.testsuites).toBeDefined; + expect(junit.testsuites.testsuite.length).toBe(1); + expect(junit.testsuites.testsuite[0].testcase.length).toBe(4); + expect(junit.testsuites.testsuite[0]['@tests']).toBe(4); + + const testcase1 = junit.testsuites.testsuite[0].testcase[0]; + expect(testcase1['@name']).toBe('A test from Pre Request Script'); + expect(testcase1['@status']).toBe('pass'); + + const testcase2 = junit.testsuites.testsuite[0].testcase[1]; + expect(testcase2['@name']).toBe('A test from Tests tab'); + expect(testcase2['@status']).toBe('pass'); + + const testcase3 = junit.testsuites.testsuite[0].testcase[2]; + expect(testcase3['@name']).toBe('A test from Post Response Script'); + expect(testcase3['@status']).toBe('pass'); + + const failcase = junit.testsuites.testsuite[0].testcase[3]; + expect(failcase['@name']).toBe('A failing test from Post Response Script'); + expect(failcase['@status']).toBe('fail'); + expect(failcase.failure).toBeDefined; + expect(failcase.failure[0]['@type']).toBe('failure'); + expect(failcase.failure[0]['@message']).toBe('expected 200 to equal 404'); + }); });