Skip to content

Commit

Permalink
Feature. Add require param to config (codeceptjs#1294)
Browse files Browse the repository at this point in the history
* add --require module param

* add require module for run-multiple

* add --require parameter tests

* add short flag for --require, add doc

* move require pararmeter to config

* remove --require param and env variable

* update documentation

* lint test configs
  • Loading branch information
Evgeniy Lukoyanov authored and DavertMik committed Nov 3, 2018
1 parent da612d7 commit 8f9bc47
Show file tree
Hide file tree
Showing 14 changed files with 227 additions and 4 deletions.
2 changes: 0 additions & 2 deletions bin/codecept.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ const path = require('path');
const Config = require('../lib/config');
const Codecept = require('../lib/codecept');
const { print, error } = require('../lib/output');
const fileExists = require('../lib/utils').fileExists;
const fs = require('fs');

if (process.versions.node && process.versions.node.split('.') && process.versions.node.split('.')[0] < 8) {
error('NodeJS >= 8 is required to run.');
Expand Down
8 changes: 8 additions & 0 deletions docs/api/codecept.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,14 @@ Loads tests by pattern or by config.tests

- `pattern` **[string][1]?**

### requireModules

Require modules before codeceptjs running

#### Parameters

- `requiringModules` **\[[string][1]]**

### run

Run a specific test or all loaded tests.
Expand Down
21 changes: 21 additions & 0 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,27 @@ Here is an overview of available options with their defaults:
* **noGlobals**: `false` - disable registering global variables like `Actor`, `Helper`, `pause`, `within`, `DataTable`
* **hooks**: - include custom listeners to plug into execution workflow. See [Custom Hooks](http://codecept.io/hooks/#custom-hooks)
* **translation**: - [locale](http://codecept.io/translation/) to be used to print s teps output, as well as used in source code.
* **require**: `[]` - array of module names to be required before codecept starts. See [Require](#require)


## Require

Requires described module before run. This option is useful for assertion libraries, so you may `--require should` instead of manually invoking `require('should')` within each test file. It can be used with relative paths, e.g. `"require": ["/lib/somemodule"]`, and installed packages.

You can register ts-node, so you can use Typescript in tests with ts-node package
```js
exports.config = {
tests: './*_test.js',
timeout: 10000,
output: '',
helpers: {},
include: {},
bootstrap: false,
mocha: {},
// require modules
require: ["ts-node/register", "should"]
}
```

## Dynamic Configuration

Expand Down
21 changes: 20 additions & 1 deletion lib/codecept.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ const Config = require('./config');
const event = require('../lib/event');
const glob = require('glob');
const runHook = require('./hooks');

const existsSync = require('fs').existsSync;
const resolve = require('path').resolve;

/**
* CodeceptJS runner
Expand All @@ -22,6 +23,24 @@ class Codecept {
this.config = Config.create(config);
this.opts = opts;
this.testFiles = new Array(0);
this.requireModules(config.require);
}

/**
* Require modules before codeceptjs running
*
* @param {[string]} requiringModules
*/
requireModules(requiringModules) {
if (requiringModules) {
requiringModules.forEach((requiredModule) => {
const isLocalFile = existsSync(requiredModule) || existsSync(`${requiredModule}.js`);
if (isLocalFile) {
requiredModule = resolve(requiredModule);
}
require(requiredModule);
});
}
}

/**
Expand Down
21 changes: 21 additions & 0 deletions test/data/sandbox/codecept.require.multiple.several.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"tests": "./*_test.js",
"timeout": 10000,
"output": "./output",
"helpers": {
"FileSystem": {}
},
"include": {},
"bootstrap": false,
"mocha": {},
"name": "require test",
"require": ["requiredModule", "requiredModule2"],
"multiple": {
"default": {
"browsers": [
"chrome",
{ "browser": "firefox"}
]
}
}
}
21 changes: 21 additions & 0 deletions test/data/sandbox/codecept.require.multiple.single.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"tests": "./*_test.js",
"timeout": 10000,
"output": "./output",
"helpers": {
"FileSystem": {}
},
"include": {},
"bootstrap": false,
"mocha": {},
"name": "require test",
"require": ["requiredModule"],
"multiple": {
"default": {
"browsers": [
"chrome",
{ "browser": "firefox"}
]
}
}
}
21 changes: 21 additions & 0 deletions test/data/sandbox/codecept.require.multiple.without.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"tests": "./*_test.js",
"timeout": 10000,
"output": "./output",
"helpers": {
"FileSystem": {}
},
"include": {},
"bootstrap": false,
"mocha": {},
"name": "require test",
"require": [],
"multiple": {
"default": {
"browsers": [
"chrome",
{ "browser": "firefox"}
]
}
}
}
13 changes: 13 additions & 0 deletions test/data/sandbox/codecept.require.several.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"tests": "./*_test.js",
"timeout": 10000,
"output": "./output",
"helpers": {
"FileSystem": {}
},
"include": {},
"bootstrap": false,
"mocha": {},
"name": "require test",
"require": ["requiredModule", "requiredModule2"]
}
13 changes: 13 additions & 0 deletions test/data/sandbox/codecept.require.single.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"tests": "./*_test.js",
"timeout": 10000,
"output": "./output",
"helpers": {
"FileSystem": {}
},
"include": {},
"bootstrap": false,
"mocha": {},
"name": "require test",
"require": ["requiredModule"]
}
13 changes: 13 additions & 0 deletions test/data/sandbox/codecept.require.without.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"tests": "./*_test.js",
"timeout": 10000,
"output": "./output",
"helpers": {
"FileSystem": {}
},
"include": {},
"bootstrap": false,
"mocha": {},
"name": "require test",
"require": []
}
1 change: 1 addition & 0 deletions test/data/sandbox/requiredModule.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
console.log('Module was required 1.');
1 change: 1 addition & 0 deletions test/data/sandbox/requiredModule2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
console.log('Module was required 2.');
35 changes: 35 additions & 0 deletions test/runner/codecept_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,41 @@ describe('CodeceptJS Runner', () => {
done();
});
});

describe('with require parameter', () => {
const moduleOutput = 'Module was required 1';
const moduleOutput2 = 'Module was required 2';

it('should be executed with module when described', (done) => {
process.chdir(codecept_dir);
exec(codecept_run_config('codecept.require.single.json'), (err, stdout, stderr) => {
stdout.should.include(moduleOutput);
stdout.should.not.include(moduleOutput2);
assert(!err);
done();
});
});

it('should be executed with several modules when described', (done) => {
process.chdir(codecept_dir);
exec(codecept_run_config('codecept.require.several.json'), (err, stdout, stderr) => {
stdout.should.include(moduleOutput);
stdout.should.include(moduleOutput2);
assert(!err);
done();
});
});

it('should not be executed without module when not described', (done) => {
process.chdir(codecept_dir);
exec(codecept_run_config('codecept.require.without.json'), (err, stdout, stderr) => {
stdout.should.not.include(moduleOutput);
stdout.should.not.include(moduleOutput2);
assert(!err);
done();
});
});
});
});

describe('Codeceptjs Events', () => {
Expand Down
40 changes: 39 additions & 1 deletion test/runner/run_multiple_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,5 +122,43 @@ describe('CodeceptJS Multiple Runner', function () {
done();
});
});
});

describe('with require parameter', () => {
const _codecept_run = `run-multiple --config ${codecept_dir}`;
const moduleOutput = 'Module was required 1';
const moduleOutput2 = 'Module was required 2';

it('should be executed with module when described', (done) => {
process.chdir(codecept_dir);
exec(`${runner} ${_codecept_run}/codecept.require.multiple.single.json default`, (err, stdout, stderr) => {
stdout.should.include(moduleOutput);
stdout.should.not.include(moduleOutput2);
(stdout.match(new RegExp(moduleOutput, 'g')) || []).should.have.lengthOf(2);
assert(!err);
done();
});
});

it('should be executed with several module when described', (done) => {
process.chdir(codecept_dir);
exec(`${runner} ${_codecept_run}/codecept.require.multiple.several.json default`, (err, stdout, stderr) => {
stdout.should.include(moduleOutput);
stdout.should.include(moduleOutput2);
(stdout.match(new RegExp(moduleOutput, 'g')) || []).should.have.lengthOf(2);
(stdout.match(new RegExp(moduleOutput2, 'g')) || []).should.have.lengthOf(2);
assert(!err);
done();
});
});

it('should not be executed without module when not described', (done) => {
process.chdir(codecept_dir);
exec(`${runner} ${_codecept_run}/codecept.require.multiple.without.json default`, (err, stdout, stderr) => {
stdout.should.not.include(moduleOutput);
stdout.should.not.include(moduleOutput2);
assert(!err);
done();
});
});
});
});

0 comments on commit 8f9bc47

Please sign in to comment.