@badeball/cypress-cucumber-preprocessor
Version:
[](https://github.com/badeball/cypress-cucumber-preprocessor/actions/workflows/build.yml) [ • 6.15 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mutateConfigObjectPreservingly = mutateConfigObjectPreservingly;
exports.rebuildOriginalConfigObject = rebuildOriginalConfigObject;
exports.addCucumberPreprocessorPlugin = addCucumberPreprocessorPlugin;
const fs_1 = __importDefault(require("fs"));
const node_util_1 = require("node:util");
const messages_1 = require("@cucumber/messages");
const tag_expressions_1 = __importDefault(require("@cucumber/tag-expressions"));
const gherkin_1 = require("@cucumber/gherkin");
const find_cypress_specs_1 = require("find-cypress-specs");
const constants_1 = require("./constants");
const cypress_task_definitions_1 = require("./cypress-task-definitions");
const plugin_event_handlers_1 = require("./plugin-event-handlers");
const preprocessor_configuration_1 = require("./preprocessor-configuration");
const type_guards_1 = require("./helpers/type-guards");
const environment_1 = require("./helpers/environment");
const memoize_1 = require("./helpers/memoize");
const assertions_1 = require("./helpers/assertions");
const debug_1 = __importDefault(require("./helpers/debug"));
const resolve = (0, memoize_1.memoize)(preprocessor_configuration_1.resolve);
function mutateConfigObjectPreservingly(config, property, value) {
var _a;
const preserved = (_a = config[constants_1.INTERNAL_PROPERTY_NAME]) !== null && _a !== void 0 ? _a : (config[constants_1.INTERNAL_PROPERTY_NAME] = {});
preserved[property] = config[property];
config[property] = value;
}
function rebuildOriginalConfigObject(config) {
return Object.assign({}, config, config[constants_1.INTERNAL_PROPERTY_NAME]);
}
async function addCucumberPreprocessorPlugin(on, config, options = {}) {
config.env[constants_1.INTERNAL_SUITE_PROPERTIES] = { isEventHandlersAttached: true };
const preprocessor = await resolve(config, config.env, "/");
if (!options.omitBeforeRunHandler) {
on("before:run", () => (0, plugin_event_handlers_1.beforeRunHandler)(config));
}
if (!options.omitAfterRunHandler) {
on("after:run", (results) => (0, plugin_event_handlers_1.afterRunHandler)(config, results));
}
if (!options.omitBeforeSpecHandler) {
on("before:spec", (spec) => (0, plugin_event_handlers_1.beforeSpecHandler)(config, spec));
}
if (!options.omitAfterSpecHandler) {
on("after:spec", (spec, results) => (0, plugin_event_handlers_1.afterSpecHandler)(config, spec, results));
}
if (!options.omitAfterScreenshotHandler) {
on("after:screenshot", (details) => (0, plugin_event_handlers_1.afterScreenshotHandler)(config, details));
}
on("task", {
[cypress_task_definitions_1.TASK_SPEC_ENVELOPES]: plugin_event_handlers_1.specEnvelopesHandler.bind(null, config),
[cypress_task_definitions_1.TASK_TEST_CASE_STARTED]: plugin_event_handlers_1.testCaseStartedHandler.bind(null, config),
[cypress_task_definitions_1.TASK_TEST_STEP_STARTED]: plugin_event_handlers_1.testStepStartedHandler.bind(null, config),
[cypress_task_definitions_1.TASK_TEST_STEP_FINISHED]: plugin_event_handlers_1.testStepFinishedHandler.bind(null, config, options),
[cypress_task_definitions_1.TASK_TEST_CASE_FINISHED]: plugin_event_handlers_1.testCaseFinishedHandler.bind(null, config),
[cypress_task_definitions_1.TASK_CREATE_STRING_ATTACHMENT]: plugin_event_handlers_1.createStringAttachmentHandler.bind(null, config),
[cypress_task_definitions_1.TASK_FRONTEND_TRACKING_ERROR]: plugin_event_handlers_1.frontendTrackingErrorHandler.bind(null, config),
});
const tags = (0, environment_1.getTags)(config.env);
if (tags !== null && preprocessor.filterSpecs) {
(0, debug_1.default)(`Filtering specs using expression ${(0, node_util_1.inspect)(tags)}`);
const node = (0, tag_expressions_1.default)(tags);
const testFiles = (0, find_cypress_specs_1.getSpecs)(config, "foobar", true).filter((testFile) => {
if (!testFile.endsWith(".feature")) {
switch (preprocessor.filterSpecsMixedMode) {
case "hide":
return false;
case "show":
return true;
case "empty-set":
return node.evaluate([]);
default:
(0, assertions_1.assertNever)(preprocessor.filterSpecsMixedMode);
}
}
const content = fs_1.default.readFileSync(testFile).toString("utf-8");
const options = {
includeSource: false,
includeGherkinDocument: false,
includePickles: true,
newId: messages_1.IdGenerator.incrementing(),
};
const envelopes = (0, gherkin_1.generateMessages)(content, testFile, messages_1.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN, options);
const pickles = envelopes
.map((envelope) => envelope.pickle)
.filter(type_guards_1.notNull);
return pickles.some((pickle) => {
var _a, _b;
return node.evaluate((_b = (_a = pickle.tags) === null || _a === void 0 ? void 0 : _a.map((tag) => tag.name).filter(type_guards_1.notNull)) !== null && _b !== void 0 ? _b : []);
});
});
(0, debug_1.default)(`Resolved specs ${(0, node_util_1.inspect)(testFiles)}`);
const propertyName = "specPattern" in config ? "specPattern" : "testFiles";
/**
* The preprocessor needs the original value at a later point in order to determine the implicit
* integration folder correctly. Otherwise, scoping test files using tags would affect definition
* resolvement and yield surprising results.
*/
mutateConfigObjectPreservingly(config, propertyName, testFiles);
}
if (preprocessor.dryRun) {
config.supportFile = false;
}
return config;
}