protractor-cucumber-framework
Advanced tools
Comparing version 0.2.5 to 0.3.0
196
index.js
var q = require('q'), | ||
assign = require('object-assign'), | ||
path = require('path'), | ||
glob = require('glob'); | ||
glob = require('glob'), | ||
Cucumber = require('cucumber'); | ||
@@ -14,144 +14,82 @@ /** | ||
exports.run = function(runner, specs) { | ||
// TODO - add the event interface for cucumber. | ||
var Cucumber = require('cucumber'); | ||
var configDir = runner.getConfig().configDir; | ||
var results = {} | ||
require('./lib/runState').initialize(runner, results); | ||
// Set up exec options for Cucumber | ||
var execOptions = assign({ | ||
format: [], | ||
tags: [], | ||
require: [], | ||
compiler: [] | ||
}, runner.getConfig().cucumberOpts); | ||
return runner.runTestPreparer().then(function() { | ||
return q.promise(function(resolve, reject) { | ||
var cliArguments = convertOptionsToCliArguments(runner.getConfig().cucumberOpts); | ||
cliArguments.push('--require', path.resolve(__dirname, 'lib', 'resultsCapturer.js')); | ||
cliArguments = cliArguments.concat(specs); | ||
['compiler', 'format', 'tags', 'require'].forEach(function (option) { | ||
// Make sure that options values are arrays | ||
if (!Array.isArray(execOptions[option])) { | ||
execOptions[option] = [ execOptions[option] ]; | ||
} | ||
if (option === 'require') { | ||
execOptions[option] = | ||
execOptions[option].map(function(path) { | ||
// Handle glob matching | ||
return glob.sync(path, {cwd: configDir}); | ||
}).reduce(function(opts, globPaths) { | ||
// Combine paths into flattened array | ||
return opts.concat(globPaths); | ||
}, []).map(function(requirePath) { | ||
// Resolve require absolute path | ||
return path.resolve(configDir, requirePath) | ||
}).filter(function(item, pos, orig) { | ||
// Make sure requires are unique | ||
return orig.indexOf(item) == pos; | ||
}); | ||
} | ||
Cucumber.Cli(cliArguments).run(function (isSuccessful) { | ||
try { | ||
if (runner.getConfig().onComplete) { | ||
runner.getConfig().onComplete(); | ||
} | ||
resolve(results); | ||
} catch (err) { | ||
reject(err); | ||
} | ||
}); | ||
}); | ||
}); | ||
var testResult = []; | ||
var stepResults = { | ||
description: null, | ||
assertions: [], | ||
duration: 0 | ||
}; | ||
var scenarioFailed = false; | ||
function convertOptionsToCliArguments(options) { | ||
var cliArguments = ['node', 'cucumberjs']; | ||
var failedCount = 0; | ||
// Add a listener into cucumber so that protractor can find out which | ||
// steps passed/failed | ||
var addResultListener = function(formatter) { | ||
var feature = { getName: function() { return ''; } }; | ||
var originalHandleBeforeFeatureEvent = formatter.handleBeforeFeatureEvent; | ||
formatter.handleBeforeFeatureEvent = function(event, callback) { | ||
feature = event.getPayloadItem('feature'); | ||
if (typeof originalHandleBeforeFeatureEvent == 'function') { | ||
originalHandleBeforeFeatureEvent.apply(formatter, arguments); | ||
for (var option in options) { | ||
var cliArgumentValues = convertOptionValueToCliValues(option, options[option]); | ||
if (cliArgumentValues.length) { | ||
cliArgumentValues.forEach(function (value) { | ||
cliArguments.push('--' + option, value); | ||
}); | ||
} else { | ||
callback(); | ||
cliArguments.push('--' + option); | ||
} | ||
}; | ||
var originalHandleAfterScenarioEvent = formatter.handleAfterScenarioEvent; | ||
formatter.handleAfterScenarioEvent = function(event, callback) { | ||
var scenarioInfo = { | ||
name: event.getPayloadItem('scenario').getName(), | ||
category: feature.getName() | ||
}; | ||
stepResults.description = scenarioInfo.name; | ||
if (scenarioFailed) { | ||
++failedCount; | ||
runner.emit('testFail', scenarioInfo); | ||
} else { | ||
runner.emit('testPass', scenarioInfo); | ||
} | ||
} | ||
testResult.push(stepResults); | ||
stepResults = { | ||
description: null, | ||
assertions: [], | ||
duration: 0 | ||
}; | ||
scenarioFailed = false; | ||
return cliArguments; | ||
} | ||
if (originalHandleAfterScenarioEvent | ||
&& typeof(originalHandleAfterScenarioEvent) === 'function') { | ||
originalHandleAfterScenarioEvent(event, callback); | ||
} else { | ||
callback(); | ||
} | ||
}; | ||
function convertRequireOptionValuesToCliValues(values) { | ||
var configDir = runner.getConfig().configDir; | ||
var originalHandleStepResultEvent = formatter.handleStepResultEvent; | ||
formatter.handleStepResultEvent = function(event, callback) { | ||
var stepResult = event.getPayloadItem('stepResult'); | ||
var isStepFailed = stepResult.getStatus() === Cucumber.Status.FAILED; | ||
var isStepSuccessful = stepResult.getStatus() === Cucumber.Status.PASSED; | ||
return values.map(function(path) { | ||
// Handle glob matching | ||
return glob.sync(path, {cwd: configDir}); | ||
}).reduce(function(opts, globPaths) { | ||
// Combine paths into flattened array | ||
return opts.concat(globPaths); | ||
}, []).map(function(requirePath) { | ||
// Resolve require absolute path | ||
return path.resolve(configDir, requirePath) | ||
}).filter(function(item, pos, orig) { | ||
// Make sure requires are unique | ||
return orig.indexOf(item) == pos; | ||
}); | ||
} | ||
if (isStepSuccessful) { | ||
stepResults.assertions.push({ | ||
passed: true | ||
}); | ||
stepResults.duration += stepResult.getDuration(); | ||
} else if (isStepFailed) { | ||
scenarioFailed = true; | ||
var failureMessage = stepResult.getFailureException(); | ||
stepResults.assertions.push({ | ||
passed: false, | ||
errorMsg: failureMessage.message, | ||
stackTrace: failureMessage.stack | ||
}); | ||
stepResults.duration += stepResult.getDuration(); | ||
function convertGenericOptionValuesToCliValues(values) { | ||
return values.reduce(function (opts, value) { | ||
if (value !== true) { | ||
opts.push(value); | ||
} | ||
if (originalHandleStepResultEvent | ||
&& typeof(originalHandleStepResultEvent) === 'function') { | ||
originalHandleStepResultEvent(event, callback); | ||
} else { | ||
callback(); | ||
} | ||
}; | ||
}; | ||
return opts; | ||
}, []); | ||
} | ||
return runner.runTestPreparer().then(function() { | ||
return q.promise(function(resolve, reject) { | ||
var cucumberConf = Cucumber.Cli.Configuration(execOptions, specs); | ||
var runtime = Cucumber.Runtime(cucumberConf); | ||
var formatters = cucumberConf.getFormatters(); | ||
function convertOptionValueToCliValues(option, values) { | ||
if (!Array.isArray(values)) { | ||
values = [values]; | ||
} | ||
addResultListener(formatters[0]); | ||
formatters.forEach(runtime.attachListener.bind(runtime)); | ||
runtime.start(function() { | ||
try { | ||
if (runner.getConfig().onComplete) { | ||
runner.getConfig().onComplete(); | ||
} | ||
resolve({ | ||
failedCount: failedCount, | ||
specResults: testResult | ||
}); | ||
} catch (err) { | ||
reject(err); | ||
} | ||
}); | ||
}); | ||
}); | ||
if (option === 'require') { | ||
return convertRequireOptionValuesToCliValues(values); | ||
} else { | ||
return convertGenericOptionValuesToCliValues(values); | ||
} | ||
} | ||
}; |
{ | ||
"name": "protractor-cucumber-framework", | ||
"version": "0.2.5", | ||
"version": "0.3.0", | ||
"description": "Protractor framework for Cucumber.js", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -33,1 +33,22 @@ Protractor Cucumber Framework | ||
Pull requests are welcome. Commits should have an appropriate message and be squashed. | ||
For Contributors | ||
---------------- | ||
Clone the github repository: | ||
git clone https://github.com/mattfritz/protractor-cucumber-framework | ||
cd protractor-cucumber-framework | ||
npm install | ||
Start up a selenium server. By default, the tests expect the selenium server to be running at `http://localhost:4444/wd/hub`. A selenium server can be started with `webdriver-manager`. | ||
node_modules/.bin/webdriver-manager update --standalone | ||
node_modules/.bin/webdriver-manager start | ||
The test suite runs against the included test application. Start that up with | ||
npm start | ||
Then run the tests with | ||
npm test |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
9129
7
155
54
1