UNPKG

protractor-junit-flake

Version:

A wrapper for protractor to automatically re-run failed tests for a specific number of attempts

81 lines (74 loc) 2.85 kB
import fs from 'fs' import glob from 'glob' import path from 'path' import _ from 'lodash' import { parseString as parseXml, Builder } from 'xml2js' // We leave results of last run as they are except copying over the files with new name export function processLastRunResults (filePattern, testAttempt) { var cwd = process.cwd() var files = glob.sync(filePattern, { cwd: cwd }) files.forEach((file) => { var resolvedPath = path.resolve(cwd, file) var resultDir = path.dirname(resolvedPath) var resultFileName = path.basename(resolvedPath) var processedResultsFile = path.resolve(resultDir, `flake-${resultFileName}`) var fileExists = fs.existsSync(processedResultsFile) if (fileExists) { console.log(`${resolvedPath} already read since ${processedResultsFile} exists\n`) // For sanity of results, we need to process it instead resolvedPath = processedResultsFile } else { console.log(`Copying ${resolvedPath} to ${processedResultsFile} for last attempt\n`) fs.copyFileSync(resolvedPath, processedResultsFile) } }) } export function processResults (filePattern, testAttempt) { var cwd = process.cwd() var files = glob.sync(filePattern, { cwd: cwd }) return files.reduce((specNames, file) => { var resolvedPath = path.resolve(cwd, file) var resultDir = path.dirname(resolvedPath) var resultFileName = path.basename(resolvedPath) var processedResultsFile = path.resolve(resultDir, `flake-${resultFileName}`) var fileExists = fs.existsSync(processedResultsFile) if (fileExists) { console.log(`${resolvedPath} already read since ${processedResultsFile} exists\n`) // For sanity of results, we need to process it instead resolvedPath = processedResultsFile } else { console.log('Parsing file ', resolvedPath, '\n') } var fileContents = fs.readFileSync(resolvedPath) try { parseXml(fileContents, (err, result) => { if (err) { console.log('Found parsing errors: ', err, '\n') return } let suites = _.castArray(result.testsuites.testsuite) suites.forEach(suite => { if (!suite.testcase) { return } let cases = _(suite.testcase) .castArray() .partition(caze => !!caze.failure) .value() suite.testcase = cases[1] let cazeNames = cases[0].map(caze => caze.$.name) if (cazeNames) { specNames.push(...cazeNames) } }) let builder = new Builder() let xml = builder.buildObject(result) // Do not clobber results file from protractor fs.writeFileSync(processedResultsFile, xml) }) } catch (err) { console.log('Errors parsing xml: ', err, '\n') } return specNames }, []) }