UNPKG

4.37 kBJavaScriptView Raw
1"use strict";
2// Copyright IBM Corp. 2017,2019. All Rights Reserved.
3// Node module: @loopback/testlab
4// This file is licensed under the MIT License.
5// License text available at https://opensource.org/licenses/MIT
6Object.defineProperty(exports, "__esModule", { value: true });
7/*
8 * HTTP Request/Response mocks
9 * https://github.com/hapijs/shot
10 */
11/* eslint-disable @typescript-eslint/no-explicit-any */
12const express = require("express");
13const util = require("util");
14const inject = require('@hapi/shot');
15exports.inject = inject;
16const ShotRequest = require('@hapi/shot/lib/request');
17function stubServerRequest(options) {
18 const stub = new ShotRequest(options);
19 // Hacky workaround for Express, see
20 // https://github.com/expressjs/express/blob/4.16.3/lib/middleware/init.js
21 // https://github.com/hapijs/shot/issues/82#issuecomment-247943773
22 // https://github.com/jfhbrook/pickleback
23 Object.assign(stub, ShotRequest.prototype);
24 return stub;
25}
26exports.stubServerRequest = stubServerRequest;
27const ShotResponse = require('@hapi/shot/lib/response');
28function stubServerResponse(request, onEnd) {
29 const stub = new ShotResponse(request, onEnd);
30 // Hacky workaround for Express, see
31 // https://github.com/expressjs/express/blob/4.16.3/lib/middleware/init.js
32 // https://github.com/hapijs/shot/issues/82#issuecomment-247943773
33 // https://github.com/jfhbrook/pickleback
34 Object.assign(stub, ShotResponse.prototype);
35 return stub;
36}
37exports.stubServerResponse = stubServerResponse;
38function stubHandlerContext(requestOptions = { url: '/' }) {
39 const request = stubServerRequest(requestOptions);
40 let response;
41 const result = new Promise(resolve => {
42 response = new ShotResponse(request, resolve);
43 });
44 const context = { request, response: response, result };
45 defineCustomContextInspect(context, requestOptions);
46 return context;
47}
48exports.stubHandlerContext = stubHandlerContext;
49function stubExpressContext(requestOptions = { url: '/' }) {
50 const app = express();
51 const request = new ShotRequest(requestOptions);
52 // mix in Express Request API
53 const RequestApi = express.request;
54 for (const key of Object.getOwnPropertyNames(RequestApi)) {
55 Object.defineProperty(request, key, Object.getOwnPropertyDescriptor(RequestApi, key));
56 }
57 request.app = app;
58 request.originalUrl = request.url;
59 parseQuery(request);
60 let response;
61 const result = new Promise(resolve => {
62 response = new ShotResponse(request, resolve);
63 // mix in Express Response API
64 Object.assign(response, express.response);
65 const ResponseApi = express.response;
66 for (const key of Object.getOwnPropertyNames(ResponseApi)) {
67 Object.defineProperty(response, key, Object.getOwnPropertyDescriptor(ResponseApi, key));
68 }
69 response.app = app;
70 response.req = request;
71 request.res = response;
72 });
73 const context = { app, request, response: response, result };
74 defineCustomContextInspect(context, requestOptions);
75 return context;
76}
77exports.stubExpressContext = stubExpressContext;
78/**
79 * Use `express.query` to parse the query string into `request.query` object
80 * @param request - Express http request object
81 */
82function parseQuery(request) {
83 // Use `express.query` to parse the query string
84 // See https://github.com/expressjs/express/blob/master/lib/express.js#L79
85 // See https://github.com/expressjs/express/blob/master/lib/middleware/query.js
86 express.query()(request, {}, () => { });
87}
88function defineCustomContextInspect(context, requestOptions) {
89 // Setup custom inspect functions to make test error messages easier to read
90 const inspectOpts = (depth, opts) => util.inspect(requestOptions, opts);
91 defineCustomInspect(context.request, (depth, opts) => `[RequestStub with options ${inspectOpts(depth, opts)}]`);
92 defineCustomInspect(context.response, (depth, opts) => `[ResponseStub for request with options ${inspectOpts(depth, opts)}]`);
93 context.result = context.result.then(r => {
94 defineCustomInspect(r, (depth, opts) => `[ObservedResponse for request with options ${inspectOpts(depth, opts)}]`);
95 return r;
96 });
97}
98function defineCustomInspect(obj, inspectFn) {
99 obj[util.inspect.custom] = inspectFn;
100}
101//# sourceMappingURL=shot.js.map
\No newline at end of file