73 lines
2.2 KiB
JavaScript

const { EventEmitter } = require("events");
const { generateEvents } = require("gherkin");
const JsonFormatter = require("cucumber/lib/formatter/json_formatter").default;
const formatterHelpers = require("cucumber/lib/formatter/helpers");
function generateCucumberJson(state) {
let output = "";
const logFn = (data) => {
output += data;
};
const eventBroadcaster = new EventEmitter();
function storePickle({ pickle, uri }) {
eventBroadcaster.emit("pickle-accepted", { pickle, uri });
}
eventBroadcaster.on("pickle", storePickle);
// eslint-disable-next-line no-new
new JsonFormatter({
eventBroadcaster,
eventDataCollector: new formatterHelpers.EventDataCollector(
eventBroadcaster
),
log: logFn,
});
// Start feeding the recorded test run into the JsonFormatter
// Feed in the static test structure
generateEvents(state.spec.toString(), state.uri).forEach((event) => {
eventBroadcaster.emit(event.type, event);
});
// Feed in the results from the recorded scenarios and steps
Object.keys(state.runTests).forEach((test) => {
const scenario = state.runScenarios[test];
const stepResults = state.runTests[test];
const stepsToRun = state.scenarioSteps[test];
const steps = stepsToRun.map((step) => ({
sourceLocation: { uri: state.uri, line: step.location.line },
}));
eventBroadcaster.emit("test-case-prepared", {
sourceLocation: state.formatTestCase(scenario).sourceLocation,
steps,
});
stepResults.forEach((stepResult, stepIdx) => {
eventBroadcaster.emit("test-step-prepared", {
index: stepIdx,
testCase: state.formatTestCase(scenario),
});
eventBroadcaster.emit("test-step-finished", {
index: stepIdx,
testCase: state.formatTestCase(scenario),
result: stepResult,
});
if (stepResult.attachment) {
eventBroadcaster.emit("test-step-attachment", stepResult.attachment);
}
});
eventBroadcaster.emit("test-case-finished", {
sourceLocation: state.formatTestCase(scenario).sourceLocation,
result: state.runTests[scenario.name].result,
});
});
eventBroadcaster.emit("test-run-finished", {});
return JSON.parse(output);
}
module.exports = { generateCucumberJson };