replay
Version:
When API testing slows you down: record and replay HTTP responses like a boss
116 lines (89 loc) • 4.1 kB
text/coffeescript
# The Replay module holds global configution properties and methods.
Catalog = require("./catalog")
Chain = require("./chain")
logger = require("./logger")
passThrough = require("./pass_through")
recorder = require("./recorder")
# Supported modes.
MODES = ["bloody", "cheat", "record", "replay"]
# Localhost servers. Pass requests directly to host, and route to 127.0.0.1.
localhosts = { localhost: true }
# Allowed servers. Allow network access to any servers listed here.
allowed = { }
# Ignored servers. Do not contact or record.
ignored = { }
Replay =
# The proxy chain. Essentially an array of proxies through which each request goes, from first to last. You
# generally don't need to use this unless you decide to reconstruct your own chain.
#
# When adding new proxies, you probably want those executing ahead of any existing proxies (certainly the pass-through
# proxy), so you'll want to prepend them. The `use` method will prepend a proxy to the chain.
chain: new Chain()
# Set this to true to dump more information to the console, or run with DEBUG=true
debug: !!process.env.DEBUG
# Main directory for replay fixtures.
fixtures: null
# The mode we're running in, one of:
# bloody - Allow outbound HTTP requests, don't replay anything. Use this to test your code against changes to 3rd
# party API.
# cheat - Allow outbound HTTP requests, replay captured responses. This mode is particularly useful when new code
# makes new requests, but unstable yet and you don't want these requests saved.
# record - Allow outbound HTTP requests, capture responses for future replay. This mode allows you to capture and
# record new requests, e.g. when adding tests or making code changes.
# replay - Do not allow outbound HTTP requests, replay captured responses. This is the default mode and the one most
# useful for running tests
mode: process.env.REPLAY || "replay"
# Addes a proxy to the beginning of the processing chain, so it executes ahead of any existing proxy.
#
# Example
# replay.use replay.logger()
use: (proxy)->
Replay.chain.prepend proxy
# Allow network access to this host.
allow: (hosts...)->
for host in hosts
allowed[host] = true
delete ignored[host]
delete localhosts[host]
# True if this host is allowed network access.
isAllowed: (host)->
return !!allowed[host]
# Ignore network access to this host.
ignore: (hosts...)->
for host in hosts
ignored[host] = true
delete allowed[host]
delete localhosts[host]
# True if this host is on the ignored list.
isIgnored: (host)->
return !!ignored[host]
# Treats this host as localhost: requests are routed directory to 127.0.0.1, no replay. Useful when you want to send
# requests to the test server using its production host name.
#
# Example
# replay.localhost "www.example.com"
localhost: (hosts...)->
for host in hosts
localhosts[host] = true
delete allowed[host]
delete ignored[host]
# True if this host should be treated as localhost.
isLocalhost: (host)->
return !!localhosts[host]
# The catalog is responsible for loading pre-recorded responses into memory, from where they can be replayed, and
# storing captured responses.
Replay.catalog = new Catalog(Replay)
# The default processing chain (from first to last):
# - Pass through requests to localhost
# - Log request to console is `deubg` is true
# - Replay recorded responses
# - Pass through requests in bloody and cheat modes
Replay.use passThrough (request)->
return Replay.isAllowed(request.url.hostname) || (Replay.mode == "cheat" && !Replay.isIgnored(request.url.hostname))
Replay.use recorder(Replay)
Replay.use logger(Replay)
Replay.use passThrough (request)->
return Replay.isLocalhost(request.url.hostname) || Replay.mode == "bloody"
unless ~MODES.indexOf(Replay.mode)
throw new Error("Unsupported mode '#{Replay.mode}', must be one of #{MODES.join(", ")}.")
module.exports = Replay