Package Exports
- light-my-request
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (light-my-request) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Light my Request
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 inject = require('light-my-request')
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)
inject(dispatch, { method: 'get', url: '/' }, (err, res) => {
console.log(res.payload)
})
Note how server.listen
is never called.
Async await and promises are supported as well!
// promises
inject(dispatch, { method: 'get', url: '/' })
.then(res => console.log(res.payload))
.catch(console.log)
// async-await
try {
const res = await inject(dispatch, { method: 'get', url: '/' })
console.log(res.payload)
} catch (err) {
console.log(err)
}
File uploads (multipart/form-data) can be achieved by using form-data package as shown below:
const FormData = require('form-data')
const fs = require('fs')
try {
const form = new FormData()
form.append('myfile', fs.createReadStream(`./path/to/file`))
const res = await inject(dispatch, {
method: 'post',
url: '/upload',
payload: form,
headers: form.getHeaders()
})
console.log(res.payload)
} catch (err) {
console.log(err)
}
This module ships with a handwritten TypeScript declaration file for TS support. The declaration exports a single namespace LightMyRequest
. You can import it one of two ways:
import * as LightMyRequest from 'light-my-request'
const dispatch: LightMyRequest.DispatchFunc = function (req, res) {
const reply = 'Hello World'
res.writeHead(200, { 'Content-Type': 'text/plain', 'Content-Length': reply.length })
res.end(reply)
}
LightMyRequest.inject(dispatch, { method: 'get', url: '/' }, (err, res) => {
console.log(res.payload)
})
// or
import { inject, DistpatchFunc } from 'light-my-request'
const dispatch: DispatchFunc = function (req, res) {
const reply = 'Hello World'
res.writeHead(200, { 'Content-Type': 'text/plain', 'Content-Length': reply.length })
res.end(reply)
}
inject(dispatch, { method: 'get', url: '/' }, (err, res) => {
console.log(res.payload)
})
The declaration file exports types for the following parts of the API:
inject
- standard light-my-requestinject
methodDispatchFunc
- the fake HTTP dispatch functionInjectPayload
- a union type for valid payload typesisInjection
- standard light-my-requestisInjection
methodInjectOptions
- options object forinject
methodRequest
- custom light-my-requestrequest
object interface. Extends Node.jsstream.Readable
typeResponse
- custom light-my-re uestresponse
object interface. Extends Node.jshttp.ServerResponse
type
API
inject(dispatchFunc, options, callback)
Injects a fake request into an HTTP server.
dispatchFunc
- listener function. The same as you would pass toHttp.createServer
when making a node HTTP server. Has the signaturefunction (req, res)
where:req
- a simulated request object. Inherits fromStream.Readable
.res
- a simulated response object. Inherits from node'sHttp.ServerResponse
.
options
- request options object where:url
|path
- 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 theurl
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. If the payload is string, Buffer or Stream is used as is as the request payload. Oherwise it is serialized withJSON.stringify
forcing the request to have theContent-type
equal toapplication/json
query
- an optional object containing query parameters.body
- alias for payload.simulate
- an object containing flags to simulate various conditions:end
- indicates whether the request will fire anend
event. Defaults toundefined
, meaning anend
event will fire.split
- indicates whether the request payload will be split into chunks. Defaults toundefined
, meaning payload will not be chunked.error
- whether the request will emit anerror
event. Defaults toundefined
, meaning noerror
event will be emitted. If set totrue
, the emitted error will have a message of'Simulated'
.close
- whether the request will emit aclose
event. Defaults toundefined
, meaning noclose
event will be emitted.
validate
- Optional flag to validate this options object. Defaults totrue
.server
- Optional http server. It is used for binding thedispatchFunc
.
callback
- the callback function using the signaturefunction (err, res)
where:err
- error objectres
- 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.body
- alias for payload.rawPayload
- the raw payload as a Buffer.trailers
- an object containing the response trailers.
Note: You can also pass a string in place of the options
object as a shorthand for {url: string, method: 'GET'}
.
inject.isInjection(obj)
Checks if given object obj
is a light-my-request Request
object.
Acknowledgements
This project has been forked from hapi/shot
because we wanted to support Node ≥ v4 and not only Node ≥ v8.
All the credits before the commit 00a2a82 goes to the hapi/shot
project contributors.
Since the commit db8bced the project will be maintained by the Fastify team.
License
Licensed under BSD-3-Clause.