Skip to content

jtbonhomme/seahorse

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

seahorse

Seahorse is a configurable mock REST API. I may be used for testing and it is written in javascript.

Install it

To use in a node script

% npm install seahorse --save

To use as a standalone server

% npm install -g seahorse

Use it

In a node script

Start a mock REST API server with a configuration file (config.json) that listen on port 3000 and displays 'apache-like' logs.

var server = require('seahorse');
console.log("Start seahorse server");
server.init('config.json', 3000, {"logs": true});

The initialization function prototype is :

server.init(file, port, options)
  • file (string) : can be both an absolute or a relative path to a configuration file
  • port (number) : allow to specify the port of the express server
  • options (object) : can activate extra functionnalities:
    • traces (boolean) : activates debug traces
    • logs (boolean) : activates apache logs traces
    • cors (boolean) : configures cors directives

As a standalone server

Start a mock REST API server with no configuration (no route defined) that listen on port 3000 by default.

% seahorse

Start a mock REST API server with a configuration file (config.json) that listen on port 4000.

% seahorse -f config.json -p 4000

Display help.

% seahorse config.json -h
Usage: seahorse [options] [-f <source>]

Options:
  --help    -h          display this text
  --version -v          output version
  --file    -f <source> load configuration file
  --logs    -l          activate logs   (default: no log)
  --trace   -t          activate traces (default: no trace)
  --nocors  -n          deactivate CORS (default: activated)
  --port    -p <port>   set port
  --rec     -r <output> works like a proxy ans records all requests in a output file

Examples:
  seahorse -f config.json
  seahorse --port 1234

As a javascript library

var server   = require('../vendor/seahorse.min').server;

var config = [
  {
    "httpRequest" : {
        "method" : "get",
        "path" : "/foo"
    },
    "httpResponse" : {
        "statusCode" : 200,
        "body" : "{\"key\": \"value\"}",
        "headers" : [ {
            "name": "Access-Control-Allow-Headers",
            "values": ["Content-Type, Authorization"]
        },
        {
            "name": "Content-Type",
            "values": ["application/json; charset=utf-8"]
        } ],
        "delay": 1
    }
  }
];

server.start(config, 3000);

See example/example.js for a very simple use of the lib.

Configuration file format

The configuration file contains an array of route objects. Every route object is built with two keys: httpRequest witch make seahorse check if a request matches with this route, and httpResponse that gives seahorse the appropriate response to send in case the request matches the route.

Read the configuration file schema to check the JSON syntax.

httpRequest key

The httpRequest key has a value that is an object that shall contains two keys: method (get, post, put or delete) and path. The path key may be either a simple string ("path": "/foo/api.json") or a regexp. To use regexp as route path, you shall prefix the regexp with a string "regexp:" ("path" : "regexp:^/foo/.*.json$") The previous example will match /foo/bar.json and /foo/bar/bas.json but will not match /foo.json neither foo/bar.jsonx

In addition, query parameters may be specified. The query key is an object in witch each key is a parameter with its value.

For example, the following httpRequest object :

httpRequest: {
  method: "get",
  path: "/foo",
  query: {
    "name": "john"
  }
}

Will math GET /foo?name=john, but will not match GET /foo, GET /foo?name=jack, GET /bar?name=john or POST /foo?name=john

httpResponse key

The httpResponse is an object that specify, if the request matches the httpRequest object:

  • the status code to be sent in the response with the key statusCode,
  • the payload can be specified with one of these keys
    • body : object to be returned in the response payload,
    • file : path of a static local file to be returned in the response payload,
    • static : local root path to search for resources to be returned in the response payload (for example, if path equals /foo/bar.txt and static equals /home/jtbonhomme/seahorse/static, the seahorse will serve the file /home/jtbonhomme/seahorse/static/foo/bar.txt)
  • optionnaly, in case of static file shall be served (use of file or static), you can specify a maximum bandwidth (in bytes per seconds) to serve the file. Use the route POST /rate to limit the bandwidth.
  • optionnaly, some headers to be added to the response,
  • and, optionnaly, a delay that will simulate server latency can be added.

Example

See example/config.json :

[{
  "httpRequest" : {
      "method" : "get",
      "path" : "/help",
      "query" : {
        "id": 1,
        "format": "json"
      }
  },
  "httpResponse" : {
      "statusCode" : 200,
      "file":"/Users/jean-thierrybonhomme/Developments/seahorse/lib/help.txt",
      "headers" : [ {
          "name": "Access-Control-Allow-Headers",
          "value": "Content-Type, Authorization"
      },
      {
          "name": "Content-Type",
          "value": "text/plain"
      } ],
      "delay": 2000
  }
}]

Buildin API

Seahorse uses a specific route for its internal needs (_config) Obviously, you can not use this path for your own needs.

Once you started seahorse (given you started it on localhost:3000), you can call /_config:

get /_config

Return the current configuration

% curl "https://localhost:3000/_config"
[{"httpRequest":{"method":"delete","path":"/help"},"httpResponse":{"statusCode":200,"body":"{\"key\": \"value\"}","headers":[{"name":"Access-Control-Allow-Headers","value":"Content-Type, Authorization"},{"name":"Content-Type","value":"application/json; charset=utf-8"}],"delay":1}}]

post /_config

Set a new configuration

% curl -X POST --data '[{"httpResquest":...}]' "https://localhost:3000/_config"

put /_config

Update the configuration. If new routes are specified, they will be added, else, current routes will be updated.

% curl -X PUT --data '[{"httpResquest":...}]' "https://localhost:3000/_config"

post /_rate/:bps

Update the maximum bitrate of the server for static resources serving. By default, the max bitrate is 2MBps (2 * 1000 * 1000 / 8 bit per second)

% curl "https://localhost:3000/_rate/5000 -X POST"
{"rate":5000}

get /_rate

Get the current bitrate.

% curl "https://localhost:3000/_rate"
{"rate":250000}

get /stream

A SSE functionnality is available on route get /stream.

post /stream/:event_name

Any event can be fired to all listeners with the route post /stream/:event_name Take care, for now, data SHALL be in JSON format.

To simulate a SSE event sent by the mock API, try :

curl -X POST -H "Content-Type: application/json" --data '{"data":{"326":[18,8,true,false]}, "signal":"LastChange"}' localhost:3000/stream/message

Test

Launch tests with :

% grunt test

Build

The build task will compile the seahorse 'vendor' library (/vendor/seahorse.js and /vendor/seahorse.min.js)

  • build and test
% grunt build
  • build only
% grunt build:only
  • install locally seahorse
% grunt build
% npm install -g .
% seahorse -f example/config.json -p 8080
% curl -ivvv 'https://127.0.0.1:8080/_config'

Thanks

This project uses these third packages:

Built with Grunt

The seahorse logo was designed by Les vieux garcons.

Todo

  • Add unit tests on content-lenght header in responses
  • Possible issue when using bandwidth field, no Content-length is sent in the response
  • Handle cookies

Licence

This software is provided under MIT licence.

About

Configurable mock REST API testing tool written in nodejs

Resources

License

Stars

Watchers

Forks

Packages

No packages published