split protractor configuration file (#4983)

This commit is contained in:
Eugenio Romano
2019-08-09 07:51:04 +01:00
committed by GitHub
parent ab2fc2fb15
commit dfbefa2ce5
6 changed files with 451 additions and 388 deletions

View File

@@ -0,0 +1,80 @@
'use strict';
Object.defineProperty(exports, '__esModule', {
value: true
});
exports.init = init;
exports.getSpecReferences = getSpecReferences;
exports.disableSpecs = disableSpecs;
var wrap = require('lodash.wrap');
var refs = undefined;
function init() {
refs = getSpecReferences();
return {
specDone: function specDone(result) {
if (result.status === 'failed') {
disableSpecs(refs);
}
}
};
}
/**
* Gather references to all jasmine specs and suites, through any (currently hacky) means possible.
*
* @return {Object} An object with `specs` and `suites` properties, arrays of respective types.
*/
function getSpecReferences() {
var specs = [];
var suites = [];
// Use specFilter to gather references to all specs.
jasmine.getEnv().specFilter = function (spec) {
specs.push(spec);
return true;
};
// Wrap jasmine's describe function to gather references to all suites.
jasmine.getEnv().describe = wrap(jasmine.getEnv().describe, function (describe) {
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
var suite = describe.apply(null, args);
suites.push(suite);
return suite;
});
return {
specs: specs,
suites: suites
};
}
/**
* Hacky workaround to facilitate "fail fast". Disable all specs (basically `xit`), then
* remove references to all before/after functions, else they'll still run. Disabling the
* suites themselves does not appear to have an effect.
*/
function disableSpecs() {
if (!refs) {
throw new Error('jasmine-fail-fast: Must call init() before calling disableSpecs()!');
}
refs.specs.forEach(function (spec) {
return spec.disable();
});
refs.suites.forEach(function (suite) {
suite.beforeFns = [];
suite.afterFns = [];
suite.beforeAllFns = [];
suite.afterAllFns = [];
});
}

View File

@@ -0,0 +1,112 @@
function beforeAllRewrite() {
const originalBeforeAll = global.beforeAll;
// tslint:disable-next-line
global.beforeAll = function (beforeAllFunction, timeout) {
const wrapClbk = async (done) => {
try {
await beforeAllFunction(done);
} catch (error) {
console.log('Error Before all second attempt in 10 sec');
sleep(10000);
try {
await beforeAllFunction(done);
} catch (e) {
// tslint:disable-next-line:no-console
console.log('Error Before all second attempt fail all' + JSON.stringify(error));
expect(true).toBe(false);
}
}
done();
return;
};
originalBeforeAll(wrapClbk, timeout);
};
};
function afterAllRewrite() {
const originalAfterAll = global.afterAll;
// tslint:disable-next-line
global.afterAll = function (afterAllFunction, timeout) {
const wrapClbk = async (done) => {
try {
await afterAllFunction(done);
} catch (error) {
// tslint:disable-next-line:no-console
console.log('Error After all' + JSON.stringify(error));
}
done();
return;
};
originalAfterAll(wrapClbk, timeout);
};
};
function beforeEachAllRewrite() {
const originalBeforeEach = global.beforeEach;
// tslint:disable-next-line
global.beforeEach = function (beforeEachFunction, timeout) {
const wrapClbk = async (done) => {
try {
await beforeEachFunction(done);
} catch (error) {
// tslint:disable-next-line:no-console
console.log('Error before Each' + JSON.stringify(error));
expect(true).toBe(false);
}
done();
return;
};
originalBeforeEach(wrapClbk, timeout);
};
};
function afterEachAllRewrite() {
const originalAfterEach = global.afterEach;
// tslint:disable-next-line
global.afterEach = function (afterEachFunction, timeout) {
const wrapClbk = async (done) => {
try {
await afterEachFunction(done);
} catch (error) {
// tslint:disable-next-line:no-console
console.log('Error After each' + JSON.stringify(error));
}
done();
return;
};
originalAfterEach(wrapClbk, timeout);
};
};
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay) ;
}
module.exports = {
beforeAllRewrite: beforeAllRewrite,
afterAllRewrite: afterAllRewrite,
beforeEachAllRewrite: beforeEachAllRewrite,
afterEachAllRewrite: afterEachAllRewrite
};

View File

@@ -0,0 +1,150 @@
const htmlReporter = require('protractor-html-reporter-2');
function buildNumber() {
let buildNumber = process.env.TRAVIS_BUILD_NUMBER;
if (!buildNumber) {
process.env.TRAVIS_BUILD_NUMBER = Date.now();
}
return process.env.TRAVIS_BUILD_NUMBER;
}
async function uploadScreenshot(alfrescoJsApi, retryCount) {
let files = fs.readdirSync(path.join(__dirname, './e2e-output/screenshots'));
if (files && files.length > 0) {
let folder;
try {
folder = await alfrescoJsApi.nodes.addNode('-my-', {
'name': `retry-${retryCount}`,
'relativePath': `Builds/${buildNumber()}/screenshot`,
'nodeType': 'cm:folder'
}, {}, {
'overwrite': true
});
} catch (error) {
folder = await alfrescoJsApi.nodes.getNode('-my-', {
'relativePath': `Builds/${buildNumber()}/screenshot/retry-${retryCount}`,
'nodeType': 'cm:folder'
}, {}, {
'overwrite': true
});
}
for (const fileName of files) {
let pathFile = path.join(__dirname, './e2e-output/screenshots', fileName);
let file = fs.createReadStream(pathFile);
let safeFileName = fileName.replace(new RegExp('"', 'g'), '');
try {
await alfrescoJsApi.upload.uploadFile(
file,
'',
folder.entry.id,
null,
{
'name': safeFileName,
'nodeType': 'cm:content',
'autoRename': true
}
);
} catch (error) {
console.log(error);
}
}
}
}
async function uploadReport(alfrescoJsApi, filenameReport) {
let pathFile = path.join(__dirname, './e2e-output/junit-report/html', filenameReport + '.html');
let reportFile = fs.createReadStream(pathFile);
let reportFolder;
try {
reportFolder = await alfrescoJsApi.nodes.addNode('-my-', {
'name': 'report',
'relativePath': `Builds/${buildNumber()}`,
'nodeType': 'cm:folder'
}, {}, {
'overwrite': true
});
} catch (error) {
reportFolder = await alfrescoJsApi.nodes.getNode('-my-', {
'relativePath': `Builds/${buildNumber()}/report`,
'nodeType': 'cm:folder'
}, {}, {
'overwrite': true
});
}
try {
await alfrescoJsApi.upload.uploadFile(
reportFile,
'',
reportFolder.entry.id,
null,
{
'name': reportFile.name,
'nodeType': 'cm:content',
'autoRename': true
}
);
} catch (error) {
console.log('error' + error);
}
}
async function saveReport(alfrescoJsApi, retryCount) {
let filenameReport = `ProtractorTestReport-${FOLDER}-${retryCount}`;
let output = '';
let savePath = `${projectRoot}/e2e-output/junit-report/`;
let temporaryHtmlPath = savePath + 'html/temporaryHtml/';
let lastFileName = '';
let files = fs.readdirSync(savePath);
if (files && files.length > 0) {
for (const fileName of files) {
const testConfigReport = {
reportTitle: 'Protractor Test Execution Report',
outputPath: temporaryHtmlPath,
outputFilename: Math.random().toString(36).substr(2, 5) + filenameReport,
};
let filePath = `${projectRoot}/e2e-output/junit-report/` + fileName;
new htmlReporter().from(filePath, testConfigReport);
lastFileName = testConfigReport.outputFilename;
}
}
let lastHtmlFile = temporaryHtmlPath + lastFileName + '.html';
if (!(fs.lstatSync(lastHtmlFile).isDirectory())) {
output = output + fs.readFileSync(lastHtmlFile);
}
let fileName = savePath + 'html/' + filenameReport + '.html';
fs.writeFileSync(fileName, output, 'utf8');
await uploadReport(alfrescoJsApi, filenameReport);
rimraf(`${projectRoot}/e2e-output/screenshots/`, function () {
console.log('done delete screenshot');
});
}
module.exports = {
uploadScreenshot: uploadScreenshot,
uploadReport: uploadReport,
saveReport: saveReport
};