From 5f6ff8b4c2d7dc2c0dc7253d59d4a0c5fbc79359 Mon Sep 17 00:00:00 2001 From: Spencer Date: Fri, 8 Mar 2019 13:46:01 -0800 Subject: [PATCH] [jest/junit] fix junit reporter (#32686) Fixes https://github.com/elastic/kibana/issues/32619 With #31825 the reporter contract changed slightly and this updates our custom reporter to fix our junit reports. --- .../__fixtures__/package.json | 14 +++ .../integration_tests/__fixtures__/test.js | 22 +++++ .../integration_tests/junit_reporter.test.js | 94 +++++++++++++++++++ src/dev/jest/junit_reporter.js | 6 +- 4 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 src/dev/jest/integration_tests/__fixtures__/package.json create mode 100644 src/dev/jest/integration_tests/__fixtures__/test.js create mode 100644 src/dev/jest/integration_tests/junit_reporter.test.js diff --git a/src/dev/jest/integration_tests/__fixtures__/package.json b/src/dev/jest/integration_tests/__fixtures__/package.json new file mode 100644 index 0000000000000..1a9a446d524bc --- /dev/null +++ b/src/dev/jest/integration_tests/__fixtures__/package.json @@ -0,0 +1,14 @@ +{ + "name": "fixture", + "jest": { + "testMatch": [ + "**/test.js" + ], + "transform": { + "^.+\\.js$": "/../../babel_transform.js" + }, + "reporters": [ + ["/../../junit_reporter.js", {"rootDirectory": "."}] + ] + } +} diff --git a/src/dev/jest/integration_tests/__fixtures__/test.js b/src/dev/jest/integration_tests/__fixtures__/test.js new file mode 100644 index 0000000000000..fe0c65fd45b74 --- /dev/null +++ b/src/dev/jest/integration_tests/__fixtures__/test.js @@ -0,0 +1,22 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +it('fails', () => { + throw new Error('failure'); +}); diff --git a/src/dev/jest/integration_tests/junit_reporter.test.js b/src/dev/jest/integration_tests/junit_reporter.test.js new file mode 100644 index 0000000000000..47618ce0fe70c --- /dev/null +++ b/src/dev/jest/integration_tests/junit_reporter.test.js @@ -0,0 +1,94 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { resolve } from 'path'; +import { promisify } from 'util'; +import { readFileSync } from 'fs'; + +import del from 'del'; +import execa from 'execa'; +import xml2js from 'xml2js'; + +const MINUTE = 1000 * 60; +const ROOT_DIR = resolve(__dirname, '../../../../'); +const FIXTURE_DIR = resolve(__dirname, '__fixtures__'); +const TARGET_DIR = resolve(FIXTURE_DIR, 'target'); +const XML_PATH = resolve(TARGET_DIR, 'junit/TEST-Jest Tests.xml'); + +afterAll(async () => { + await del(TARGET_DIR); +}); + +const parseXml = promisify(xml2js.parseString); + +it( + 'produces a valid junit report for failures', + async () => { + const result = await execa( + process.execPath, + ['-r', require.resolve('../../../setup_node_env'), require.resolve('jest/bin/jest')], + { + cwd: FIXTURE_DIR, + env: { + CI: 'true', + }, + reject: false, + } + ); + + expect(result.code).toBe(1); + await expect(parseXml(readFileSync(XML_PATH, 'utf8'))).resolves.toEqual({ + testsuites: { + $: { + name: 'jest', + skipped: '0', + tests: '1', + time: expect.anything(), + timestamp: expect.anything(), + }, + testsuite: [ + { + $: { + failures: '1', + file: resolve(ROOT_DIR, 'src/dev/jest/integration_tests/__fixtures__/test.js'), + name: 'test.js', + skipped: '0', + tests: '1', + time: expect.anything(), + timestamp: expect.anything(), + }, + testcase: [ + { + $: { + classname: 'Jest Tests.ยท', + name: 'fails', + time: expect.anything() + }, + failure: [ + expect.stringMatching(/Error: failure\s+at /m) + ] + } + ] + } + ] + } + }); + }, + 3 * MINUTE +); diff --git a/src/dev/jest/junit_reporter.js b/src/dev/jest/junit_reporter.js index 9d05e1dabf59c..86b780bac9bfa 100644 --- a/src/dev/jest/junit_reporter.js +++ b/src/dev/jest/junit_reporter.js @@ -39,7 +39,7 @@ export default class JestJUnitReporter { } = options; this._reportName = reportName; - this._rootDirectory = rootDirectory; + this._rootDirectory = resolve(rootDirectory); } /** @@ -70,7 +70,7 @@ export default class JestJUnitReporter { timestamp: msToIso(results.startTime), time: msToSec(Date.now() - results.startTime), tests: results.numTotalTests, - failures: results.numFailedTests, + failures: results.numFailingTests, skipped: results.numPendingTests, }); @@ -81,7 +81,7 @@ export default class JestJUnitReporter { timestamp: msToIso(suite.perfStats.start), time: msToSec(suite.perfStats.end - suite.perfStats.start), tests: suite.testResults.length, - failures: suite.numFailedTests, + failures: suite.numFailingTests, skipped: suite.numPendingTests, file: suite.testFilePath });