@jh86/icedfrisby
v0.2.5
Published
IcedFrisby: REST API Endpoint Testing built on Mocha and Chai
Downloads
5
Maintainers
Readme
IcedFrisby
IcedFrisby is a Node.js npm module that makes testing API endpoints easy, fast and fun. Based on the original Frisby project.
:orange_book: API Documentation
The IcedFrisby API Docs are located in API.md.
Changelog
The IcedFrisby Changelog is located in CHANGELOG.md.
What makes IcedFrisby different?
- Uses Mocha as the driver instead of Jasmine
- Uses Chai for assertions
- Uses Joi for flexible and simple schema/type JSON validation
- expectJSON(...) is now strict. Undefined/null fields are not ignored and missing fields are considered errors
- Adds expectContainsJSON(...)! Test JSON responses without knowing every field.
- Uses lodash instead of underscore
- Returns a 599 (network timeout error) response if a request times out or is unavailable instead of a 500
Installation
Install IcedFrisby from NPM:
npm install icedfrisby --save-dev
Show me some code!
IcedFrisby tests start with frisby.create()
with a description of the test followed by one of get()
, put()
, post()
, delete()
, or head()
, and ending with toss()
to generate the resulting Mocha test. There is a expectStatus()
method built in to more easily test HTTP status codes. Any other Mocha expect
tests should be done inside the after()
or afterJSON()
callback.
Each set of unique sequences or API endpoint tests should be started with new frisby.toss
method calls instead of trying to chain multiple HTTP requests together.
var frisby = require('icedfrisby'); // get IcedFrisby with `npm install icedfrisby`
var Joi = require('joi'); // get Joi with `npm install joi`
var URL = 'http://localhost:3000/';
var URL_AUTH = 'http://username:password@localhost:3000/';
frisby.globalSetup({ // globalSetup is for ALL requests
request: {
headers: { 'X-Auth-Token': 'fa8426a0-8eaf-4d22-8e13-7c1b16a9370c' }
}
});
frisby.create('GET user johndoe')
.get(URL + '/users/3.json')
.expectStatus(200)
.expectJSONTypes({
id: Joi.number(),
username: Joi.string(),
is_admin: Joi.boolean()
})
.expectJSON({
id: 3,
username: 'johndoe',
is_admin: false
})
.expectJSONTypes({
id: Joi.number(),
username: Joi.string(),
is_admin: Joi.boolean()
})
// 'afterJSON' automatically parses response body as JSON and passes it as an argument
.afterJSON(function(user) {
// You can use any normal assertions here
expect(1+1).to.equal(2);
// Use data from previous result in next test
frisby.create('Update user')
.put(URL_AUTH + '/users/' + user.id + '.json', {tags: ['mocha', 'bdd']})
.expectStatus(200)
.toss();
})
.toss();
Any Mocha/Chai/whatever tests can be used inside the after
and afterJSON
callbacks to perform additional or custom tests on the response data.
Running Tests
Run tests as you normally would with Mocha.
Install Mocha
npm install -g mocha
Run it from the CLI
cd your/project
mocha tests/someTest.js --reporter nyan
IcedFrisby Development
Setup
Code quality is enforced with JSHint. You will need to install JSHint as it is run with the tests: npm install -g jshint
Code Coverage
You can assess code coverage by running istanbul cover _mocha ./spec/**/*_spec.js -R spec
Contributions
Contributions are awesome! If you have an idea or code that you want to contribute, feel free to submit a pull request and I will gladly review it. I am open to pretty much anything.
Roadmap
- Make output errors more useful. It can be hard to track down which assertion is causing what error.
- Add a "stack trace" for paths to help discern why a path traversal failed
- Support chained tests/promises. Related: #127, #154, #200
- custom assertion plugin support