UNPKG

@warp-drive/holodeck

Version:

⚡️ Simple, Fast HTTP Mocking for Tests

121 lines (113 loc) 4.89 kB
import { mock, getIsRecording } from './index.js'; /** * @public */ /** * @public */ /** * @public */ /** * Sets up Mocking for a GET request on the mock server * for the supplied url. * * The response body is generated by the supplied response function. * * Available options: * - status: the status code to return (default: 200) * - headers: the headers to return (default: {}) * - body: the body to match against for the request (default: null) * - RECORD: whether to record the request (default: false) * * @param url the url to mock, relative to the mock server host (e.g. `users/1`) * @param response a function which generates the response to return * @param options status, headers for the response, body to match against for the request, and whether to record the request * @return */ function GET(owner, url, response, options) { return mock(owner, () => ({ status: options?.status ?? 200, statusText: options?.statusText ?? 'OK', headers: options?.headers ?? {}, body: options?.body ?? null, method: 'GET', url, response: response() }), getIsRecording() || (options?.RECORD ?? false)); } const STATUS_TEXT_FOR = new Map([[200, 'OK'], [201, 'Created'], [202, 'Accepted'], [203, 'Non-Authoritative Information'], [204, 'No Content'], [205, 'Reset Content'], [206, 'Partial Content'], [207, 'Multi-Status'], [208, 'Already Reported'], [226, 'IM Used'], [300, 'Multiple Choices'], [301, 'Moved Permanently'], [302, 'Found'], [303, 'See Other'], [304, 'Not Modified'], [307, 'Temporary Redirect'], [308, 'Permanent Redirect'], [400, 'Bad Request'], [401, 'Unauthorized'], [402, 'Payment Required'], [403, 'Forbidden'], [404, 'Not Found'], [405, 'Method Not Allowed'], [406, 'Not Acceptable'], [407, 'Proxy Authentication Required'], [408, 'Request Timeout'], [409, 'Conflict'], [410, 'Gone'], [411, 'Length Required'], [412, 'Precondition Failed'], [413, 'Payload Too Large'], [414, 'URI Too Long'], [415, 'Unsupported Media Type'], [416, 'Range Not Satisfiable'], [417, 'Expectation Failed'], [419, 'Page Expired'], [420, 'Enhance Your Calm'], [421, 'Misdirected Request'], [422, 'Unprocessable Entity'], [423, 'Locked'], [424, 'Failed Dependency'], [425, 'Too Early'], [426, 'Upgrade Required'], [428, 'Precondition Required'], [429, 'Too Many Requests'], [430, 'Request Header Fields Too Large'], [431, 'Request Header Fields Too Large'], [450, 'Blocked By Windows Parental Controls'], [451, 'Unavailable For Legal Reasons'], [500, 'Internal Server Error'], [501, 'Not Implemented'], [502, 'Bad Gateway'], [503, 'Service Unavailable'], [504, 'Gateway Timeout'], [505, 'HTTP Version Not Supported'], [506, 'Variant Also Negotiates'], [507, 'Insufficient Storage'], [508, 'Loop Detected'], [509, 'Bandwidth Limit Exceeded'], [510, 'Not Extended'], [511, 'Network Authentication Required']]); /** * Mock a POST request */ function POST(owner, url, response, options) { return mock(owner, () => { const body = response(); const status = options?.status ?? (body ? 201 : 204); return { status: status, statusText: options?.statusText ?? STATUS_TEXT_FOR.get(status) ?? '', headers: options?.headers ?? {}, body: options?.body ?? null, method: 'POST', url, response: body }; }, getIsRecording() || (options?.RECORD ?? false)); } /** * mock a PUT request */ function PUT(owner, url, response, options) { return mock(owner, () => { const body = response(); const status = options?.status ?? (body ? 200 : 204); return { status: status, statusText: options?.statusText ?? STATUS_TEXT_FOR.get(status) ?? '', headers: options?.headers ?? {}, body: options?.body ?? null, method: 'PUT', url, response: body }; }, getIsRecording() || (options?.RECORD ?? false)); } /** * mock a PATCH request * */ function PATCH(owner, url, response, options) { return mock(owner, () => { const body = response(); const status = options?.status ?? (body ? 200 : 204); return { status: status, statusText: options?.statusText ?? STATUS_TEXT_FOR.get(status) ?? '', headers: options?.headers ?? {}, body: options?.body ?? null, method: 'PATCH', url, response: body }; }, getIsRecording() || (options?.RECORD ?? false)); } /** * mock a DELETE request */ function DELETE(owner, url, response, options) { return mock(owner, () => { const body = response(); const status = options?.status ?? (body ? 200 : 204); return { status: status, statusText: options?.statusText ?? STATUS_TEXT_FOR.get(status) ?? '', headers: options?.headers ?? {}, body: options?.body ?? null, method: 'DELETE', url, response: body }; }, getIsRecording() || (options?.RECORD ?? false)); } export { DELETE, GET, PATCH, POST, PUT };