UNPKG

7.58 kBJavaScriptView Raw
1/**
2 * Kettle Bad Request Tests
3 *
4 * Copyright 2015 Raising The Floor - International
5 *
6 * Licensed under the New BSD license. You may not use this file except in
7 * compliance with this License.
8 *
9 * You may obtain a copy of the License at
10 * https://github.com/fluid-project/kettle/blob/master/LICENSE.txt
11 */
12
13"use strict";
14
15var fluid = require("infusion"),
16 kettle = fluid.require("%kettle");
17
18kettle.loadTestingSupport();
19
20require("./shared/SingleRequestTestDefs.js");
21require("./shared/HTTPMethodsTestDefs.js");
22
23fluid.registerNamespace("kettle.tests.badRequest");
24
25// Test the facility to register our own "upgrade error handler" - beat the one within KettleTestUtils
26// ignore for unused arguments which must be supplied since app.use ridiculously checks the callee signature
27kettle.tests.badRequest.upgradeError = function (server) {
28 server.expressApp.use(function (err, req, res, next) { // eslint-disable-line
29 kettle.request.http.errorHandler(res, err);
30 });
31};
32
33fluid.defaults("kettle.tests.badRequest.testDefTemplate", {
34 gradeNames: "fluid.component",
35 mergePolicy: {
36 sequence: "noexpand"
37 },
38 expectedStatusCode: 500,
39 distributeOptions: {
40 target: "{that server}.options.listeners.onCreate",
41 record: {
42 namespace: "upgradeError",
43 listener: "kettle.tests.badRequest.upgradeError"
44 }
45 },
46 components: {
47 testRequest: {
48 type: "kettle.test.request.http",
49 options: {
50 path: "/",
51 method: "GET"
52 }
53 }
54 },
55 sequence: [
56 { // Beat jqUnit's failure handler so we can test Kettle's
57 funcName: "kettle.test.pushInstrumentedErrors",
58 args: "fluid.identity"
59 }, {
60 func: "{testRequest}.send"
61 }, {
62 event: "{testRequest}.events.onComplete",
63 listener: "kettle.test.assertErrorResponse",
64 args: {
65 message: "{testCaseHolder}.options.message",
66 errorTexts: "{testCaseHolder}.options.errorTexts",
67 statusCode: "{testCaseHolder}.options.expectedStatusCode",
68 string: "{arguments}.0",
69 request: "{testRequest}"
70 }
71 }, {
72 funcName: "kettle.test.popInstrumentedErrors"
73 }
74 ]
75});
76
77/** Definitions for specific bad request tests **/
78
79/* Missing handler test */
80
81fluid.defaults("kettle.tests.badRequest.missing.handler.config", {
82 handler: {
83 type: "kettle.tests.badRequest.missing.handler"
84 },
85 name: "Bad config: missing handler test",
86 message: "Received 500 error with helpful text for missing request handler",
87 errorTexts: "couldn't load handler kettle.tests.badRequest.missing.handler"
88});
89
90/* Handler with missing type test */
91
92fluid.defaults("kettle.tests.badRequest.missing.handlerType.config", {
93 handler: {
94 type: null
95 },
96 name: "Bad config: missing handler type test",
97 message: "Received 500 error with helpful text for missing request handler type",
98 errorTexts: ["must have a request grade name", "type"]
99});
100
101/* Throwing handler test */
102
103fluid.defaults("kettle.tests.badRequest.throwing.handler.config", {
104 handler: {
105 type: "kettle.tests.badRequest.throwing.handler"
106 },
107 name: "Bad config: missing handler test",
108 message: "Received 500 error with helpful text for throwing request handler",
109 errorTexts: "Undesirable failure"
110});
111
112fluid.defaults("kettle.tests.badRequest.throwing.handler", {
113 gradeNames: "kettle.request.http",
114 invokers: {
115 handleRequest: {
116 funcName: "kettle.tests.badRequest.throwing.handleRequest"
117 }
118 }
119});
120
121kettle.tests.badRequest.throwing.handleRequest = function () {
122 throw new Error("Undesirable failure");
123};
124
125/* Missing middleware test */
126
127fluid.defaults("kettle.tests.badRequest.middleware.missing.config", {
128 handler: {
129 type: "kettle.tests.badRequest.middleware.missing.handler"
130 },
131 name: "Bad config: missing middleware test",
132 message: "Received 500 error with helpful text for missing middleware",
133 errorTexts: ["Couldn't resolve reference", "missingMiddleware"]
134});
135
136fluid.defaults("kettle.tests.badRequest.middleware.missing.handler", {
137 gradeNames: "kettle.request.http",
138 requestMiddleware: {
139 missing: {
140 middleware: "{middlewareHolder}.missingMiddleware"
141 }
142 },
143 invokers: {
144 handleRequest: {
145 funcName: "kettle.tests.HTTPMethods.get.handleRequest"
146 }
147 }
148});
149
150/* Bad middleware test */
151
152fluid.defaults("kettle.tests.badRequest.middleware.bad.config", {
153 handler: {
154 type: "kettle.tests.badRequest.middleware.bad.handler"
155 },
156 name: "Bad config: bad middleware test",
157 message: "Received 500 error with helpful text for bad middleware",
158 errorTexts: ["is improperly configured", "kettle.tests.badRequest.bad.middleware"]
159});
160
161fluid.defaults("kettle.tests.badRequest.middleware.bad.handler", {
162 gradeNames: "kettle.request.http",
163 components: {
164 badMiddleware: {
165 type: "kettle.tests.badRequest.bad.middleware"
166 }
167 },
168 requestMiddleware: {
169 bad: {
170 middleware: "{kettle.request.http}.badMiddleware"
171 }
172 },
173 invokers: {
174 handleRequest: {
175 funcName: "kettle.tests.HTTPMethods.get.handleRequest"
176 }
177 }
178});
179
180// should have a member "middleware" but doesn't
181fluid.defaults("kettle.tests.badRequest.bad.middleware", {
182 gradeNames: "kettle.plainMiddleware"
183});
184
185/* Bad static middleware test */
186
187fluid.defaults("kettle.tests.badRequest.static.nopath.config", {
188 handler: {
189 type: "kettle.tests.badRequest.static.nopath.handler"
190 },
191 name: "Bad config: static middleware with no path test",
192 message: "Received 500 error with helpful text for static middleware with no path",
193 errorTexts: ["Static middleware must have a root path"]
194});
195
196// middleware should have a member "root" but doesn't
197fluid.defaults("kettle.tests.badRequest.static.nopath.handler", {
198 gradeNames: "kettle.request.http",
199 components: {
200 badStatic: {
201 type: "kettle.middleware.static"
202 }
203 },
204 requestMiddleware: {
205 staticMiddleware: {
206 middleware: "{kettle.request.http}.badStatic"
207 }
208 },
209 invokers: {
210 handleRequest: {
211 funcName: "kettle.tests.HTTPMethods.get.handleRequest"
212 }
213 }
214});
215
216/* Bad URL test */
217
218fluid.defaults("kettle.tests.badRequest.badURL.config", {
219 handler: {
220 type: "kettle.tests.HTTPMethods.get.handler",
221 route: "/route/:key"
222 },
223 name: "Bad request: bad URL-encoded request parameter",
224 message: "Received 400 error with helpful text for badly URL-encoded request parameter",
225 errorTexts: ["Failed to decode"],
226 expectedStatusCode: 400,
227 distributeOptions: {
228 target: "{that testRequest}.options.path",
229 record: "/route/%ZZ"
230 }
231});
232
233kettle.tests.badRequest.testDefs = [
234 "kettle.tests.badRequest.missing.handler.config",
235 "kettle.tests.badRequest.missing.handlerType.config",
236 "kettle.tests.badRequest.throwing.handler.config",
237 "kettle.tests.badRequest.middleware.missing.config",
238 "kettle.tests.badRequest.middleware.bad.config",
239 "kettle.tests.badRequest.static.nopath.config",
240 "kettle.tests.badRequest.badURL.config"
241];
242
243kettle.tests.singleRequest.executeTests(kettle.tests.badRequest.testDefs,
244 "kettle.tests.badRequest.testDefTemplate", true);