UNPKG

testplane

Version:

Tests framework based on mocha and wdio

175 lines 10.1 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _TestParser_instances, _TestParser_failedTests, _TestParser_buildInstructions, _TestParser_applyInstructionsEvents, _TestParser_passthroughFileEvents, _TestParser_clearRequireCache, _TestParser_validateUniqTitles; Object.defineProperty(exports, "__esModule", { value: true }); exports.TestParser = void 0; const events_1 = require("events"); const build_instructions_1 = require("./build-instructions"); const skip_controller_1 = require("./controllers/skip-controller"); const only_controller_1 = require("./controllers/only-controller"); const also_controller_1 = require("./controllers/also-controller"); const config_controller_1 = require("./controllers/config-controller"); const browser_version_controller_1 = require("./controllers/browser-version-controller"); const tree_builder_1 = require("./tree-builder"); const events_2 = require("../events"); const test_parser_api_1 = require("./test-parser-api"); const events_3 = require("../events"); const lodash_1 = __importDefault(require("lodash")); const clear_require_1 = __importDefault(require("clear-require")); const path_1 = __importDefault(require("path")); const fs_extra_1 = __importDefault(require("fs-extra")); const logger = __importStar(require("../utils/logger")); const crypto_1 = require("../utils/crypto"); const getFailedTestId = (test) => (0, crypto_1.getShortMD5)(`${test.fullTitle}${test.browserId}${test.browserVersion}`); class TestParser extends events_1.EventEmitter { constructor() { super(); _TestParser_instances.add(this); _TestParser_failedTests.set(this, void 0); _TestParser_buildInstructions.set(this, void 0); __classPrivateFieldSet(this, _TestParser_failedTests, new Set(), "f"); __classPrivateFieldSet(this, _TestParser_buildInstructions, new build_instructions_1.InstructionsList(), "f"); } async loadFiles(files, { config, runnableOpts }) { const eventBus = new events_1.EventEmitter(); const { system: { ctx, mochaOpts }, } = config; const toolGlobals = { browser: (0, browser_version_controller_1.mkProvider)(config.getBrowserIds(), eventBus), config: config_controller_1.ConfigController.create(eventBus), ctx: lodash_1.default.clone(ctx), only: only_controller_1.OnlyController.create(eventBus), skip: skip_controller_1.SkipController.create(eventBus), also: also_controller_1.AlsoController.create(eventBus), }; global.testplane = toolGlobals; global.hermione = toolGlobals; __classPrivateFieldGet(this, _TestParser_buildInstructions, "f") .push(build_instructions_1.Instructions.extendWithBrowserId) .push(build_instructions_1.Instructions.extendWithBrowserVersion) .push(build_instructions_1.Instructions.extendWithTimeout) .push(build_instructions_1.Instructions.disableInPassiveBrowser) .push(build_instructions_1.Instructions.buildGlobalSkipInstruction(config)); __classPrivateFieldGet(this, _TestParser_instances, "m", _TestParser_applyInstructionsEvents).call(this, eventBus); __classPrivateFieldGet(this, _TestParser_instances, "m", _TestParser_passthroughFileEvents).call(this, eventBus, toolGlobals); __classPrivateFieldGet(this, _TestParser_instances, "m", _TestParser_clearRequireCache).call(this, files); const { readFiles } = await Promise.resolve().then(() => __importStar(require("./mocha-reader"))); const rand = Math.random(); const esmDecorator = (f) => f + `?rand=${rand}`; await readFiles(files, { esmDecorator, config: mochaOpts, eventBus, runnableOpts }); if (config.lastFailed.only) { try { __classPrivateFieldSet(this, _TestParser_failedTests, new Set(), "f"); const inputPaths = lodash_1.default.isArray(config.lastFailed.input) ? config.lastFailed.input : config.lastFailed.input.split(",").map(v => v.trim()); for (const inputPath of inputPaths) { for (const test of await fs_extra_1.default.readJSON(inputPath)) { __classPrivateFieldGet(this, _TestParser_failedTests, "f").add(getFailedTestId(test)); } } } catch { logger.warn(`Could not read failed tests data at ${config.lastFailed.input}. Running all tests instead`); } } } parse(files, { browserId, config, grep }) { const treeBuilder = new tree_builder_1.TreeBuilder(); __classPrivateFieldGet(this, _TestParser_buildInstructions, "f").exec(files, { treeBuilder, browserId, config }); if (grep) { treeBuilder.addTestFilter((test) => grep.test(test.fullTitle())); } if (config.lastFailed && config.lastFailed.only && __classPrivateFieldGet(this, _TestParser_failedTests, "f").size) { treeBuilder.addTestFilter(test => { return __classPrivateFieldGet(this, _TestParser_failedTests, "f").has(getFailedTestId({ fullTitle: test.fullTitle(), browserId: test.browserId, browserVersion: test.browserVersion, })); }); } const rootSuite = treeBuilder.applyFilters().getRootSuite(); const tests = rootSuite.getTests(); __classPrivateFieldGet(this, _TestParser_instances, "m", _TestParser_validateUniqTitles).call(this, tests); return tests; } } exports.TestParser = TestParser; _TestParser_failedTests = new WeakMap(), _TestParser_buildInstructions = new WeakMap(), _TestParser_instances = new WeakSet(), _TestParser_applyInstructionsEvents = function _TestParser_applyInstructionsEvents(eventBus) { let currentFile; eventBus .on(events_3.MasterEvents.BEFORE_FILE_READ, ({ file }) => (currentFile = file)) .on(events_3.MasterEvents.AFTER_FILE_READ, () => (currentFile = undefined)) .on(events_2.TestReaderEvents.NEW_BUILD_INSTRUCTION, instruction => __classPrivateFieldGet(this, _TestParser_buildInstructions, "f").push(instruction, currentFile)); }, _TestParser_passthroughFileEvents = function _TestParser_passthroughFileEvents(eventBus, testplane) { const passthroughEvent_ = (event, customOpts = {}) => { eventBus.on(event, data => this.emit(event, { ...data, testplane, hermione: testplane, ...customOpts, })); }; passthroughEvent_(events_3.MasterEvents.BEFORE_FILE_READ, { testParser: test_parser_api_1.TestParserAPI.create(testplane, eventBus) }); passthroughEvent_(events_3.MasterEvents.AFTER_FILE_READ); }, _TestParser_clearRequireCache = function _TestParser_clearRequireCache(files) { files.forEach(filename => { if (path_1.default.extname(filename) !== ".mjs") { (0, clear_require_1.default)(path_1.default.resolve(filename)); } }); }, _TestParser_validateUniqTitles = function _TestParser_validateUniqTitles(tests) { const titles = {}; tests.forEach(test => { const fullTitle = test.fullTitle(); const relatePath = path_1.default.relative(process.cwd(), test.file); if (!titles[fullTitle]) { titles[fullTitle] = relatePath; return; } if (titles[fullTitle] === relatePath) { throw new Error(`Tests with the same title '${fullTitle}'` + ` in file '${titles[fullTitle]}' can't be used`); } else { throw new Error(`Tests with the same title '${fullTitle}'` + ` in files '${titles[fullTitle]}' and '${relatePath}' can't be used`); } }); }; //# sourceMappingURL=test-parser.js.map