cybernaut
Version:
Reliable, zero configuration end-to-end testing in BDD-style.
266 lines • 14.4 kB
JavaScript
// tslint:disable no-any
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const proxyquire = require("proxyquire");
const ava_1 = require("ava");
const sinon_1 = require("sinon");
const stubs_1 = require("./stubs");
proxyquire.noPreserveCache();
proxyquire.preserveCache();
proxyquire('../config', { path: { resolve: stubs_1.configStubs.resolve } });
const config_1 = require("../config");
const customConfig = {
capabilities: { browserName: 'foo' },
concurrency: 123,
dependencies: ['foo'],
exclude: ['bar'],
include: 'foo',
retries: 456,
retryDelay: 789,
screenshotDirectory: 'bar',
timeouts: { element: 123, page: 456, script: 789 }
};
const defaultConfig = {
capabilities: { browserName: 'chrome' },
concurrency: 1,
dependencies: ['chromedriver'],
exclude: ['**/node_modules/**/*'],
include: '**/*.e2e.js',
retries: 4,
retryDelay: 500,
screenshotDirectory: 'screenshots',
timeouts: { element: 0, page: 30000, script: 30000 }
};
ava_1.default.beforeEach(() => {
stubs_1.resetAll(stubs_1.configStubs);
stubs_1.configStubs.resolve.returns('filename');
});
ava_1.default('`loadConfig` should return the default config', t => {
t.plan(3);
const _require = sinon_1.stub().returns(customConfig);
t.deepEqual(config_1.loadConfig(undefined, _require), defaultConfig);
t.is(stubs_1.configStubs.resolve.callCount, 0);
t.is(_require.callCount, 0);
});
ava_1.default('`loadConfig` should return a completely custom config', t => {
t.plan(5);
const _require = sinon_1.stub().returns(customConfig);
t.deepEqual(config_1.loadConfig('foo', _require), customConfig);
t.is(stubs_1.configStubs.resolve.callCount, 1);
t.is(stubs_1.configStubs.resolve.args[0][0], 'foo');
t.is(_require.callCount, 1);
t.is(_require.args[0][0], 'filename');
});
ava_1.default('`loadConfig` should return a partly custom config', t => {
t.plan(5);
const _require = sinon_1.stub().returns({ capabilities: { browserName: 'foo' } });
t.deepEqual(config_1.loadConfig('foo', _require), Object.assign({}, defaultConfig, { capabilities: { browserName: 'foo' } }));
t.is(stubs_1.configStubs.resolve.callCount, 1);
t.is(stubs_1.configStubs.resolve.args[0][0], 'foo');
t.is(_require.callCount, 1);
t.is(_require.args[0][0], 'filename');
});
ava_1.default('`loadConfig` should throw an error', t => {
t.plan(5);
const _require = sinon_1.stub().throws(new Error('foo'));
t.throws(() => config_1.loadConfig('bar', _require), 'foo');
t.is(stubs_1.configStubs.resolve.callCount, 1);
t.is(stubs_1.configStubs.resolve.args[0][0], 'bar');
t.is(_require.callCount, 1);
t.is(_require.args[0][0], 'filename');
});
ava_1.default('`validate` should return no errors', t => {
t.plan(4);
let config = defaultConfig;
t.deepEqual(config_1.validate(config), []);
// schema.properties.capabilities.additionalProperties
config = Object.assign({}, defaultConfig, { capabilities: { browserName: 'chrome', foo: 'bar' } });
t.deepEqual(config_1.validate(config), []);
// schema.properties.dependencies.minItems
config = Object.assign({}, defaultConfig, { dependencies: [] });
t.deepEqual(config_1.validate(config), []);
// schema.properties.exclude.minItems
config = Object.assign({}, defaultConfig, { exclude: [] });
t.deepEqual(config_1.validate(config), []);
});
ava_1.default('`validate` should return errors', t => {
t.plan(39);
// schema.type
let config = [];
t.deepEqual(config_1.validate(config), ['config should be object']);
// schema.required
config = {};
t.deepEqual(config_1.validate(config), [
'config should have required property \'capabilities\'',
'config should have required property \'concurrency\'',
'config should have required property \'dependencies\'',
'config should have required property \'exclude\'',
'config should have required property \'include\'',
'config should have required property \'retries\'',
'config should have required property \'retryDelay\'',
'config should have required property \'screenshotDirectory\'',
'config should have required property \'timeouts\''
]);
// schema.additionalProperties
config = Object.assign({}, defaultConfig, { foo: 'bar' });
t.deepEqual(config_1.validate(config), [
'config should NOT have additional properties'
]);
/****************************************************************************/
// schema.properties.capabilities.type
config = Object.assign({}, defaultConfig, { capabilities: [] });
t.deepEqual(config_1.validate(config), ['config.capabilities should be object']);
// schema.properties.capabilities.required
config = Object.assign({}, defaultConfig, { capabilities: {} });
t.deepEqual(config_1.validate(config), [
'config.capabilities should have required property \'browserName\''
]);
/****************************************************************************/
// schema.properties.capabilities.properties.browserName.enum
config = Object.assign({}, defaultConfig, { capabilities: { browserName: 'foo' } });
t.deepEqual(config_1.validate(config), [
'config.capabilities.browserName' +
' should be equal to one of the allowed values'
]);
/****************************************************************************/
// schema.properties.concurrency.type
config = Object.assign({}, defaultConfig, { concurrency: '123' });
t.deepEqual(config_1.validate(config), ['config.concurrency should be number']);
// schema.properties.concurrency.minimum
config = Object.assign({}, defaultConfig, { concurrency: 0 });
t.deepEqual(config_1.validate(config), ['config.concurrency should be >= 1']);
// schema.properties.concurrency.multipleOf
config = Object.assign({}, defaultConfig, { concurrency: 123.5 });
t.deepEqual(config_1.validate(config), ['config.concurrency should be multiple of 1']);
/****************************************************************************/
// schema.properties.dependencies.type
config = Object.assign({}, defaultConfig, { dependencies: {} });
t.deepEqual(config_1.validate(config), ['config.dependencies should be array']);
// schema.properties.dependencies.uniqueItems
config = Object.assign({}, defaultConfig, { dependencies: ['foo', 'foo'] });
t.deepEqual(config_1.validate(config), [
'config.dependencies should NOT have duplicate items ' +
'(items ## 0 and 1 are identical)'
]);
/****************************************************************************/
// schema.properties.dependencies.items.type
config = Object.assign({}, defaultConfig, { dependencies: [123] });
t.deepEqual(config_1.validate(config), ['config.dependencies[0] should be string']);
// schema.properties.dependencies.items.minLength
config = Object.assign({}, defaultConfig, { dependencies: [''] });
t.deepEqual(config_1.validate(config), [
'config.dependencies[0] should NOT be shorter than 1 characters'
]);
/****************************************************************************/
// schema.properties.exclude.type
config = Object.assign({}, defaultConfig, { exclude: {} });
t.deepEqual(config_1.validate(config), ['config.exclude should be array']);
// schema.properties.exclude.uniqueItems
config = Object.assign({}, defaultConfig, { exclude: ['foo', 'foo'] });
t.deepEqual(config_1.validate(config), [
'config.exclude should NOT have duplicate items ' +
'(items ## 0 and 1 are identical)'
]);
/****************************************************************************/
// schema.properties.exclude.items.type
config = Object.assign({}, defaultConfig, { exclude: [123] });
t.deepEqual(config_1.validate(config), ['config.exclude[0] should be string']);
// schema.properties.exclude.items.minLength
config = Object.assign({}, defaultConfig, { exclude: [''] });
t.deepEqual(config_1.validate(config), [
'config.exclude[0] should NOT be shorter than 1 characters'
]);
/****************************************************************************/
// schema.properties.include.type
config = Object.assign({}, defaultConfig, { include: 123 });
t.deepEqual(config_1.validate(config), ['config.include should be string']);
// schema.properties.include.minLength
config = Object.assign({}, defaultConfig, { include: '' });
t.deepEqual(config_1.validate(config), [
'config.include should NOT be shorter than 1 characters'
]);
/****************************************************************************/
// schema.properties.retries.type
config = Object.assign({}, defaultConfig, { retries: '123' });
t.deepEqual(config_1.validate(config), ['config.retries should be number']);
// schema.properties.retries.minimum
config = Object.assign({}, defaultConfig, { retries: -1 });
t.deepEqual(config_1.validate(config), ['config.retries should be >= 0']);
// schema.properties.retries.multipleOf
config = Object.assign({}, defaultConfig, { retries: 123.5 });
t.deepEqual(config_1.validate(config), ['config.retries should be multiple of 1']);
/****************************************************************************/
// schema.properties.retryDelay.type
config = Object.assign({}, defaultConfig, { retryDelay: '123' });
t.deepEqual(config_1.validate(config), ['config.retryDelay should be number']);
// schema.properties.retryDelay.minimum
config = Object.assign({}, defaultConfig, { retryDelay: -1 });
t.deepEqual(config_1.validate(config), ['config.retryDelay should be >= 0']);
// schema.properties.retryDelay.multipleOf
config = Object.assign({}, defaultConfig, { retryDelay: 123.5 });
t.deepEqual(config_1.validate(config), ['config.retryDelay should be multiple of 1']);
/****************************************************************************/
// schema.properties.screenshotDirectory.type
config = Object.assign({}, defaultConfig, { screenshotDirectory: 123 });
t.deepEqual(config_1.validate(config), [
'config.screenshotDirectory should be string'
]);
// schema.properties.screenshotDirectory.minLength
config = Object.assign({}, defaultConfig, { screenshotDirectory: '' });
t.deepEqual(config_1.validate(config), [
'config.screenshotDirectory should NOT be shorter than 1 characters'
]);
/****************************************************************************/
// schema.properties.timeouts.type
config = Object.assign({}, defaultConfig, { timeouts: [] });
t.deepEqual(config_1.validate(config), ['config.timeouts should be object']);
// schema.properties.timeouts.required
config = Object.assign({}, defaultConfig, { timeouts: {} });
t.deepEqual(config_1.validate(config), [
'config.timeouts should have required property \'element\'',
'config.timeouts should have required property \'page\'',
'config.timeouts should have required property \'script\''
]);
// schema.properties.timeouts.additionalProperties
config = Object.assign({}, defaultConfig, { timeouts: Object.assign({}, defaultConfig.timeouts, { foo: 'bar' }) });
t.deepEqual(config_1.validate(config), [
'config.timeouts should NOT have additional properties'
]);
/****************************************************************************/
// schema.properties.timeouts.properties.element.type
config = Object.assign({}, defaultConfig, { timeouts: Object.assign({}, defaultConfig.timeouts, { element: '123' }) });
t.deepEqual(config_1.validate(config), ['config.timeouts.element should be number']);
// schema.properties.timeouts.properties.element.minimum
config = Object.assign({}, defaultConfig, { timeouts: Object.assign({}, defaultConfig.timeouts, { element: -1 }) });
t.deepEqual(config_1.validate(config), ['config.timeouts.element should be >= 0']);
// schema.properties.timeouts.properties.element.multipleOf
config = Object.assign({}, defaultConfig, { timeouts: Object.assign({}, defaultConfig.timeouts, { element: 123.5 }) });
t.deepEqual(config_1.validate(config), [
'config.timeouts.element should be multiple of 1'
]);
/****************************************************************************/
// schema.properties.timeouts.properties.page.type
config = Object.assign({}, defaultConfig, { timeouts: Object.assign({}, defaultConfig.timeouts, { page: '123' }) });
t.deepEqual(config_1.validate(config), ['config.timeouts.page should be number']);
// schema.properties.timeouts.properties.page.minimum
config = Object.assign({}, defaultConfig, { timeouts: Object.assign({}, defaultConfig.timeouts, { page: -1 }) });
t.deepEqual(config_1.validate(config), ['config.timeouts.page should be >= 0']);
// schema.properties.timeouts.properties.page.multipleOf
config = Object.assign({}, defaultConfig, { timeouts: Object.assign({}, defaultConfig.timeouts, { page: 123.5 }) });
t.deepEqual(config_1.validate(config), [
'config.timeouts.page should be multiple of 1'
]);
/****************************************************************************/
// schema.properties.timeouts.properties.script.type
config = Object.assign({}, defaultConfig, { timeouts: Object.assign({}, defaultConfig.timeouts, { script: '123' }) });
t.deepEqual(config_1.validate(config), ['config.timeouts.script should be number']);
// schema.properties.timeouts.properties.script.minimum
config = Object.assign({}, defaultConfig, { timeouts: Object.assign({}, defaultConfig.timeouts, { script: -1 }) });
t.deepEqual(config_1.validate(config), ['config.timeouts.script should be >= 0']);
// schema.properties.timeouts.properties.script.multipleOf
config = Object.assign({}, defaultConfig, { timeouts: Object.assign({}, defaultConfig.timeouts, { script: 123.5 }) });
t.deepEqual(config_1.validate(config), [
'config.timeouts.script should be multiple of 1'
]);
});
//# sourceMappingURL=config.test.js.map