2016-04-14 13:36:38 -04:00
|
|
|
// FIRST TIME ONLY- run:
|
2015-12-20 16:17:16 -05:00
|
|
|
// ./node_modules/.bin/webdriver-manager update
|
2016-04-14 13:36:38 -04:00
|
|
|
//
|
|
|
|
// Try: `npm run webdriver:update`
|
|
|
|
//
|
|
|
|
// AND THEN EVERYTIME ...
|
|
|
|
// 1. Compile with `tsc`
|
|
|
|
// 2. Make sure the test server (e.g., http-server: localhost:8080) is running.
|
|
|
|
// 3. ./node_modules/.bin/protractor protractor.config.js
|
|
|
|
//
|
|
|
|
// To do all steps, try: `npm run e2e`
|
2015-12-20 16:17:16 -05:00
|
|
|
|
|
|
|
var fs = require('fs');
|
|
|
|
var path = require('canonical-path');
|
2016-01-04 18:01:08 -05:00
|
|
|
var _ = require('lodash');
|
2015-12-20 16:17:16 -05:00
|
|
|
|
|
|
|
|
|
|
|
exports.config = {
|
|
|
|
directConnect: true,
|
|
|
|
|
|
|
|
// Capabilities to be passed to the webdriver instance.
|
|
|
|
capabilities: {
|
|
|
|
'browserName': 'chrome'
|
|
|
|
},
|
|
|
|
|
|
|
|
// Framework to use. Jasmine is recommended.
|
|
|
|
framework: 'jasmine',
|
|
|
|
|
|
|
|
// Spec patterns are relative to this config file
|
|
|
|
specs: ['**/*e2e-spec.js' ],
|
|
|
|
|
|
|
|
|
|
|
|
// For angular2 tests
|
|
|
|
useAllAngular2AppRoots: true,
|
|
|
|
|
|
|
|
baseUrl: 'http://localhost:8080',
|
|
|
|
|
|
|
|
// doesn't seem to work.
|
|
|
|
// resultJsonOutputFile: "foo.json",
|
2016-04-11 08:36:53 -04:00
|
|
|
|
2015-12-20 16:17:16 -05:00
|
|
|
onPrepare: function() {
|
2016-01-04 18:01:08 -05:00
|
|
|
//// SpecReporter
|
2015-12-20 16:17:16 -05:00
|
|
|
//var SpecReporter = require('jasmine-spec-reporter');
|
|
|
|
//jasmine.getEnv().addReporter(new SpecReporter({displayStacktrace: 'none'}));
|
2016-01-04 18:01:08 -05:00
|
|
|
//// jasmine.getEnv().addReporter(new SpecReporter({displayStacktrace: 'all'}));
|
2015-12-20 16:17:16 -05:00
|
|
|
|
|
|
|
// debugging
|
2016-01-04 18:01:08 -05:00
|
|
|
// console.log('browser.params:' + JSON.stringify(browser.params));
|
|
|
|
|
2015-12-20 16:17:16 -05:00
|
|
|
var appDir = browser.params.appDir;
|
|
|
|
if (appDir) {
|
|
|
|
if (appDir.match('/ts') != null) {
|
|
|
|
browser.appIsTs = true;
|
|
|
|
} else if (appDir.match('/js') != null) {
|
|
|
|
browser.appIsJs = true;
|
|
|
|
} else if (appDir.match('/dart') != null) {
|
|
|
|
browser.appIsDart = true;
|
|
|
|
} else {
|
|
|
|
browser.appIsUnknown = true;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
browser.appIsUnknown = true;
|
|
|
|
}
|
|
|
|
jasmine.getEnv().addReporter(new Reporter( browser.params )) ;
|
|
|
|
global.describeIf = describeIf;
|
|
|
|
global.itIf = itIf;
|
2016-01-03 14:32:57 -05:00
|
|
|
global.sendKeys = sendKeys;
|
2016-04-11 08:36:53 -04:00
|
|
|
|
|
|
|
// Allow changing bootstrap mode to NG1 for upgrade tests
|
|
|
|
global.setProtractorToNg1Mode = function() {
|
|
|
|
browser.useAllAngular2AppRoots = false;
|
|
|
|
browser.rootEl = 'body';
|
|
|
|
};
|
2015-12-20 16:17:16 -05:00
|
|
|
},
|
|
|
|
|
|
|
|
jasmineNodeOpts: {
|
|
|
|
// defaultTimeoutInterval: 60000,
|
|
|
|
defaultTimeoutInterval: 10000,
|
|
|
|
showTiming: true,
|
|
|
|
print: function() {}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
function describeIf(cond, name, func) {
|
|
|
|
if (cond) {
|
|
|
|
describe(name, func);
|
|
|
|
} else {
|
2016-01-04 18:01:08 -05:00
|
|
|
xdescribe(name, func);
|
2015-12-20 16:17:16 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function itIf(cond, name, func) {
|
|
|
|
if (cond) {
|
|
|
|
it(name, func);
|
|
|
|
} else {
|
2016-01-04 18:01:08 -05:00
|
|
|
xit(name, func);
|
2015-12-20 16:17:16 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-04-14 13:36:38 -04:00
|
|
|
// Hack - because of bug with protractor send keys
|
2016-04-25 18:46:59 -04:00
|
|
|
// Hack - because of bug with send keys
|
2016-01-03 14:32:57 -05:00
|
|
|
function sendKeys(element, str) {
|
|
|
|
return str.split('').reduce(function (promise, char) {
|
2016-04-25 18:46:59 -04:00
|
|
|
return promise.then(function () {
|
|
|
|
return element.sendKeys(char);
|
|
|
|
});
|
2016-01-03 14:32:57 -05:00
|
|
|
}, element.getAttribute('value'));
|
2016-04-25 18:46:59 -04:00
|
|
|
// better to create a resolved promise here but ... don't know how with protractor;
|
|
|
|
}
|
2015-12-20 16:17:16 -05:00
|
|
|
|
|
|
|
function Reporter(options) {
|
2016-01-04 18:01:08 -05:00
|
|
|
var _defaultOutputFile = path.resolve(process.cwd(), "../../", 'protractor-results.txt');
|
|
|
|
options.outputFile = options.outputFile || _defaultOutputFile;
|
|
|
|
|
|
|
|
var _root = { appDir: options.appDir, suites: [] };
|
|
|
|
log('AppDir: ' + options.appDir, +1);
|
2015-12-20 16:17:16 -05:00
|
|
|
var _currentSuite;
|
|
|
|
|
|
|
|
this.suiteStarted = function(suite) {
|
2016-01-04 18:01:08 -05:00
|
|
|
_currentSuite = { description: suite.description, status: null, specs: [] };
|
|
|
|
_root.suites.push(_currentSuite);
|
|
|
|
log('Suite: ' + suite.description, +1);
|
2015-12-20 16:17:16 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
this.suiteDone = function(suite) {
|
2016-01-04 18:01:08 -05:00
|
|
|
var statuses = _currentSuite.specs.map(function(spec) {
|
|
|
|
return spec.status;
|
|
|
|
});
|
|
|
|
statuses = _.uniq(statuses);
|
|
|
|
var status = statuses.indexOf('failed') >= 0 ? 'failed' : statuses.join(', ');
|
|
|
|
_currentSuite.status = status;
|
|
|
|
log('Suite ' + _currentSuite.status + ': ' + suite.description, -1);
|
2015-12-20 16:17:16 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
this.specStarted = function(spec) {
|
2016-01-04 18:01:08 -05:00
|
|
|
|
2015-12-20 16:17:16 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
this.specDone = function(spec) {
|
2016-01-04 18:01:08 -05:00
|
|
|
var currentSpec = {
|
|
|
|
description: spec.description,
|
|
|
|
status: spec.status
|
|
|
|
};
|
|
|
|
if (spec.failedExpectations.length > 0) {
|
|
|
|
currentSpec.failedExpectations = spec.failedExpectations;
|
|
|
|
}
|
|
|
|
|
|
|
|
_currentSuite.specs.push(currentSpec);
|
|
|
|
log(spec.status + ' - ' + spec.description);
|
2015-12-20 16:17:16 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
this.jasmineDone = function() {
|
|
|
|
outputFile = options.outputFile;
|
2016-01-04 18:01:08 -05:00
|
|
|
//// Alternate approach - just stringify the _root - not as pretty
|
|
|
|
//// but might be more useful for automation.
|
|
|
|
// var output = JSON.stringify(_root, null, 2);
|
|
|
|
var output = formatOutput(_root);
|
|
|
|
fs.appendFileSync(outputFile, output);
|
2015-12-20 16:17:16 -05:00
|
|
|
};
|
|
|
|
|
2016-01-04 18:01:08 -05:00
|
|
|
// for output file output
|
|
|
|
function formatOutput(output) {
|
|
|
|
var indent = ' ';
|
|
|
|
var pad = ' ';
|
|
|
|
var results = [];
|
|
|
|
results.push('AppDir:' + output.appDir);
|
|
|
|
output.suites.forEach(function(suite) {
|
|
|
|
results.push(pad + 'Suite: ' + suite.description + ' -- ' + suite.status);
|
|
|
|
pad+=indent;
|
|
|
|
suite.specs.forEach(function(spec) {
|
|
|
|
results.push(pad + spec.status + ' - ' + spec.description);
|
|
|
|
if (spec.failedExpectations) {
|
|
|
|
pad+=indent;
|
|
|
|
spec.failedExpectations.forEach(function (fe) {
|
|
|
|
results.push(pad + 'message: ' + fe.message);
|
|
|
|
});
|
|
|
|
pad=pad.substr(2);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
pad = pad.substr(2);
|
|
|
|
results.push('');
|
2015-12-20 16:17:16 -05:00
|
|
|
});
|
2016-01-04 18:01:08 -05:00
|
|
|
results.push('');
|
|
|
|
return results.join('\n');
|
2015-12-20 16:17:16 -05:00
|
|
|
}
|
|
|
|
|
2016-01-04 18:01:08 -05:00
|
|
|
// for console output
|
|
|
|
var _pad;
|
|
|
|
function log(str, indent) {
|
|
|
|
_pad = _pad || '';
|
|
|
|
if (indent == -1) {
|
|
|
|
_pad = _pad.substr(2);
|
|
|
|
}
|
|
|
|
console.log(_pad + str);
|
|
|
|
if (indent == 1) {
|
|
|
|
_pad = _pad + ' ';
|
|
|
|
}
|
2015-12-20 16:17:16 -05:00
|
|
|
}
|
|
|
|
|
2016-01-04 18:01:08 -05:00
|
|
|
}
|