1 | 'use strict';
|
2 |
|
3 | module.exports = Grown => {
|
4 | const MockRes = require('mock-res');
|
5 |
|
6 | function _mockResponse() {
|
7 | const res = new MockRes();
|
8 |
|
9 | res._header = null;
|
10 | res.cookies = {};
|
11 | res.clearCookie = k => { delete res.cookies[k]; };
|
12 | res.cookie = (k, v, o) => { res.cookies[k] = { value: v, opts: o || {} }; };
|
13 |
|
14 | const _setHeader = res.setHeader;
|
15 | const _endCall = res.end.bind(res);
|
16 |
|
17 | res.setHeader = (k, v) => {
|
18 | res._header = true;
|
19 |
|
20 | if (k === 'set-cookie') {
|
21 | v.forEach(x => {
|
22 | const parts = x.split(';')[0].split('=');
|
23 |
|
24 | res.cookies[parts[0]] = parts[1];
|
25 | });
|
26 | }
|
27 |
|
28 | _setHeader.call(res, k, v);
|
29 | };
|
30 |
|
31 | res.end = x => {
|
32 | _endCall(x);
|
33 | res.emit('resume');
|
34 | };
|
35 |
|
36 | Object.defineProperty(res, 'body', {
|
37 | get: () => res._getString(),
|
38 | });
|
39 |
|
40 | Object.defineProperty(res, 'json', {
|
41 | get: () => {
|
42 | try {
|
43 | return res._getJSON();
|
44 | } catch (e) {
|
45 | return null;
|
46 | }
|
47 | },
|
48 | });
|
49 |
|
50 | function assert(actual, expected, description) {
|
51 | let pass;
|
52 |
|
53 | if (expected instanceof RegExp) {
|
54 | pass = expected.test(actual);
|
55 | } else if (actual === expected) {
|
56 | pass = true;
|
57 | }
|
58 |
|
59 | if (!pass) {
|
60 | throw new Error(`Response failure:\n${description}\n- actual: ${actual}\n- expected: ${expected}`);
|
61 | }
|
62 | }
|
63 |
|
64 | Object.defineProperty(res, 'ok', {
|
65 | value: (err, body = '', status = 200, message = '') => {
|
66 | if (typeof body === 'number') {
|
67 | status = body;
|
68 | message = '';
|
69 | body = '';
|
70 | }
|
71 |
|
72 | if (message) assert(res.statusMessage, message, 'Invalid status message');
|
73 |
|
74 | assert(res.statusCode, status, 'Invalid status code');
|
75 | assert(res.body, body, 'Body is invalid');
|
76 | assert(err, null, 'Unexpected failure');
|
77 | },
|
78 | });
|
79 |
|
80 | return res;
|
81 | }
|
82 |
|
83 | return Grown('Test.Mock.Res', {
|
84 |
|
85 | _mockResponse,
|
86 |
|
87 | $mixins() {
|
88 | const res = this._mockResponse();
|
89 |
|
90 | return {
|
91 | props: {
|
92 | res: () => res,
|
93 | },
|
94 | };
|
95 | },
|
96 | });
|
97 | };
|