shot
Installation:

npm: npm install @hapi/shot

yarn: yarn add @hapi/shot

Introduction

Injects a fake HTTP request/response into a node HTTP server for simulating server logic, writing tests, or debugging. Does not use a socket connection so can be run against an inactive server (server not in listen mode).

Example

const Http = require('http');
const Shot = require('@hapi/shot');


const internals = {};


internals.main = async function () {

    const dispatch = function (req, res) {

        const reply = 'Hello World';
        res.writeHead(200, { 'Content-Type': 'text/plain', 'Content-Length': reply.length });
        res.end(reply);
    };

    const server = Http.createServer(dispatch);

    const res = await Shot.inject(dispatch, { method: 'get', url: '/' });
    console.log(res.payload);
};


internals.main();

Note how server.listen is never called.

Methods

await Shot.inject(dispatchFunc, options)

Injects a fake request into an HTTP server.

  • dispatchFunc - listener function. The same as you would pass to Http.createServer when making a node HTTP server. Has the signature function (req, res) where:
    • req - a simulated request object. Inherits from Stream.Readable.
    • res - a simulated response object. Inherits from node's Http.ServerResponse.
  • options - request options object where:
    • url - a string specifying the request URL.
    • method - a string specifying the HTTP request method, defaulting to 'GET'.
    • authority - a string specifying the HTTP HOST header value to be used if no header is provided, and the url does not include an authority component. Defaults to 'localhost'.
    • headers - an optional object containing request headers.
    • remoteAddress - an optional string specifying the client remote address. Defaults to '127.0.0.1'.
    • payload - an optional request payload. Can be a string, Buffer, Stream or object.
    • simulate - an object containing flags to simulate various conditions:
      • end - indicates whether the request will fire an end event. Defaults to undefined, meaning an end event will fire.
      • split - indicates whether the request payload will be split into chunks. Defaults to undefined, meaning payload will not be chunked.
      • error - whether the request will emit an error event. Defaults to undefined, meaning no error event will be emitted. If set to true, the emitted error will have a message of 'Simulated'.
      • close - whether the request will emit a close event. Defaults to undefined, meaning no close event will be emitted.
    • validate - Optional flag to validate this options object. Defaults to true.

Returns a response object where:

  • raw - an object containing the raw request and response objects where:
    • req - the simulated request object.
    • res - the simulated response object.
  • headers - an object containing the response headers.
  • statusCode - the HTTP status code.
  • statusMessage - the HTTP status message.
  • payload - the payload as a UTF-8 encoded string.
  • rawPayload - the raw payload as a Buffer.
  • trailers - an object containing the response trailers.

Shot.isInjection(obj)

Checks if given object obj is a Shot Request object.

Changelog

#112
Update joi
#109
work around Node's DEP0066
#108
Node V12 deprecation warning [DEP0066] OutgoingMessage.prototype._headers is deprecated
#106
Change module name
#101
Remove engines
#100
Update deps
#99
Updated lab to v17 to pass on Node v11
#92
skip not covered lines on node master
#90
Update joi
#89
Replace instanceof with symbol
#88
Update deps
#105
Commercial version of v3 branch
#85
Fix for node 8
#84
Fix node 8 issues
3.4.0
breaking changes
#83
Update deps
#81
Handle streams of utf8 encoded strings
#79
Remove custom output parsing and buffer payload chunks via write()
#76
Updated API docs to reflect new validate flag
#75
Cleanup validation and make it optional
#73
Add status message to response object
#71
add validation schema to shot
#74
Include statusMessage
#72
npmignore
#69
Update code to 3.x.x
#68
Test on node 6, update lab and fix tests
#67
Support stream payloads
#65
Adds quotes around node versions in travis file
#63
Add default port to host header when no port specified. Fixes #62
#61
Reduce function generation
#60
Refactor index.js into separate files
3.0.0
breaking changes
#59
Update README with ES6 styles
#58
Updated README for ES6 styles closes #59
#57
Set trailers in res.trailers rather than res.headers. Fixes #56
#56
Trailers should be added to res.trailers, not res.headers
#55
Fix broken tests
2.0.0
breaking changes
#52
Node >= 4 / es2015 updates
#51
Upgrade lab to 7.x.x. Closes #50
#47
Add authority option. Closes #46
#46
Add authority option for overriding default host header
#44
Always include a host header. Closes #43
#43
host header is not always set
#36
Inject request with specified the remote client IP address
#35
Client IP address
#33
Inconsistent assignment of rawPayload
#32
use rawPayload, convert to UTF8 after the whole buffer is available
#30
fix #7
#7
deprecated encoding 'binary' is used
#28
Add 'content-length' header matching payload length if none set
#27
add -L to test and test-cov
#24
Added Hoek.applyToDefaults.
#23
Use Hoek to assign defaults to options passed to inject. Fixes #22
#22
Use hoek to assign defaults to options passed to inject
#19
optionally accept an object as the `url`
#14
lab 4.0
#12
Remove repeated assignment
#11
Bring coverage back to 100%
#10
Bring coverage back to 100% after lab fix
#9
Support node 0.11
clipboard