1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 | "use strict";
|
20 |
|
21 | var fluid = require("infusion"),
|
22 | kettle = fluid.registerNamespace("kettle"),
|
23 | http = require("http"),
|
24 | jqUnit = fluid.require("node-jqunit", require, "jqUnit");
|
25 |
|
26 | fluid.require("ws", require, "kettle.npm.ws");
|
27 |
|
28 | fluid.registerNamespace("kettle.test");
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 | fluid.defaults("kettle.test.cookieJar", {
|
35 | gradeNames: ["fluid.component"],
|
36 | members: {
|
37 | cookie: "",
|
38 | parser: "@expand:kettle.npm.cookieParser({that}.options.secret)"
|
39 | }
|
40 | });
|
41 |
|
42 | fluid.defaults("kettle.test.request", {
|
43 | gradeNames: ["fluid.component"],
|
44 | invokers: {
|
45 | send: "fluid.notImplemented"
|
46 | },
|
47 | hostname: "localhost",
|
48 | port: 8081,
|
49 | path: "/",
|
50 | failOnError: true,
|
51 | storeCookies: false,
|
52 | termMap: {}
|
53 | });
|
54 |
|
55 |
|
56 |
|
57 | fluid.defaults("kettle.test.request.http", {
|
58 | gradeNames: ["kettle.test.request"],
|
59 | events: {
|
60 | onComplete: null,
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 | send: null
|
71 | },
|
72 | listeners: {
|
73 | "send.prepareRequest": {
|
74 | funcName: "kettle.test.request.http.prepareRequest",
|
75 | args: ["{that}", "{arguments}.0"],
|
76 | priority: "before:sendPayload"
|
77 | },
|
78 | "send.sendPayload": {
|
79 | funcName: "kettle.test.request.http.sendPayload",
|
80 | args: ["{that}", "{arguments}.0"]
|
81 | }
|
82 | },
|
83 | invokers: {
|
84 | send: {
|
85 | funcName: "kettle.test.request.http.send",
|
86 | args: [
|
87 | "{that}",
|
88 | "{cookieJar}",
|
89 | "{that}.events.onComplete.fire",
|
90 | "{arguments}.0",
|
91 | "{arguments}.1"
|
92 | ]
|
93 | }
|
94 | }
|
95 | });
|
96 |
|
97 |
|
98 | fluid.defaults("kettle.test.request.httpCookie", {
|
99 | gradeNames: ["kettle.test.request.http"],
|
100 | storeCookies: true
|
101 | });
|
102 |
|
103 | kettle.test.request.http.prepareRequest = function (that, optsObject) {
|
104 |
|
105 | var cookieJar = optsObject.cookieJar,
|
106 | callback = optsObject.callback,
|
107 | directOptions = optsObject.directOptions;
|
108 |
|
109 | if (that.nativeRequest) {
|
110 | fluid.fail("You cannot reuse a kettle.test.request.http object once it has been sent - please construct a fresh component for this request");
|
111 | }
|
112 |
|
113 | var requestOptions = kettle.dataSource.URL.prepareRequestOptions(that.options, cookieJar, directOptions, kettle.dataSource.URL.requestOptions, that.resolveUrl);
|
114 |
|
115 | fluid.log("Sending a " + (requestOptions.method || "GET") + " request to: ", requestOptions.path, " on port " + requestOptions.port);
|
116 |
|
117 | var req = that.nativeRequest = http.request(requestOptions, function (res) {
|
118 | that.nativeResponse = res;
|
119 | var data = "";
|
120 | res.setEncoding("utf8");
|
121 |
|
122 | res.on("data", function (chunk) {
|
123 | data += chunk;
|
124 | });
|
125 |
|
126 | res.on("close", function (err) {
|
127 | if (err) {
|
128 | fluid.fail("Error making request to " + requestOptions.path + ": " + err.message);
|
129 | }
|
130 | });
|
131 |
|
132 | res.on("end", function () {
|
133 | var cookie = res.headers["set-cookie"];
|
134 | var pseudoReq = {};
|
135 | if (cookie && that.options.storeCookies) {
|
136 | if (fluid.isDestroyed(cookieJar)) {
|
137 | fluid.fail("Stored cookie in destroyed jar");
|
138 | }
|
139 | cookieJar.cookie = cookie;
|
140 |
|
141 |
|
142 | pseudoReq = {
|
143 | headers: {
|
144 | cookie: cookie[0]
|
145 | }
|
146 | };
|
147 |
|
148 |
|
149 | cookieJar.parser(pseudoReq, {}, fluid.identity);
|
150 | }
|
151 | callback(data, that, pseudoReq);
|
152 | });
|
153 | });
|
154 |
|
155 |
|
156 |
|
157 | req.shouldKeepAlive = false;
|
158 |
|
159 | req.on("error", function (err) {
|
160 | if (that.options.failOnError) {
|
161 | jqUnit.fail("Error making request to " + requestOptions.path + ": " + err.message);
|
162 | } else {
|
163 | callback(JSON.stringify({
|
164 | isError: true,
|
165 | message: err.toString(),
|
166 | statusCode: 500
|
167 | }));
|
168 | }
|
169 | });
|
170 | };
|
171 |
|
172 | kettle.test.request.http.sendPayload = function (that, optsObject) {
|
173 |
|
174 | var req = that.nativeRequest,
|
175 | payload = optsObject.payload;
|
176 | if (payload) {
|
177 | payload = typeof payload === "string" ? payload : JSON.stringify(payload);
|
178 | req.setHeader("Content-Type", req.getHeader("Content-Type") || "application/json");
|
179 | req.setHeader("Content-Length", payload.length);
|
180 | }
|
181 |
|
182 | if (payload) {
|
183 | req.write(payload);
|
184 | }
|
185 |
|
186 | req.end();
|
187 | };
|
188 |
|
189 |
|
190 |
|
191 | kettle.test.request.http.send = function (that, cookieJar, callback, payload, directOptions) {
|
192 |
|
193 | var optsObject = {
|
194 | cookieJar: cookieJar,
|
195 | callback: callback,
|
196 | payload: payload,
|
197 | directOptions: directOptions
|
198 | };
|
199 |
|
200 | that.events.send.fire(optsObject);
|
201 | };
|
202 |
|
203 |
|
204 |
|
205 |
|
206 |
|
207 |
|
208 |
|
209 |
|
210 |
|
211 |
|
212 |
|
213 |
|
214 |
|
215 |
|
216 | kettle.test.assertResponseStatusCode = function (options, defaultCode) {
|
217 | var statusCode = options.statusCode || defaultCode;
|
218 | jqUnit.assertEquals(options.message + " statusCode", statusCode, options.request.nativeResponse.statusCode);
|
219 | };
|
220 |
|
221 |
|
222 |
|
223 |
|
224 |
|
225 |
|
226 | kettle.test.assertJSONResponse = function (options) {
|
227 | var data;
|
228 | try {
|
229 | data = kettle.JSON.parse(options.string);
|
230 | } catch (e) {
|
231 | throw kettle.upgradeError(e, "\nwhile parsing HTTP response as JSON");
|
232 | }
|
233 | jqUnit.assertDeepEq(options.message, options.expected, data);
|
234 | kettle.test.assertResponseStatusCode(options, 200);
|
235 | };
|
236 |
|
237 |
|
238 |
|
239 |
|
240 |
|
241 |
|
242 |
|
243 |
|
244 | kettle.test.assertResponse = function (options) {
|
245 | if (options.plainText) {
|
246 | if (options.expectedSubstring) {
|
247 | jqUnit.assertTrue(options.message, options.string.indexOf(options.expectedSubstring) !== -1);
|
248 | } else {
|
249 | jqUnit.assertEquals(options.message, options.expected, options.string);
|
250 | }
|
251 | kettle.test.assertResponseStatusCode(options, 200);
|
252 | } else {
|
253 | kettle.test.assertJSONResponse(options);
|
254 | }
|
255 | };
|
256 |
|
257 |
|
258 |
|
259 |
|
260 |
|
261 |
|
262 |
|
263 |
|
264 |
|
265 |
|
266 | kettle.test.assertErrorResponse = function (options) {
|
267 | var data = options.plainText ? {message: options.string} : kettle.JSON.parse(options.string);
|
268 | if (!options.plainText) {
|
269 | jqUnit.assertEquals(options.message + " isError field set", true, data.isError);
|
270 | }
|
271 | var errorTexts = fluid.makeArray(options.errorTexts);
|
272 | fluid.each(errorTexts, function (errorText) {
|
273 | jqUnit.assertTrue(options.message + " - message text \"" + data.message + "\" must contain " + errorText, data.message.indexOf(errorText) >= 0);
|
274 | });
|
275 | kettle.test.assertResponseStatusCode(options, 500);
|
276 | };
|