UNPKG

2.12 kBJavaScriptView Raw
1'use strict';
2
3module.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 // export helpers
85 _mockResponse,
86
87 $mixins() {
88 const res = this._mockResponse();
89
90 return {
91 props: {
92 res: () => res,
93 },
94 };
95 },
96 });
97};