Skip to main content
Module

x/chai/test/configuration.js

BDD / TDD assertion framework for node.js and the browser that can be paired with any testing framework.
Go to Latest
File
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814
describe('configuration', function () { var assert = chai.assert; var expect = chai.expect;
var origConfig;
beforeEach(function() { // backup current config function clone(o) { return JSON.parse(JSON.stringify(o)); } origConfig = clone(chai.config); });
afterEach(function() { // restore config Object.keys(origConfig).forEach(function(key) { chai.config[key] = origConfig[key]; }); });
describe('includeStack', function() { // Skip tests if `Error.captureStackTrace` is unsupported if (typeof Error.captureStackTrace === 'undefined') return;
try { throw Error(); } catch (err) { // Skip tests if `err.stack` is unsupported if (typeof err.stack === 'undefined') return; }
// Create overwritten assertions that always fail before(function () { chai.util.addProperty(chai.Assertion.prototype, 'tmpProperty', function () {}); chai.util.overwriteProperty(chai.Assertion.prototype, 'tmpProperty', function () { return function () { this.assert(false); }; });
chai.util.addMethod(chai.Assertion.prototype, 'tmpMethod', function () {}); chai.util.overwriteMethod(chai.Assertion.prototype, 'tmpMethod', function () { return function () { this.assert(false); }; });
chai.util.addChainableMethod(chai.Assertion.prototype, 'tmpChainableMethod', function () {}, function () {}); chai.util.overwriteChainableMethod(chai.Assertion.prototype, 'tmpChainableMethod', function (_super) { return function () { this.assert(false); }; }, function () { return function () {}; }); });
// Delete overwritten assertions after(function () { delete chai.Assertion.prototype.tmpProperty; delete chai.Assertion.prototype.tmpMethod; delete chai.Assertion.prototype.tmpChainableMethod; });
describe('expect interface', function () { // Functions that always throw an error function badPropertyAssertion() { expect(42).to.be.false; } function badOverwrittenPropertyAssertion() { expect(42).tmpProperty; } function badMethodAssertion() { expect(42).to.equal(false); } function badOverwrittenMethodAssertion() { expect(42).tmpMethod(); } function badChainableMethodAssertion() { expect(42).to.be.a('string'); } function badOverwrittenChainableMethodAssertion() { expect(42).tmpChainableMethod(); }
describe('when true', function () { describe('failed property assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = true;
try { badPropertyAssertion(); } catch (err) { caughtErr = err; } });
it('should include Chai frames in stack trace', function () { expect(caughtErr.stack).to.contain('propertyGetter');
if (typeof Proxy !== 'undefined' && typeof Reflect !== 'undefined') { expect(caughtErr.stack).to.contain('proxyGetter'); } });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badPropertyAssertion'); }); });
describe('failed overwritten property assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = true;
try { badOverwrittenPropertyAssertion(); } catch (err) { caughtErr = err; } });
it('should include Chai frames in stack trace', function () { expect(caughtErr.stack).to.contain('overwritingPropertyGetter');
if (typeof Proxy !== 'undefined' && typeof Reflect !== 'undefined') { expect(caughtErr.stack).to.contain('proxyGetter'); } });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badOverwrittenPropertyAssertion'); }); });
describe('failed method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = true;
try { badMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should include Chai frames in stack trace', function () { expect(caughtErr.stack).to.contain('methodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badMethodAssertion'); }); });
describe('failed overwritten method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = true;
try { badOverwrittenMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should include Chai frames in stack trace', function () { expect(caughtErr.stack).to.contain('overwritingMethodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badOverwrittenMethodAssertion'); }); });
describe('failed chainable method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = true;
try { badChainableMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should include Chai frames in stack trace', function () { expect(caughtErr.stack).to.contain('chainableMethodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badChainableMethodAssertion'); }); });
describe('failed overwritten chainable method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = true;
try { badOverwrittenChainableMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should include Chai frames in stack trace', function () { expect(caughtErr.stack).to.contain('overwritingChainableMethodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badOverwrittenChainableMethodAssertion'); }); }); });
describe('when false', function () { describe('failed property assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = false;
try { badPropertyAssertion(); } catch (err) { caughtErr = err; } });
it('should not include Chai frames in stack trace', function () { expect(caughtErr.stack).to.not.contain('propertyGetter');
if (typeof Proxy !== 'undefined' && typeof Reflect !== 'undefined') { expect(caughtErr.stack).to.not.contain('proxyGetter'); } });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badPropertyAssertion'); }); });
describe('failed overwritten property assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = false;
try { badOverwrittenPropertyAssertion(); } catch (err) { caughtErr = err; } });
it('should not include Chai frames in stack trace', function () { expect(caughtErr.stack).to.not.contain('overwritingPropertyGetter');
if (typeof Proxy !== 'undefined' && typeof Reflect !== 'undefined') { expect(caughtErr.stack).to.not.contain('proxyGetter'); } });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badOverwrittenPropertyAssertion'); }); });
describe('failed method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = false;
try { badMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should not include Chai frames in stack trace', function () { expect(caughtErr.stack).to.not.contain('methodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badMethodAssertion'); }); });
describe('failed overwritten method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = false;
try { badOverwrittenMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should not include Chai frames in stack trace', function () { expect(caughtErr.stack).to.not.contain('overwritingMethodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badOverwrittenMethodAssertion'); }); });
describe('failed chainable method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = false;
try { badChainableMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should not include Chai frames in stack trace', function () { expect(caughtErr.stack).to.not.contain('chainableMethodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badChainableMethodAssertion'); }); });
describe('failed overwritten chainable method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = false;
try { badOverwrittenChainableMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should not include Chai frames in stack trace', function () { expect(caughtErr.stack).to.not.contain('overwritingChainableMethodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badOverwrittenChainableMethodAssertion'); }); }); }); });
describe('should interface', function () { // Functions that always throw an error function badPropertyAssertion() { (42).should.be.false; } function badOverwrittenPropertyAssertion() { (42).should.tmpProperty; } function badMethodAssertion() { (42).should.equal(false); } function badOverwrittenMethodAssertion() { (42).should.tmpMethod(); } function badChainableMethodAssertion() { (42).should.be.a('string'); } function badOverwrittenChainableMethodAssertion() { (42).should.tmpChainableMethod(); }
describe('when true', function () { describe('failed property assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = true;
try { badPropertyAssertion(); } catch (err) { caughtErr = err; } });
it('should include Chai frames in stack trace', function () { expect(caughtErr.stack).to.contain('propertyGetter');
if (typeof Proxy !== 'undefined' && typeof Reflect !== 'undefined') { expect(caughtErr.stack).to.contain('proxyGetter'); } });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badPropertyAssertion'); }); });
describe('failed overwritten property assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = true;
try { badOverwrittenPropertyAssertion(); } catch (err) { caughtErr = err; } });
it('should include Chai frames in stack trace', function () { expect(caughtErr.stack).to.contain('overwritingPropertyGetter');
if (typeof Proxy !== 'undefined' && typeof Reflect !== 'undefined') { expect(caughtErr.stack).to.contain('proxyGetter'); } });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badOverwrittenPropertyAssertion'); }); });
describe('failed method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = true;
try { badMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should include Chai frames in stack trace', function () { expect(caughtErr.stack).to.contain('methodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badMethodAssertion'); }); });
describe('failed overwritten method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = true;
try { badOverwrittenMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should include Chai frames in stack trace', function () { expect(caughtErr.stack).to.contain('overwritingMethodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badOverwrittenMethodAssertion'); }); });
describe('failed chainable method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = true;
try { badChainableMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should include Chai frames in stack trace', function () { expect(caughtErr.stack).to.contain('chainableMethodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badChainableMethodAssertion'); }); });
describe('failed overwritten chainable method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = true;
try { badOverwrittenChainableMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should include Chai frames in stack trace', function () { expect(caughtErr.stack).to.contain('overwritingChainableMethodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badOverwrittenChainableMethodAssertion'); }); }); });
describe('when false', function () { describe('failed property assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = false;
try { badPropertyAssertion(); } catch (err) { caughtErr = err; } });
it('should not include Chai frames in stack trace', function () { expect(caughtErr.stack).to.not.contain('propertyGetter');
if (typeof Proxy !== 'undefined' && typeof Reflect !== 'undefined') { expect(caughtErr.stack).to.not.contain('proxyGetter'); } });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badPropertyAssertion'); }); });
describe('failed overwritten property assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = false;
try { badOverwrittenPropertyAssertion(); } catch (err) { caughtErr = err; } });
it('should not include Chai frames in stack trace', function () { expect(caughtErr.stack).to.not.contain('overwritingPropertyGetter');
if (typeof Proxy !== 'undefined' && typeof Reflect !== 'undefined') { expect(caughtErr.stack).to.not.contain('proxyGetter'); } });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badOverwrittenPropertyAssertion'); }); });
describe('failed method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = false;
try { badMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should not include Chai frames in stack trace', function () { expect(caughtErr.stack).to.not.contain('methodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badMethodAssertion'); }); });
describe('failed overwritten method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = false;
try { badOverwrittenMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should not include Chai frames in stack trace', function () { expect(caughtErr.stack).to.not.contain('overwritingMethodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badOverwrittenMethodAssertion'); }); });
describe('failed chainable method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = false;
try { badChainableMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should not include Chai frames in stack trace', function () { expect(caughtErr.stack).to.not.contain('chainableMethodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badChainableMethodAssertion'); }); });
describe('failed overwritten chainable method assertions', function () { var caughtErr = '__PRETEST__';
before(function () { chai.config.includeStack = false;
try { badOverwrittenChainableMethodAssertion(); } catch (err) { caughtErr = err; } });
it('should not include Chai frames in stack trace', function () { expect(caughtErr.stack).to.not.contain('overwritingChainableMethodWrapper'); });
it('should include user frames in stack trace', function () { expect(caughtErr.stack).to.contain('badOverwrittenChainableMethodAssertion'); }); }); }); }); });
describe('truncateThreshold', function() { it('is 20', function() { chai.config.truncateThreshold = 20;
err(function() { assert.deepEqual({v: 'something longer than 20'}, {v: 'x'}); }, "expected { Object (v) } to deeply equal { v: 'x' }"); });
it('is 0', function() { chai.config.truncateThreshold = 0;
err(function() { assert.deepEqual({v: 'something longer than 20'}, {v: 'x'}); }, "expected { v: 'something longer than 20' } to deeply equal { v: 'x' }"); }); });
describe('deprecated properties', function() { var origWarnFn; var warnings;
beforeEach(function() { origWarnFn = console.warn; warnings = []; console.warn = function(message) { warnings.push(message); }; });
afterEach(function() { console.warn = origWarnFn; });
it('Assertion.includeStack warns that it is deprecated', function() { chai.Assertion.includeStack;
assert.equal(warnings.length, 1); assert.equal(warnings[0], 'Assertion.includeStack is deprecated, use chai.config.includeStack instead.');
chai.Assertion.includeStack = true;
assert.equal(warnings.length, 2); assert.equal(warnings[1], 'Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); });
it('Assertion.includeStack is kept in sync with config.includeStack', function() { assert.equal(chai.Assertion.includeStack, chai.config.includeStack); chai.Assertion.includeStack = !chai.Assertion.includeStack; assert.equal(chai.Assertion.includeStack, chai.config.includeStack); chai.config.includeStack = !chai.config.includeStack; assert.equal(chai.Assertion.includeStack, chai.config.includeStack); });
it('Assertion.showDiff warns that it is deprecated', function() { chai.Assertion.showDiff;
assert.equal(warnings.length, 1); assert.equal(warnings[0], 'Assertion.showDiff is deprecated, use chai.config.showDiff instead.');
chai.Assertion.showDiff = true;
assert.equal(warnings.length, 2); assert.equal(warnings[1], 'Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); });
it('Assertion.showDiff is kept in sync with config.showDiff', function() { assert.equal(chai.Assertion.showDiff, chai.config.showDiff); chai.Assertion.showDiff = !chai.Assertion.showDiff; assert.equal(chai.Assertion.showDiff, chai.config.showDiff); chai.config.showDiff = !chai.config.showDiff; assert.equal(chai.Assertion.showDiff, chai.config.showDiff); }); });
describe('useProxy', function() { var readNoExistentProperty = function() { expect(false).to.be.tue; // typo: tue should be true };
it('should have default value equal to true', function() { expect(chai.config.useProxy).to.be.true; });
describe('when true', function() { it('should use proxy unless user\'s environment doesn\'t support', function() { if (typeof Proxy !== 'undefined' && typeof Reflect !== 'undefined') { expect(readNoExistentProperty).to.throw('Invalid Chai property: tue'); } else { expect(readNoExistentProperty).to.not.throw('Invalid Chai property: tue'); } }); });
describe('when false', function() { it('should not use proxy', function() { chai.config.useProxy = false;
expect(readNoExistentProperty).to.not.throw('Invalid Chai property: tue'); }); }); });
describe('proxyExcludedKeys', function() { var readNoExistentProperty = function(prop) { return function() { var assertion = expect(false); expect(assertion).to.not.have.key(prop); assertion[prop]; } };
it('should have default value equal to `[\'then\', \'catch\', \'inspect\', \'toJSON\']`', function() { expect(chai.config.proxyExcludedKeys).to.be.deep.equal(['then', 'catch', 'inspect', 'toJSON']); });
it('should not throw when accessing non-existing `then` and `inspect` in an environment with proxy support', function() { // Since these will not throw if the environment does not support proxies we don't need any `if` clause here expect(readNoExistentProperty('then')).to.not.throw(); expect(readNoExistentProperty('inspect')).to.not.throw(); });
it('should throw for properties which are not on the `proxyExcludedKeys` Array in an environment with proxy support', function() { chai.config.proxyExcludedKeys = [];
if (typeof Proxy !== 'undefined' && typeof Reflect !== 'undefined') { expect(readNoExistentProperty('then')).to.throw('Invalid Chai property: then'); expect(readNoExistentProperty('inspect')).to.throw('Invalid Chai property: inspect'); } else { expect(readNoExistentProperty('then')).to.not.throw(); expect(readNoExistentProperty('inspect')).to.not.throw(); } }); });});