Giter Club home page Giter Club logo

IcedFrisby

Build Status Coverage Status npm

IcedFrisby is a Node.js library that makes testing API endpoints easy, fast and fun.

📙 API Documentation

The IcedFrisby API Docs are located in API.md.

Changelog

The IcedFrisby Changelog is located in CHANGELOG.md.

Upgrading from 1.5.0 to 2.0.0

  1. Ensure you're using Node 8+.
  2. If using expectJSONTypes, add @hapi/joi to devDependencies.
  3. Replace calls to globalConfig() and reset() with calls to .config(). If necessary, create a helper function which invokes frisby.create().config().
  4. Consider running your tests using async run() instead of toss() if it improves your workflow.

The full set of changes is documented in the changelog.

What makes IcedFrisby different?

  • Uses Mocha as the driver
  • Uses Chai for assertions
  • Uses Joi for flexible and simple schema/type JSON validation
  • expectJSON(...) is strict. Undefined/null fields are not ignored and missing fields are considered errors
  • expectContainsJSON(...) tests JSON responses without knowing every field.
  • Returns a 599 (network timeout error) response if a request times out or is unavailable instead of a 500

Installation

Install IcedFrisby and Mocha from NPM:

npm install mocha icedfrisby --save-dev

If you are using expectJSONTypes, install Joi too:

npm install @hapi/joi --save-dev

IcedFrisby is built and tested against Node 8 and 10.

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.

const frisby = require('icedfrisby')
const Joi = require('@hapi/joi')

const URL = 'http://localhost:3000/'
const URL_AUTH = 'http://username:password@localhost:3000/'

frisby
  .create('GET user johndoe')
  .get(URL + '/users/3.json')
  .addHeader('X-Auth-Token', 'fa8426a0-8eaf-4d22-8e13-7c1b16a9370c')
  .expectStatus(200)
  .expectJSONTypes({
    id: Joi.number(),
    username: Joi.string(),
    is_admin: Joi.boolean(),
  })
  .expectJSON({
    id: 3,
    username: 'johndoe',
    is_admin: false,
  })
  // 'afterJSON' automatically parses response body as JSON and passes it as an argument
  .afterJSON(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.

For example:

cd your/project
mocha tests/someTest.js --reporter nyan

Plugins

Plugins can provide custom assertions, setup and teardown logic, and additional functionality. Plugins can be implemented in an application's test code or as a library.

To use a plugin, compose IcedFrisby with it:

const frisby = require('./icedfrisby-nock')(require('icedfrisby'))

or, more semantically, using the delightful mixwith:

const { mix } = require('mixwith')

const frisby = mix(require('icedfrisby')).with(require('./icedfrisby-nock'))

Writing your own plugin is easy. For more details see [CONTRIBUTING.md].

Contributing

Contributions are awesome! If you have an idea or code that you want to contribute, feel free to open an issue or a pull request and we will gladly review it. For more details see [CONTRIBUTING.md]

Code Coverage

You can assess code coverage by running npm run coverage.

Contributions

Contributions are awesome! If you have an idea or code that you want to contribute, feel free to open an issue or a pull request and we will gladly review it.

The library is post-1.0 now, so there is backward compatibility and future maintainability to consider. If you are adding functionality, you can also write a plugin and add a link here.

Maintainers

IcedFrisby is maintained by:

Roadmap

  1. Make output errors more useful. It can be hard to track down which assertion is causing what error.
  2. Add a "stack trace" for paths to help discern why a path traversal failed
  3. Support chained tests/promises. Related: #127, #154, #200
  4. custom assertion plugin support 🚀 #27

Acknowledgements

IcedFrisby was originally based on the Frisby project.

License

Licensed under the MIT/BSD license.

icedfrisby's Projects

icedfrisby icon icedfrisby

HTTP testing framework built on Mocha that makes testing API endpoints easy, fast, and fun

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.