Record and playback HTTP requests
This is built to make testing against third party services a breeze. No longer will your test suite fail because an external service is down.
eight-track
has been forked by @twolfson as nine-track
. This includes new features such as scrubFn
for sanitizing data before saving to disk.
Install the module with: npm install eight-track
// Start up a basic applciation
var express = require('express');
var eightTrack = require('eight-track');
var request = require('request');
express().use(function (req, res) {
console.log('Pinged!');
res.send('Hello World!');
}).listen(1337);
// Create a server using a `eight-track` middleware to the original
express().use(eightTrack({
url: 'http://localhost:1337',
fixtureDir: 'directory/to/save/responses'
})).listen(1338);
// Hits original server, triggering a `console.log('Pinged!')` and 'Hello World!' response
request('http://localhost:1338/', console.log);
// Hits saved response but still receieves 'Hello World!' response
request('http://localhost:1338/', console.log);
eight-track
exposes eightTrack
as its module.exports
.
Middleware creator for new eightTrack's
. This is not a constructor.
- options
Object
- Container for parameters- url
String|Object
- URL of a server to proxy to- If it is a string, it should be the base URL of a server
- If it is an object, it should be parameters for
url.format
- fixtureDir
String
- Path to load/save HTTP responses- Files will be saved with the format
{{method}}_{{encodedUrl}}_{{hashOfRequestContent}}.json
- An example filename is
GET_%2F_658e61f2a6b2f1ae4c127e53f28dfecd.json
- Files will be saved with the format
- normalizeFn
Function
- Function to adjustrequest's
save location signature- If you would like to make two requests resolve from the same response file, this is how.
- The function signature should be
function (info)
and can either mutate theinfo
or return a fresh object info
will have the following properties- httpVersion
String
- HTTP version received fromrequest
(e.g.1.0
,1.1
) - headers
Object
- Headers received byrequest
- trailers
Object
- Trailers received byrequest
- method
String
- HTTP method that was used (e.g.GET
,POST
) - url
String
- Pathname thatrequest
arrived from - body
Buffer
- Buffered body that was written torequest
- httpVersion
- Existing
normalizeFn
libraries (e.g.multipart/form-data
can be found below)
- url
eightTrack
returns a middleware with the signature function (req, res)
// Example of string url
eightTrack({
url: 'http://localhost:1337',
fixtureDir: 'directory/to/save/responses'
});
// Example of object url
eightTrack({
url: {
protocol: 'http:',
hostname: 'localhost',
port: 1337
},
fixtureDir: 'directory/to/save/responses'
});
If you need to buffer the data before passing it off to eight-track
that is supported as well.
The requirement is that you record the data as a Buffer
or String
to req.body
.
multipart/form-data
- Ignore randomly generated boundaries and consolidate similarmultipart/form-data
requests
Forward an incoming HTTP request in a mikeal/request
-like format.
- req
http.IncomingMessage
- Inbound request to an HTTP server (e.g. fromhttp.createServer
)- Documentation: http://nodejs.org/api/http.html#http_http_incomingmessage
- cb
Function
- Callback function with(err, res, body)
signature- err
Error
- HTTP error if any occurred (e.g.ECONNREFUSED
) - res
Object
- Container that looks like an HTTP object but simiplified due to saving to disk- httpVersion
String
- HTTP version received from external server response (e.g.1.0
,1.1
) - headers
Object
- Headers received by response - trailers
Object
- Trailers received by response - statusCode
Number
- Status code received from external server response - body
Buffer
- Buffered body that was written to response
- httpVersion
- body
Buffer
- Sugar variable forres.body
- err
eight-track
can talk to servers that are behind a specific path
// Start up a server that echoes our path
express().use(function (req, res) {
res.send(req.path);
}).listen(1337);
// Create a server using a `eight-track` middleware to the original
express().use(eightTrack({
url: 'http://localhost:1337/hello',
fixtureDir: 'directory/to/save/responses'
})).listen(1338);
// Logs `/hello/world`, concatenated result of `/hello` and `/world` pathss
request('http://localhost:1338/world', console.log);
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint via grunt and test via npm test
.
Copyright (c) 2014 Uber
Licensed under the MIT license.