diff --git a/lib/command/check.js b/lib/command/check.js new file mode 100644 index 000000000..b47781495 --- /dev/null +++ b/lib/command/check.js @@ -0,0 +1,174 @@ +const { getConfig, getTestRoot } = require('./utils') +const Codecept = require('../codecept') +const output = require('../output') +const standardActingHelpers = require('../plugin/standardActingHelpers') +const store = require('../store') +const container = require('../container') +const figures = require('figures') +const chalk = require('chalk') +const { createTest } = require('../mocha/test') +const { getMachineInfo } = require('./info') +const definitions = require('./definitions') + +module.exports = async function (test, options) { + if (options.grep) process.env.grep = options.grep + const configFile = options.config + + setTimeout(() => { + output.error("Something went wrong. Checks didn't pass and timed out. Please check your config and helpers.") + process.exit(1) + }, options.timeout || 50000) + + const checks = { + config: false, + container: false, + pageObjects: false, + helpers: false, + setup: false, + tests: false, + def: false, + } + + const testRoot = getTestRoot(configFile) + let config = getConfig(configFile) + + try { + config = getConfig(configFile) + checks['config'] = true + } catch (err) { + checks['config'] = err + } + + printCheck('config', checks['config'], config.name) + + let codecept + try { + codecept = new Codecept(config, options) + codecept.init(testRoot) + await container.started() + checks.container = true + } catch (err) { + checks.container = err + } + + printCheck('container', checks['container']) + + if (codecept && options.bootstrap) { + try { + await codecept.bootstrap() + checks.bootstrap = true + } catch (err) { + checks.bootstrap = err + } + printCheck('bootstrap', checks['bootstrap']) + } + + let numTests = 0 + if (codecept) { + try { + codecept.loadTests() + const mocha = container.mocha() + mocha.files = codecept.testFiles + mocha.loadFiles() + mocha.suite.suites.forEach(suite => { + numTests += suite.tests.length + }) + if (numTests > 0) { + checks.tests = true + } else { + throw new Error('No tests found') + } + } catch (err) { + checks.tests = err + } + } + + printCheck('tests', checks['tests'], `Total: ${numTests} tests`) + + store.dryRun = true + + const helpers = container.helpers() + + try { + if (!Object.keys(helpers).length) throw new Error('No helpers found') + // load helpers + for (const helper of Object.values(helpers)) { + helper._init() + } + checks.helpers = true + } catch (err) { + checks.helpers = err + } + + printCheck('helpers', checks['helpers'], `${Object.keys(helpers).join(', ')}`) + + const pageObjects = container.support() + + try { + if (Object.keys(pageObjects).length) { + for (const pageObject of Object.values(pageObjects)) { + pageObject.name + } + } + checks.pageObjects = true + } catch (err) { + checks.pageObjects = err + } + printCheck('page objects', checks['pageObjects'], `Total: ${Object.keys(pageObjects).length} support objects`) + + if (Object.keys(helpers).length) { + const suite = container.mocha().suite + const test = createTest('test', () => {}) + try { + for (const helper of Object.values(helpers)) { + await helper._beforeSuite(suite) + await helper._before(test) + await helper._passed(test) + await helper._after(test) + await helper._finishTest(suite) + await helper._afterSuite(suite) + } + checks.setup = true + } catch (err) { + checks.setup = err + } + } + + printCheck('Helpers Hooks', checks['setup'], standardActingHelpers.some(h => Object.keys(helpers).includes(h)) ? 'Initializing and closing browser' : '') + + try { + definitions(configFile, { dryRun: true }) + checks.def = true + } catch (err) { + checks.def = err + } + + printCheck('TypeScript Definitions', checks['def']) + + output.print('') + + if (!Object.values(checks).every(check => check === true)) { + output.error("Something went wrong. Checks didn't pass.") + output.print() + getMachineInfo() + process.exit(1) + } + + output.print(output.styles.success('All checks passed'.toUpperCase()), 'Ready to run your tests 🚀') + process.exit(0) +} + +function printCheck(name, value, comment = '') { + let status = '' + if (value == true) { + status += chalk.bold.green(figures.tick) + } else { + status += chalk.bold.red(figures.cross) + } + + if (value instanceof Error) { + comment = `${comment} ${chalk.red.italic(value.message)}`.trim() + } + + output.print(status, name.toUpperCase(), chalk.dim(comment)) +} diff --git a/package.json b/package.json index b661b3f32..8fff055b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codeceptjs", - "version": "3.7.0-beta.1", + "version": "3.6.10", "description": "Supercharged End 2 End Testing Framework for NodeJS", "keywords": [ "acceptance", @@ -93,7 +93,6 @@ "fn-args": "4.0.0", "fs-extra": "11.2.0", "glob": "^11.0.0", - "fuse.js": "^7.0.0", "html-minifier-terser": "7.2.0", "inquirer": "6.5.2", "invisi-data": "^1.0.0",