npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

isapi.js

v2.0.6

Published

Chained Rest functions for testing API with Mocha or Jasmine.

Downloads

2

Readme

isAPI.js

Node.js Library for testing API endpoints with chained HTTP methods.

Still very pre-beta. No tests for the test yet.

   api
    .path("/maker/100").
    .json()
    .get()
    .assertions(
      { 
        '$.data.name': function(val) { assert.equal(val, 'Vermont Blue') },
        '$.data._id': function(val) { assert.equal(val, 100) }
      }
    )
    .done();

Objective

Provide a super DRY API testing pattern, using the jQuery Chaining of REST attributes. Mocha and Jasmine both provide support for testing asynch calls. During the development of an API that requires OAuth for all not Get calls I found the tests were getting out of hand. This library was written to make may tests readable, even late night¡

  • JQuery like chainable methods!
  • Provide the ability to test all elements of an API call, options, response, status codes.
  • Provide Custom callbacks for response parsing.
  • Support for both Mocha and Jasmine
  • Provide Custom Authentication callbacks for different OAuth Signatures.

Installation

This is a NPM package. You can download from the package, or call the Github.


  npm install isAPI
  or 
  npm install "git://github.com/d1b1/isAPI.js.git#master",

  // Sample code.
  var isAPI = require('isapi');
  var api = new isAPI;

  // Provide the hostname (do not include HTTP)
  api.host('api.formagg.io');

Defaults

To keep things DRY and readable, a few things are assumes or defined once. You can of course make your API rests as explicit as you want. The following are assumed.

  • All requests are assume to be JSON (application/json). use the json() or contenttype() to change.
  • If no Verb is defined then all request are assumed to be GETs.
  • If no protocal is defined its assumed to be HTTP. Use http() or https() to set explicitly.

Example of a GET

This will call the /maker/ID path with a GET and will test the statusCode, data and raw.


  describe("/Maker", function(done) {   
    it("should return a maker", function(done){

      api
        .path("/maker/1").query('a=111').query('b=111')
        .json()
        .get()
        .assertions(
          { 
            '$.statusCode': function(val) { assert.equal(val, 401) },
            '$.data': function(val) { assert.equal(val, 'Unauthorized') },
            '$.raw': function(val) { assert.equal(val, '111') }
          }
        )
        .done(done);

    );

  });

Example of a Post

Here is an example of a HTTP Post. The data for the request is defined in the .post() method.

  // Create a new Maker in the formagg.io API with Name, Country and State,
  // using a Post, and entpint of /maker. Test passes if the result contains
  // the required fields.

  api
    .url("/maker")
    .post( 
     {
        name: "Vermont Creamery",
        country: "United States",
        state: "Vermont"
     }
    )
    .success(
      {
        "$.statusCode": function(val) { assert.equal(val, 200),
        "$.data._id": function(val) { assert.equal(val, this.port.name), 
        "$.data.name": function(val) { assert.equal(val, this.port.name),
        "$.data.country": function(val) { assert.equal(val, this.port.country)
      }
    )
    .done(done);

Options

The are methods that help with setup and debugging of the calls.

.done(done) - Last element in the chain. Executes the call. (MUST BE LAST METHOD IN CHAIN). .debug() - Dumps out the HTTP requests and resulting data. Also .debug(true) or .debug(false) works during testing.

.Path() & .Query()

These two options can be used to either define a base path or to build a path using one or more sets.

.path( '/path/to' ) - Accepts a string. One for API call. .query() - Helper method to append values to the base path. Accepts the following .query( 'field=1') - Single key value string. .query( [ 'field=1', 'field2=2' ]) - Array of key values strings. .qerry( { field1: 1, field2: 2} ) - Object of key values.

.Json()

This sets the content type. Alternate versions. .contenttype('xml,json,html')

HTTP Verbs

Use the following to set the HTTP verb.

.get() - Sets the Method to 'GET'. Use can pass in a string, array or object argument to add to the path. .post() - Sets the Method to 'POST'. Argument (Object) is used in the request body. .put() - Sets the Method to 'PUT'. Argument (Object) is used in the request body. .delete() - Sets the Method to 'DELETE'.

Protocals

Currently this only supports HTTP. HTTPs is coming. Use the http() for https() to set the protocal at the call level.

.Post() & .Put

This sets the rest body. Accepts a object of key values pairs.

.Debug()

Optional method. This is a chainable method that enables or disables the debug output per call. Defaults to true when in the chain. Use true or false to enable or disable in existing tests.

Assertions

This an object with each key contains the HTTP request value or the data value to check. Its assumed you will want to test a number of elements in the API response. The JSONPath pattern is issued to parse the response and provide a patterns for testing elements, arrays and patterns in the data.

Read Stehan.Goessner Post for more about JSONPath.

Response Data Object

All response data is testable.

  • $.statusCode - HTTP statusCode (200, 401 etc).
  • $.options - Contains all the rest options; path, hostname, headers etc.
  • $.data - Parsed response data.
  • $.raw - Unparsed HTTP response string.

Dependencies

This code base curently assumes you are using the Mocha packages.

Roadmap

The following are features and changes planned for the next few weeks.

  • Storage of tests and results for chaining of API behaviors.
  • Better OAuth signature options.
  • HTTPS protocal support.
  • Test for the library.
  • Hints for API calls.
  • Swagger UI consumption.

Feedback is 100% welcome. The current code was hammered together late night to make testing easier and to get an API out the door.