Functional testing
Most basic integration test
import http from 'k6/http';
import { describe, expect } from 'https://jslib.k6.io/k6chaijs/4.3.4.3/index.js';
export const options = {
thresholds: {
checks: ['rate == 1.00'],
},
};
export default function () {
describe('Hello world!', () => {
const response = http.get('https://test-api.k6.io/public/crocodiles/');
expect(response.status, 'response status').to.equal(200);
expect(response).to.have.validJsonBody();
expect(response.json(), 'croc list').to.be.an('array');
});
}
Sample integration test
This test goes through several steps. It creates a new user account, authenticates, and interacts with protected resources.
import chai, { describe, expect } from 'https://jslib.k6.io/k6chaijs/4.3.4.3/index.js';
import { Httpx, Get } from 'https://jslib.k6.io/httpx/0.0.6/index.js';
import { randomString } from 'https://jslib.k6.io/k6-utils/1.0.0/index.js';
chai.config.logFailures = true;
export let options = {
thresholds: {
// fail the test if any checks fail or any requests fail
checks: ['rate == 1.00'],
http_req_failed: ['rate == 0.00'],
},
vus: 1,
iterations: 1,
};
let session = new Httpx({ baseURL: 'https://test-api.k6.io' });
function retrieveIndividualCrocodilesInABatch() {
describe('[Crocs service] Fetch public crocs one by one', () => {
let responses = session.batch([
new Get('/public/crocodiles/1/'),
new Get('/public/crocodiles/2/'),
new Get('/public/crocodiles/3/'),
]);
expect(responses, 'responses').to.be.an('array');
responses.forEach((response) => {
expect(response.status, 'response status').to.equal(200);
expect(response).to.have.validJsonBody();
expect(response.json(), 'crocodile').to.be.an('object');
expect(response.json(), 'crocodile').to.include.keys('age', 'name', 'id', 'sex');
expect(response.json(), 'crocodile').to.not.have.a.property('outfit');
});
});
}
function retrieveAllPublicCrocodiles() {
describe('[Crocs service] Fetch a list of crocs', () => {
let response = session.get('/public/crocodiles');
expect(response.status, 'response status').to.equal(200);
expect(response).to.have.validJsonBody();
expect(response.json(), 'croc list').to.be.an('array').lengthOf.above(5);
});
}
function validateAuthService() {
const USERNAME = `${randomString(10)}@example.com`;
const PASSWORD = 'superCroc2021';
describe('[Registration service] user registration', () => {
let sampleUser = {
username: USERNAME,
password: PASSWORD,
email: USERNAME,
first_name: 'John',
last_name: 'Smith',
};
let response = session.post(`/user/register/`, sampleUser);
expect(response.status, 'registration status').to.equal(201);
expect(response).to.have.validJsonBody();
});
describe('[Auth service] user authentication', () => {
let authData = {
username: USERNAME,
password: PASSWORD,
};
let resp = session.post(`/auth/token/login/`, authData);
expect(resp.status, 'Auth status').to.be.within(200, 204);
expect(resp).to.have.validJsonBody();
expect(resp.json()).to.have.a.property('access');
expect(resp.json('access'), 'auth token').to.be.a('string');
let authToken = resp.json('access');
// set the authorization header on the session for the subsequent requests.
session.addHeader('Authorization', `Bearer ${authToken}`);
});
}
function validateCrocodileCreation() {
// authentication happened before this call.
describe('[Croc service] Create a new crocodile', () => {
let payload = {
name: `Croc Name`,
sex: 'M',
date_of_birth: '2019-01-01',
};
let resp = session.post(`/my/crocodiles/`, payload);
expect(resp.status, 'Croc creation status').to.equal(201);
expect(resp).to.have.validJsonBody();
session.newCrocId = resp.json('id'); // caching croc ID for the future.
});
describe('[Croc service] Fetch private crocs', () => {
let response = session.get('/my/crocodiles/');
expect(response.status, 'response status').to.equal(200);
expect(response, 'private crocs').to.have.validJsonBody();
expect(response.json(), 'private crocs').to.not.be.empty;
});
}
export default function testSuite() {
retrieveIndividualCrocodilesInABatch();
retrieveAllPublicCrocodiles();
validateAuthService();
validateCrocodileCreation();
}
Full example showcasing all functionality
Here’s an auto-generated k6 test script showcasing all examples from the Chaijs API documentation.
import { describe, expect, chai } from 'https://jslib.k6.io/k6chaijs/4.3.4.3/index.js';
chai.config.aggregateChecks = false;
chai.config.logFailures = true;
export default function testSuite() {
describe('docs example 0', () => {
expect(function () {}).to.not.throw();
expect({ a: 1 }).to.not.have.property('b');
expect([1, 2]).to.be.an('array').that.does.not.include(3);
});
describe('docs example 1', () => {
expect(2).to.equal(2); // Recommended
expect(2).to.not.equal(1); // Not recommended
});
describe('docs example 2', () => {
// Target object deeply (but not strictly) equals `{a: 1}`
expect({ a: 1 }).to.deep.equal({ a: 1 });
expect({ a: 1 }).to.not.equal({ a: 1 });
// Target array deeply (but not strictly) includes `{a: 1}`
expect([{ a: 1 }]).to.deep.include({ a: 1 });
expect([{ a: 1 }]).to.not.include({ a: 1 });
// Target object deeply (but not strictly) includes `x: {a: 1}`
expect({ x: { a: 1 } }).to.deep.include({ x: { a: 1 } });
expect({ x: { a: 1 } }).to.not.include({ x: { a: 1 } });
// Target array deeply (but not strictly) has member `{a: 1}`
expect([{ a: 1 }]).to.have.deep.members([{ a: 1 }]);
expect([{ a: 1 }]).to.not.have.members([{ a: 1 }]);
// Target set deeply (but not strictly) has key `{a: 1}`
expect(new Set([{ a: 1 }])).to.have.deep.keys([{ a: 1 }]);
expect(new Set([{ a: 1 }])).to.not.have.keys([{ a: 1 }]);
// Target object deeply (but not strictly) has property `x: {a: 1}`
expect({ x: { a: 1 } }).to.have.deep.property('x', { a: 1 });
expect({ x: { a: 1 } }).to.not.have.property('x', { a: 1 });
});
describe('docs example 3', () => {
expect({ a: { b: ['x', 'y'] } }).to.have.nested.property('a.b[1]');
expect({ a: { b: ['x', 'y'] } }).to.nested.include({ 'a.b[1]': 'y' });
});
describe('docs example 4', () => {
expect({ '.a': { '[b]': 'x' } }).to.have.nested.property('\\.a.\\[b\\]');
expect({ '.a': { '[b]': 'x' } }).to.nested.include({ '\\.a.\\[b\\]': 'x' });
});
describe('docs example 5', () => {
Object.prototype.b = 2;
expect({ a: 1 }).to.have.own.property('a');
expect({ a: 1 }).to.have.property('b');
expect({ a: 1 }).to.not.have.own.property('b');
expect({ a: 1 }).to.own.include({ a: 1 });
expect({ a: 1 }).to.include({ b: 2 }).but.not.own.include({ b: 2 });
});
describe('docs example 6', () => {
expect([1, 2]).to.have.ordered.members([1, 2]).but.not.have.ordered.members([2, 1]);
});
describe('docs example 7', () => {
expect([1, 2, 3]).to.include.ordered.members([1, 2]).but.not.include.ordered.members([2, 3]);
});
describe('docs example 8', () => {
expect({ a: 1, b: 2 }).to.not.have.any.keys('c', 'd');
});
describe('docs example 9', () => {
expect({ a: 1, b: 2 }).to.have.all.keys('a', 'b');
});
describe('docs example 10', () => {
expect('foo').to.be.a('string');
expect({ a: 1 }).to.be.an('object');
expect(null).to.be.a('null');
expect(undefined).to.be.an('undefined');
expect(new Error()).to.be.an('error');
expect(Promise.resolve()).to.be.a('promise');
expect(new Float32Array()).to.be.a('float32array');
expect(Symbol()).to.be.a('symbol');
});
describe('docs example 11', () => {
var myObj = {
[Symbol.toStringTag]: 'myCustomType',
};
expect(myObj).to.be.a('myCustomType').but.not.an('object');
});
describe('docs example 12', () => {
expect([1, 2, 3]).to.be.an('array').that.includes(2);
expect([]).to.be.an('array').that.is.empty;
});
describe('docs example 13', () => {
expect('foo').to.be.a('string'); // Recommended
expect('foo').to.not.be.an('array'); // Not recommended
});
describe('docs example 14', () => {
expect(1).to.be.a('string', 'nooo why fail??');
expect(1, 'nooo why fail??').to.be.a('string');
});
describe('docs example 15', () => {
expect({ b: 2 }).to.have.a.property('b');
});
describe('docs example 16', () => {
expect('foobar').to.include('foo');
});
describe('docs example 17', () => {
expect([1, 2, 3]).to.include(2);
});
describe('docs example 18', () => {
expect({ a: 1, b: 2, c: 3 }).to.include({ a: 1, b: 2 });
});
describe('docs example 19', () => {
expect(new Set([1, 2])).to.include(2);
});
describe('docs example 20', () => {
expect(
new Map([
['a', 1],
['b', 2],
])
).to.include(2);
});
describe('docs example 21', () => {
expect([1, 2, 3]).to.be.an('array').that.includes(2);
});
describe('docs example 22', () => {
// Target array deeply (but not strictly) includes `{a: 1}`
expect([{ a: 1 }]).to.deep.include({ a: 1 });
expect([{ a: 1 }]).to.not.include({ a: 1 });
// Target object deeply (but not strictly) includes `x: {a: 1}`
expect({ x: { a: 1 } }).to.deep.include({ x: { a: 1 } });
expect({ x: { a: 1 } }).to.not.include({ x: { a: 1 } });
});
describe('docs example 23', () => {
Object.prototype.b = 2;
expect({ a: 1 }).to.own.include({ a: 1 });
expect({ a: 1 }).to.include({ b: 2 }).but.not.own.include({ b: 2 });
});
describe('docs example 24', () => {
expect({ a: { b: 2 } }).to.deep.own.include({ a: { b: 2 } });
});
describe('docs example 25', () => {
expect({ a: { b: ['x', 'y'] } }).to.nested.include({ 'a.b[1]': 'y' });
});
describe('docs example 26', () => {
expect({ '.a': { '[b]': 2 } }).to.nested.include({ '\\.a.\\[b\\]': 2 });
});
describe('docs example 27', () => {
expect({ a: { b: [{ c: 3 }] } }).to.deep.nested.include({ 'a.b[0]': { c: 3 } });
});
describe('docs example 28', () => {
expect('foobar').to.not.include('taco');
expect([1, 2, 3]).to.not.include(4);
});
describe('docs example 29', () => {
expect({ c: 3 }).to.not.have.any.keys('a', 'b'); // Recommended
expect({ c: 3 }).to.not.include({ a: 1, b: 2 }); // Not recommended
});
describe('docs example 30', () => {
expect({ a: 3, b: 4 }).to.include({ a: 3, b: 4 }); // Recommended
expect({ a: 3, b: 4 }).to.not.include({ a: 1, b: 2 }); // Not recommended
});
describe('docs example 31', () => {
expect([1, 2, 3]).to.include(4, 'nooo why fail??');
expect([1, 2, 3], 'nooo why fail??').to.include(4);
});
describe('docs example 32', () => {
// Target object's keys are a superset of ['a', 'b'] but not identical
expect({ a: 1, b: 2, c: 3 }).to.include.all.keys('a', 'b');
expect({ a: 1, b: 2, c: 3 }).to.not.have.all.keys('a', 'b');
// Target array is a superset of [1, 2] but not identical
expect([1, 2, 3]).to.include.members([1, 2]);
expect([1, 2, 3]).to.not.have.members([1, 2]);
// Duplicates in the subset are ignored
expect([1, 2, 3]).to.include.members([1, 2, 2, 2]);
});
describe('docs example 33', () => {
// Both assertions are identical
expect({ a: 1 }).to.include.any.keys('a', 'b');
expect({ a: 1 }).to.have.any.keys('a', 'b');
});
describe('docs example 34', () => {
expect(1).to.equal(1); // Recommended
expect(1).to.be.ok; // Not recommended
expect(true).to.be.true; // Recommended
expect(true).to.be.ok; // Not recommended
});
describe('docs example 35', () => {
expect(0).to.equal(0); // Recommended
expect(0).to.not.be.ok; // Not recommended
expect(false).to.be.false; // Recommended
expect(false).to.not.be.ok; // Not recommended
expect(null).to.be.null; // Recommended
expect(null).to.not.be.ok; // Not recommended
expect(undefined).to.be.undefined; // Recommended
expect(undefined).to.not.be.ok; // Not recommended
});
describe('docs example 36', () => {
expect(false, 'nooo why fail??').to.be.ok;
});
describe('docs example 37', () => {
expect(true).to.be.true;
});
describe('docs example 38', () => {
expect(false).to.be.false; // Recommended
expect(false).to.not.be.true; // Not recommended
expect(1).to.equal(1); // Recommended
expect(1).to.not.be.true; // Not recommended
});
describe('docs example 39', () => {
expect(false, 'nooo why fail??').to.be.true;
});
describe('docs example 40', () => {
expect(false).to.be.false;
});
describe('docs example 41', () => {
expect(true).to.be.true; // Recommended
expect(true).to.not.be.false; // Not recommended
expect(1).to.equal(1); // Recommended
expect(1).to.not.be.false; // Not recommended
});
describe('docs example 42', () => {
expect(true, 'nooo why fail??').to.be.false;
});
describe('docs example 43', () => {
expect(null).to.be.null;
});
describe('docs example 44', () => {
expect(1).to.equal(1); // Recommended
expect(1).to.not.be.null; // Not recommended
});
describe('docs example 45', () => {
expect(42, 'nooo why fail??').to.be.null;
});
describe('docs example 46', () => {
expect(undefined).to.be.undefined;
});
describe('docs example 47', () => {
expect(1).to.equal(1); // Recommended
expect(1).to.not.be.undefined; // Not recommended
});
describe('docs example 48', () => {
expect(42, 'nooo why fail??').to.be.undefined;
});
describe('docs example 49', () => {
expect(NaN).to.be.NaN;
});
describe('docs example 50', () => {
expect('foo').to.equal('foo'); // Recommended
expect('foo').to.not.be.NaN; // Not recommended
});
describe('docs example 51', () => {
expect(42, 'nooo why fail??').to.be.NaN;
});
describe('docs example 52', () => {
expect(1).to.equal(1); // Recommended
expect(1).to.exist; // Not recommended
expect(0).to.equal(0); // Recommended
expect(0).to.exist; // Not recommended
});
describe('docs example 53', () => {
expect(null).to.be.null; // Recommended
expect(null).to.not.exist; // Not recommended
expect(undefined).to.be.undefined; // Recommended
expect(undefined).to.not.exist; // Not recommended
});
describe('docs example 54', () => {
expect(null, 'nooo why fail??').to.exist;
});
describe('docs example 55', () => {
expect([]).to.be.empty;
expect('').to.be.empty;
});
describe('docs example 56', () => {
expect(new Set()).to.be.empty;
expect(new Map()).to.be.empty;
});
describe('docs example 57', () => {
expect({}).to.be.empty;
});
describe('docs example 58', () => {
expect([]).to.be.an('array').that.is.empty;
});
describe('docs example 59', () => {
expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
expect([1, 2, 3]).to.not.be.empty; // Not recommended
expect(new Set([1, 2, 3])).to.have.property('size', 3); // Recommended
expect(new Set([1, 2, 3])).to.not.be.empty; // Not recommended
expect(Object.keys({ a: 1 })).to.have.lengthOf(1); // Recommended
expect({ a: 1 }).to.not.be.empty; // Not recommended
});
describe('docs example 60', () => {
expect([1, 2, 3], 'nooo why fail??').to.be.empty;
});
describe('docs example 61', () => {
function test() {
expect(arguments).to.be.arguments;
}
test();
});
describe('docs example 62', () => {
expect('foo').to.be.a('string'); // Recommended
expect('foo').to.not.be.arguments; // Not recommended
});
describe('docs example 63', () => {
expect({}, 'nooo why fail??').to.be.arguments;
});
describe('docs example 64', () => {
expect(1).to.equal(1);
expect('foo').to.equal('foo');
});
describe('docs example 65', () => {
// Target object deeply (but not strictly) equals `{a: 1}`
expect({ a: 1 }).to.deep.equal({ a: 1 });
expect({ a: 1 }).to.not.equal({ a: 1 });
// Target array deeply (but not strictly) equals `[1, 2]`
expect([1, 2]).to.deep.equal([1, 2]);
expect([1, 2]).to.not.equal([1, 2]);
});
describe('docs example 66', () => {
expect(1).to.equal(1); // Recommended
expect(1).to.not.equal(2); // Not recommended
});
describe('docs example 67', () => {
expect(1).to.equal(2, 'nooo why fail??');
expect(1, 'nooo why fail??').to.equal(2);
});
describe('docs example 68', () => {
// Target object is deeply (but not strictly) equal to {a: 1}
expect({ a: 1 }).to.eql({ a: 1 }).but.not.equal({ a: 1 });
// Target array is deeply (but not strictly) equal to [1, 2]
expect([1, 2]).to.eql([1, 2]).but.not.equal([1, 2]);
});
describe('docs example 69', () => {
expect({ a: 1 }).to.eql({ a: 1 }); // Recommended
expect({ a: 1 }).to.not.eql({ b: 2 }); // Not recommended
});
describe('docs example 70', () => {
expect({ a: 1 }).to.eql({ b: 2 }, 'nooo why fail??');
expect({ a: 1 }, 'nooo why fail??').to.eql({ b: 2 });
});
describe('docs example 71', () => {
expect(2).to.equal(2); // Recommended
expect(2).to.be.above(1); // Not recommended
});
describe('docs example 72', () => {
expect('foo').to.have.lengthOf(3); // Recommended
expect('foo').to.have.lengthOf.above(2); // Not recommended
expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
expect([1, 2, 3]).to.have.lengthOf.above(2); // Not recommended
});
describe('docs example 73', () => {
expect(2).to.equal(2); // Recommended
expect(1).to.not.be.above(2); // Not recommended
});
describe('docs example 74', () => {
expect(1).to.be.above(2, 'nooo why fail??');
expect(1, 'nooo why fail??').to.be.above(2);
});
describe('docs example 75', () => {
expect(2).to.equal(2); // Recommended
expect(2).to.be.at.least(1); // Not recommended
expect(2).to.be.at.least(2); // Not recommended
});
describe('docs example 76', () => {
expect('foo').to.have.lengthOf(3); // Recommended
expect('foo').to.have.lengthOf.at.least(2); // Not recommended
expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
expect([1, 2, 3]).to.have.lengthOf.at.least(2); // Not recommended
});
describe('docs example 77', () => {
expect(1).to.equal(1); // Recommended
expect(1).to.not.be.at.least(2); // Not recommended
});
describe('docs example 78', () => {
expect(1).to.be.at.least(2, 'nooo why fail??');
expect(1, 'nooo why fail??').to.be.at.least(2);
});
describe('docs example 79', () => {
expect(1).to.equal(1); // Recommended
expect(1).to.be.below(2); // Not recommended
});
describe('docs example 80', () => {
expect('foo').to.have.lengthOf(3); // Recommended
expect('foo').to.have.lengthOf.below(4); // Not recommended
expect([1, 2, 3]).to.have.length(3); // Recommended
expect([1, 2, 3]).to.have.lengthOf.below(4); // Not recommended
});
describe('docs example 81', () => {
expect(2).to.equal(2); // Recommended
expect(2).to.not.be.below(1); // Not recommended
});
describe('docs example 82', () => {
expect(2).to.be.below(1, 'nooo why fail??');
expect(2, 'nooo why fail??').to.be.below(1);
});
describe('docs example 83', () => {
expect(1).to.equal(1); // Recommended
expect(1).to.be.at.most(2); // Not recommended
expect(1).to.be.at.most(1); // Not recommended
});
describe('docs example 84', () => {
expect('foo').to.have.lengthOf(3); // Recommended
expect('foo').to.have.lengthOf.at.most(4); // Not recommended
expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
expect([1, 2, 3]).to.have.lengthOf.at.most(4); // Not recommended
});
describe('docs example 85', () => {
expect(2).to.equal(2); // Recommended
expect(2).to.not.be.at.most(1); // Not recommended
});
describe('docs example 86', () => {
expect(2).to.be.at.most(1, 'nooo why fail??');
expect(2, 'nooo why fail??').to.be.at.most(1);
});
describe('docs example 87', () => {
expect(2).to.equal(2); // Recommended
expect(2).to.be.within(1, 3); // Not recommended
expect(2).to.be.within(2, 3); // Not recommended
expect(2).to.be.within(1, 2); // Not recommended
});
describe('docs example 88', () => {
expect('foo').to.have.lengthOf.within(2, 4); // Not recommended
expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
expect([1, 2, 3]).to.have.lengthOf.within(2, 4); // Not recommended
});
describe('docs example 89', () => {
expect(1).to.equal(1); // Recommended
expect(1).to.not.be.within(2, 4); // Not recommended
});
describe('docs example 90', () => {
expect(4).to.be.within(1, 3, 'nooo why fail??');
expect(4, 'nooo why fail??').to.be.within(1, 3);
});
describe('docs example 91', () => {
function Cat() {}
expect(new Cat()).to.be.an.instanceof(Cat);
expect([1, 2]).to.be.an.instanceof(Array);
});
describe('docs example 92', () => {
expect({ a: 1 }).to.not.be.an.instanceof(Array);
});
describe('docs example 93', () => {
expect(1).to.be.an.instanceof(Array, 'nooo why fail??');
expect(1, 'nooo why fail??').to.be.an.instanceof(Array);
});
describe('docs example 94', () => {
expect({ a: 1 }).to.have.property('a');
});
describe('docs example 95', () => {
expect({ a: 1 }).to.have.property('a', 1);
});
describe('docs example 96', () => {
// Target object deeply (but not strictly) has property `x: {a: 1}`
expect({ x: { a: 1 } }).to.have.deep.property('x', { a: 1 });
expect({ x: { a: 1 } }).to.not.have.property('x', { a: 1 });
});
describe('docs example 97', () => {
Object.prototype.b = 2;
expect({ a: 1 }).to.have.own.property('a');
expect({ a: 1 }).to.have.own.property('a', 1);
expect({ a: 1 }).to.have.property('b');
expect({ a: 1 }).to.not.have.own.property('b');
});
describe('docs example 98', () => {
expect({ x: { a: 1 } }).to.have.deep.own.property('x', { a: 1 });
});
describe('docs example 99', () => {
expect({ a: { b: ['x', 'y'] } }).to.have.nested.property('a.b[1]');
expect({ a: { b: ['x', 'y'] } }).to.have.nested.property('a.b[1]', 'y');
});
describe('docs example 100', () => {
expect({ '.a': { '[b]': 'x' } }).to.have.nested.property('\\.a.\\[b\\]');
});
describe('docs example 101', () => {
expect({ a: { b: [{ c: 3 }] } }).to.have.deep.nested.property('a.b[0]', { c: 3 });
});
describe('docs example 102', () => {
expect({ a: 1 }).to.not.have.property('b');
});
describe('docs example 103', () => {
expect({ b: 2 }).to.not.have.property('a'); // Recommended
expect({ b: 2 }).to.not.have.property('a', 1); // Not recommended
});
describe('docs example 104', () => {
expect({ a: 3 }).to.have.property('a', 3); // Recommended
expect({ a: 3 }).to.not.have.property('a', 1); // Not recommended
});
describe('docs example 105', () => {
expect({ a: 1 }).to.have.property('a').that.is.a('number');
});
describe('docs example 106', () => {
// Recommended
expect({ a: 1 }).to.have.property('a', 2, 'nooo why fail??');
expect({ a: 1 }, 'nooo why fail??').to.have.property('a', 2);
expect({ a: 1 }, 'nooo why fail??').to.have.property('b');
// Not recommended
expect({ a: 1 }).to.have.property('b', undefined, 'nooo why fail??');
});
describe('docs example 107', () => {
expect({ a: 1 }).to.have.ownPropertyDescriptor('a');
});
describe('docs example 108', () => {
expect({ a: 1 }).to.have.ownPropertyDescriptor('a', {
configurable: true,
enumerable: true,
writable: true,
value: 1,
});
});
describe('docs example 109', () => {
expect({ a: 1 }).to.not.have.ownPropertyDescriptor('b');
});
describe('docs example 110', () => {
// Recommended
expect({ b: 2 }).to.not.have.ownPropertyDescriptor('a');
// Not recommended
expect({ b: 2 }).to.not.have.ownPropertyDescriptor('a', {
configurable: true,
enumerable: true,
writable: true,
value: 1,
});
});
describe('docs example 111', () => {
// Recommended
expect({ a: 3 }).to.have.ownPropertyDescriptor('a', {
configurable: true,
enumerable: true,
writable: true,
value: 3,
});
// Not recommended
expect({ a: 3 }).to.not.have.ownPropertyDescriptor('a', {
configurable: true,
enumerable: true,
writable: true,
value: 1,
});
});
describe('docs example 112', () => {
expect({ a: 1 }).to.have.ownPropertyDescriptor('a').that.has.property('enumerable', true);
});
describe('docs example 113', () => {
// Recommended
expect({ a: 1 }).to.have.ownPropertyDescriptor(
'a',
{
configurable: true,
enumerable: true,
writable: true,
value: 2,
},
'nooo why fail??'
);
// Recommended
expect({ a: 1 }, 'nooo why fail??').to.have.ownPropertyDescriptor('a', {
configurable: true,
enumerable: true,
writable: true,
value: 2,
});
// Recommended
expect({ a: 1 }, 'nooo why fail??').to.have.ownPropertyDescriptor('b');
// Not recommended
expect({ a: 1 }).to.have.ownPropertyDescriptor('b', undefined, 'nooo why fail??');
});
describe('docs example 114', () => {
expect([1, 2, 3]).to.have.lengthOf(3);
expect('foo').to.have.lengthOf(3);
expect(new Set([1, 2, 3])).to.have.lengthOf(3);
expect(
new Map([
['a', 1],
['b', 2],
['c', 3],
])
).to.have.lengthOf(3);
});
describe('docs example 115', () => {
expect('foo').to.have.lengthOf(3); // Recommended
expect('foo').to.not.have.lengthOf(4); // Not recommended
});
describe('docs example 116', () => {
expect([1, 2, 3]).to.have.lengthOf(2, 'nooo why fail??');
expect([1, 2, 3], 'nooo why fail??').to.have.lengthOf(2);
});
describe('docs example 117', () => {
// Recommended
expect([1, 2, 3]).to.have.lengthOf(3);
// Not recommended
expect([1, 2, 3]).to.have.lengthOf.above(2);
expect([1, 2, 3]).to.have.lengthOf.below(4);
expect([1, 2, 3]).to.have.lengthOf.at.least(3);
expect([1, 2, 3]).to.have.lengthOf.at.most(3);
expect([1, 2, 3]).to.have.lengthOf.within(2, 4);
});
describe('docs example 118', () => {
expect([1, 2, 3]).to.have.a.length(3); // incompatible; throws error
expect([1, 2, 3]).to.have.a.lengthOf(3); // passes as expected
});
describe('docs example 119', () => {
expect('foobar').to.match(/^foo/);
});
describe('docs example 120', () => {
expect('foobar').to.not.match(/taco/);
});
describe('docs example 121', () => {
expect('foobar').to.match(/taco/, 'nooo why fail??');
expect('foobar', 'nooo why fail??').to.match(/taco/);
});
describe('docs example 122', () => {
expect('foobar').to.have.string('bar');
});
describe('docs example 123', () => {
expect('foobar').to.not.have.string('taco');
});
describe('docs example 124', () => {
expect('foobar').to.have.string('taco', 'nooo why fail??');
expect('foobar', 'nooo why fail??').to.have.string('taco');
});
describe('docs example 125', () => {
expect({ a: 1, b: 2 }).to.have.all.keys('a', 'b');
expect(['x', 'y']).to.have.all.keys(0, 1);
expect({ a: 1, b: 2 }).to.have.all.keys(['a', 'b']);
expect(['x', 'y']).to.have.all.keys([0, 1]);
expect({ a: 1, b: 2 }).to.have.all.keys({ a: 4, b: 5 }); // ignore 4 and 5
expect(['x', 'y']).to.have.all.keys({ 0: 4, 1: 5 }); // ignore 4 and 5
});
describe('docs example 126', () => {
expect(
new Map([
['a', 1],
['b', 2],
])
).to.have.all.keys('a', 'b');
expect(new Set(['a', 'b'])).to.have.all.keys('a', 'b');
});
describe('docs example 127', () => {
expect({ a: 1, b: 2 }).to.be.an('object').that.has.all.keys('a', 'b');
});
describe('docs example 128', () => {
// Target set deeply (but not strictly) has key `{a: 1}`
expect(new Set([{ a: 1 }])).to.have.all.deep.keys([{ a: 1 }]);
expect(new Set([{ a: 1 }])).to.not.have.all.keys([{ a: 1 }]);
});
describe('docs example 129', () => {
// Recommended; asserts that target doesn't have any of the given keys
expect({ a: 1, b: 2 }).to.not.have.any.keys('c', 'd');
// Not recommended; asserts that target doesn't have all of the given
// keys but may or may not have some of them
expect({ a: 1, b: 2 }).to.not.have.all.keys('c', 'd');
});
describe('docs example 130', () => {
// Recommended; asserts that target has all the given keys
expect({ a: 1, b: 2 }).to.have.all.keys('a', 'b');
// Not recommended; asserts that target has at least one of the given
// keys but may or may not have more of them
expect({ a: 1, b: 2 }).to.have.any.keys('a', 'b');
});
describe('docs example 131', () => {
// Both assertions are identical
expect({ a: 1, b: 2 }).to.have.all.keys('a', 'b'); // Recommended
expect({ a: 1, b: 2 }).to.have.keys('a', 'b'); // Not recommended
});
describe('docs example 132', () => {
// Target object's keys are a superset of ['a', 'b'] but not identical
expect({ a: 1, b: 2, c: 3 }).to.include.all.keys('a', 'b');
expect({ a: 1, b: 2, c: 3 }).to.not.have.all.keys('a', 'b');
});
describe('docs example 133', () => {
// Both assertions are identical
expect({ a: 1 }).to.have.any.keys('a', 'b');
expect({ a: 1 }).to.include.any.keys('a', 'b');
});
describe('docs example 134', () => {
expect({ a: 1 }, 'nooo why fail??').to.have.key('b');
});
describe('docs example 135', () => {
var badFn = function () {
throw new TypeError('Illegal salmon!');
};
expect(badFn).to.throw();
});
describe('docs example 136', () => {
var badFn = function () {
throw new TypeError('Illegal salmon!');
};
expect(badFn).to.throw(TypeError);
});
describe('docs example 137', () => {
var err = new TypeError('Illegal salmon!');
var badFn = function () {
throw err;
};
expect(badFn).to.throw(err);
});
describe('docs example 138', () => {
var badFn = function () {
throw new TypeError('Illegal salmon!');
};
expect(badFn).to.throw('salmon');
});
describe('docs example 139', () => {
var badFn = function () {
throw new TypeError('Illegal salmon!');
};
expect(badFn).to.throw(/salmon/);
});
describe('docs example 140', () => {
var err = new TypeError('Illegal salmon!');
var badFn = function () {
throw err;
};
expect(badFn).to.throw(TypeError, 'salmon');
expect(badFn).to.throw(TypeError, /salmon/);
expect(badFn).to.throw(err, 'salmon');
expect(badFn).to.throw(err, /salmon/);
});
describe('docs example 141', () => {
var goodFn = function () {};
expect(goodFn).to.not.throw();
});
describe('docs example 142', () => {
var goodFn = function () {};
expect(goodFn).to.not.throw(); // Recommended
expect(goodFn).to.not.throw(ReferenceError, 'x'); // Not recommended
});
describe('docs example 143', () => {
var badFn = function () {
throw new TypeError('Illegal salmon!');
};
expect(badFn).to.throw(TypeError, 'salmon'); // Recommended
expect(badFn).to.not.throw(ReferenceError, 'x'); // Not recommended
});
describe('docs example 144', () => {
var err = new TypeError('Illegal salmon!');
err.code = 42;
var badFn = function () {
throw err;
};
expect(badFn).to.throw(TypeError).with.property('code', 42);
});
describe('docs example 145', () => {
var goodFn = function () {};
expect(goodFn).to.throw(TypeError, 'x', 'nooo why fail??');
expect(goodFn, 'nooo why fail??').to.throw();
});
describe('docs example 146', () => {
var fn = function () {
throw new TypeError('Illegal salmon!');
};
expect(fn).to.throw(); // Good! Tests `fn` as desired
expect(fn()).to.throw(); // Bad! Tests result of `fn()`, not `fn`
});
describe('docs example 147', () => {
expect(function () {
fn(42);
}).to.throw(); // Function expression
expect(() => fn(42)).to.throw(); // ES6 arrow function
});
describe('docs example 148', () => {
expect(function () {
cat.meow();
}).to.throw(); // Function expression
expect(() => cat.meow()).to.throw(); // ES6 arrow function
expect(cat.meow.bind(cat)).to.throw(); // Bind
});
describe('docs example 149', () => {
function Cat() {}
Cat.prototype.meow = function () {};
expect(new Cat()).to.respondTo('meow');
});
describe('docs example 150', () => {
function Cat() {}
Cat.prototype.meow = function () {};
expect(Cat).to.respondTo('meow');
});
describe('docs example 151', () => {
function Cat() {}
Cat.prototype.meow = function () {};
Cat.hiss = function () {};
expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow');
});
describe('docs example 152', () => {
function Cat() {}
Cat.prototype.meow = function () {};
expect(new Cat()).to.be.an('object').that.respondsTo('meow');
});
describe('docs example 153', () => {
function Dog() {}
Dog.prototype.bark = function () {};
expect(new Dog()).to.not.respondTo('meow');
});
describe('docs example 154', () => {
expect({}).to.respondTo('meow', 'nooo why fail??');
expect({}, 'nooo why fail??').to.respondTo('meow');
});
describe('docs example 155', () => {
function Cat() {}
Cat.prototype.meow = function () {};
Cat.hiss = function () {};
expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow');
});
describe('docs example 156', () => {
expect(1).to.satisfy(function (num) {
return num > 0;
});
});
describe('docs example 157', () => {
expect(1).to.not.satisfy(function (num) {
return num > 2;
});
});
describe('docs example 158', () => {
expect(1).to.satisfy(function (num) {
return num > 2;
}, 'nooo why fail??');
expect(1, 'nooo why fail??').to.satisfy(function (num) {
return num > 2;
});
});
describe('docs example 159', () => {
// Recommended
expect(1.5).to.equal(1.5);
// Not recommended
expect(1.5).to.be.closeTo(1, 0.5);
expect(1.5).to.be.closeTo(2, 0.5);
expect(1.5).to.be.closeTo(1, 1);
});
describe('docs example 160', () => {
expect(1.5).to.equal(1.5); // Recommended
expect(1.5).to.not.be.closeTo(3, 1); // Not recommended
});
describe('docs example 161', () => {
expect(1.5).to.be.closeTo(3, 1, 'nooo why fail??');
expect(1.5, 'nooo why fail??').to.be.closeTo(3, 1);
});
describe('docs example 162', () => {
expect([1, 2, 3]).to.have.members([2, 1, 3]);
expect([1, 2, 2]).to.have.members([2, 1, 2]);
});
describe('docs example 163', () => {
// Target array deeply (but not strictly) has member `{a: 1}`
expect([{ a: 1 }]).to.have.deep.members([{ a: 1 }]);
expect([{ a: 1 }]).to.not.have.members([{ a: 1 }]);
});
describe('docs example 164', () => {
expect([1, 2, 3]).to.have.ordered.members([1, 2, 3]);
expect([1, 2, 3]).to.have.members([2, 1, 3]).but.not.ordered.members([2, 1, 3]);
});
describe('docs example 165', () => {
// Target array is a superset of [1, 2] but not identical
expect([1, 2, 3]).to.include.members([1, 2]);
expect([1, 2, 3]).to.not.have.members([1, 2]);
// Duplicates in the subset are ignored
expect([1, 2, 3]).to.include.members([1, 2, 2, 2]);
});
describe('docs example 166', () => {
expect([{ a: 1 }, { b: 2 }, { c: 3 }])
.to.include.deep.ordered.members([{ a: 1 }, { b: 2 }])
.but.not.include.deep.ordered.members([{ b: 2 }, { c: 3 }]);
});
describe('docs example 167', () => {
expect([1, 2]).to.not.include(3).and.not.include(4); // Recommended
expect([1, 2]).to.not.have.members([3, 4]); // Not recommended
});
describe('docs example 168', () => {
expect([1, 2]).to.have.members([1, 2, 3], 'nooo why fail??');
expect([1, 2], 'nooo why fail??').to.have.members([1, 2, 3]);
});
describe('docs example 169', () => {
expect(1).to.equal(1); // Recommended
expect(1).to.be.oneOf([1, 2, 3]); // Not recommended
});
describe('docs example 170', () => {
expect(1).to.equal(1); // Recommended
expect(1).to.not.be.oneOf([2, 3, 4]); // Not recommended
});
describe('docs example 171', () => {
expect('Today is sunny').to.contain.oneOf(['sunny', 'cloudy']);
expect('Today is rainy').to.not.contain.oneOf(['sunny', 'cloudy']);
expect([1, 2, 3]).to.contain.oneOf([3, 4, 5]);
expect([1, 2, 3]).to.not.contain.oneOf([4, 5, 6]);
});
describe('docs example 172', () => {
expect(1).to.be.oneOf([2, 3, 4], 'nooo why fail??');
expect(1, 'nooo why fail??').to.be.oneOf([2, 3, 4]);
});
describe('docs example 173', () => {
var dots = '',
addDot = function () {
dots += '.';
},
getDots = function () {
return dots;
};
// Recommended
expect(getDots()).to.equal('');
addDot();
expect(getDots()).to.equal('.');
// Not recommended
expect(addDot).to.change(getDots);
});
describe('docs example 174', () => {
var myObj = { dots: '' },
addDot = function () {
myObj.dots += '.';
};
// Recommended
expect(myObj).to.have.property('dots', '');
addDot();
expect(myObj).to.have.property('dots', '.');
// Not recommended
expect(addDot).to.change(myObj, 'dots');
});
describe('docs example 175', () => {
var dots = '',
noop = function () {},
getDots = function () {
return dots;
};
expect(noop).to.not.change(getDots);
var myObj = { dots: '' },
noop = function () {};
expect(noop).to.not.change(myObj, 'dots');
});
describe('docs example 176', () => {
var myObj = { dots: '' },
addDot = function () {
myObj.dots += '.';
};
expect(addDot).to.not.change(myObj, 'dots', 'nooo why fail??');
var dots = '',
addDot = function () {
dots += '.';
},
getDots = function () {
return dots;
};
expect(addDot, 'nooo why fail??').to.not.change(getDots);
});
describe('docs example 177', () => {
var myObj = { val: 1 },
addTwo = function () {
myObj.val += 2;
},
subtractTwo = function () {
myObj.val -= 2;
};
expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended
expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended
expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended
expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended
});
describe('docs example 178', () => {
var val = 1,
addTwo = function () {
val += 2;
},
getVal = function () {
return val;
};
expect(addTwo).to.increase(getVal).by(2); // Recommended
expect(addTwo).to.increase(getVal); // Not recommended
});
describe('docs example 179', () => {
var myObj = { val: 1 },
addTwo = function () {
myObj.val += 2;
};
expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended
expect(addTwo).to.increase(myObj, 'val'); // Not recommended
});
describe('docs example 180', () => {
var myObj = { val: 1 },
subtractTwo = function () {
myObj.val -= 2;
};
expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended
expect(subtractTwo).to.not.increase(myObj, 'val'); // Not recommended
});
describe('docs example 181', () => {
var myObj = { val: 1 },
noop = function () {};
expect(noop).to.not.change(myObj, 'val'); // Recommended
expect(noop).to.not.increase(myObj, 'val'); // Not recommended
});
describe('docs example 182', () => {
var myObj = { val: 1 },
noop = function () {};
expect(noop).to.increase(myObj, 'val', 'nooo why fail??');
var val = 1,
noop = function () {},
getVal = function () {
return val;
};
expect(noop, 'nooo why fail??').to.increase(getVal);
});
describe('docs example 183', () => {
var val = 1,
subtractTwo = function () {
val -= 2;
},
getVal = function () {
return val;
};
expect(subtractTwo).to.decrease(getVal).by(2); // Recommended
expect(subtractTwo).to.decrease(getVal); // Not recommended
});
describe('docs example 184', () => {
var myObj = { val: 1 },
subtractTwo = function () {
myObj.val -= 2;
};
expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended
expect(subtractTwo).to.decrease(myObj, 'val'); // Not recommended
});
describe('docs example 185', () => {
var myObj = { val: 1 },
addTwo = function () {
myObj.val += 2;
};
expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended
expect(addTwo).to.not.decrease(myObj, 'val'); // Not recommended
});
describe('docs example 186', () => {
var myObj = { val: 1 },
noop = function () {};
expect(noop).to.not.change(myObj, 'val'); // Recommended
expect(noop).to.not.decrease(myObj, 'val'); // Not recommended
});
describe('docs example 187', () => {
var myObj = { val: 1 },
noop = function () {};
expect(noop).to.decrease(myObj, 'val', 'nooo why fail??');
var val = 1,
noop = function () {},
getVal = function () {
return val;
};
expect(noop, 'nooo why fail??').to.decrease(getVal);
});
describe('docs example 188', () => {
var myObj = { val: 1 },
addTwo = function () {
myObj.val += 2;
};
expect(addTwo).to.increase(myObj, 'val').by(2);
});
describe('docs example 189', () => {
var myObj = { val: 1 },
subtractTwo = function () {
myObj.val -= 2;
};
expect(subtractTwo).to.decrease(myObj, 'val').by(2);
});
describe('docs example 190', () => {
var myObj = { val: 1 },
addTwo = function () {
myObj.val += 2;
},
subtractTwo = function () {
myObj.val -= 2;
};
expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended
expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended
expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended
expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended
});
describe('docs example 191', () => {
var myObj = { val: 1 },
addTwo = function () {
myObj.val += 2;
};
// Recommended
expect(addTwo).to.increase(myObj, 'val').by(2);
// Not recommended
expect(addTwo).to.increase(myObj, 'val').but.not.by(3);
});
describe('docs example 192', () => {
var myObj = { val: 1 },
addTwo = function () {
myObj.val += 2;
};
expect(addTwo).to.increase(myObj, 'val').by(3, 'nooo why fail??');
expect(addTwo, 'nooo why fail??').to.increase(myObj, 'val').by(3);
});
describe('docs example 193', () => {
expect({ a: 1 }).to.be.extensible;
});
describe('docs example 194', () => {
var nonExtensibleObject = Object.preventExtensions({}),
sealedObject = Object.seal({}),
frozenObject = Object.freeze({});
expect(nonExtensibleObject).to.not.be.extensible;
expect(sealedObject).to.not.be.extensible;
expect(frozenObject).to.not.be.extensible;
expect(1).to.not.be.extensible;
});
describe('docs example 195', () => {
expect(1, 'nooo why fail??').to.be.extensible;
});
describe('docs example 196', () => {
var sealedObject = Object.seal({});
var frozenObject = Object.freeze({});
expect(sealedObject).to.be.sealed;
expect(frozenObject).to.be.sealed;
expect(1).to.be.sealed;
});
describe('docs example 197', () => {
expect({ a: 1 }).to.not.be.sealed;
});
describe('docs example 198', () => {
expect({ a: 1 }, 'nooo why fail??').to.be.sealed;
});
describe('docs example 199', () => {
var frozenObject = Object.freeze({});
expect(frozenObject).to.be.frozen;
expect(1).to.be.frozen;
});
describe('docs example 200', () => {
expect({ a: 1 }).to.not.be.frozen;
});
describe('docs example 201', () => {
expect({ a: 1 }, 'nooo why fail??').to.be.frozen;
});
describe('docs example 202', () => {
expect(1).to.be.finite;
});
describe('docs example 203', () => {
expect('foo').to.be.a('string'); // Recommended
expect('foo').to.not.be.finite; // Not recommended
});
describe('docs example 204', () => {
expect(NaN).to.be.NaN; // Recommended
expect(NaN).to.not.be.finite; // Not recommended
});
describe('docs example 205', () => {
expect(Infinity).to.equal(Infinity); // Recommended
expect(Infinity).to.not.be.finite; // Not recommended
});
describe('docs example 206', () => {
expect(-Infinity).to.equal(-Infinity); // Recommended
expect(-Infinity).to.not.be.finite; // Not recommended
});
describe('docs example 207', () => {
expect('foo', 'nooo why fail??').to.be.finite;
});
describe('docs example 208', () => {
expect.fail();
expect.fail('custom error message');
expect.fail(1, 2);
expect.fail(1, 2, 'custom error message');
expect.fail(1, 2, 'custom error message', '>');
expect.fail(1, 2, undefined, '>');
});
// describe('docs example 209', () => {
// should.fail();
// should.fail("custom error message");
// should.fail(1, 2);
// should.fail(1, 2, "custom error message");
// should.fail(1, 2, "custom error message", ">");
// should.fail(1, 2, undefined, ">");
// });
}