UNPKG

9.57 kBJavaScriptView Raw
1/**
2 * Kettle Session Support Test Definitions
3 *
4 * Copyright 2013 OCAD University
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 = require("../../kettle.js"),
17 jqUnit = fluid.registerNamespace("jqUnit");
18
19kettle.loadTestingSupport();
20
21fluid.defaults("kettle.tests.session.none.handler", {
22 gradeNames: ["kettle.request.http"],
23 invokers: {
24 handleRequest: {
25 funcName: "kettle.tests.session.none.handleRequest"
26 }
27 }
28});
29
30kettle.tests.session.none.handleRequest = function (request) {
31 jqUnit.assertTrue("The request was received", true);
32 request.events.onSuccess.fire(kettle.tests.session.response.success);
33};
34
35
36fluid.defaults("kettle.tests.middleware.validateSession", {
37 gradeNames: "kettle.middleware",
38 invokers: {
39 handle: "kettle.tests.session.validate"
40 }
41});
42
43kettle.tests.session.validate = function (request) {
44 var token = fluid.get(request, ["req", "session", "token"]);
45 var togo = fluid.promise();
46 if (token === undefined) {
47 request.events.onDestroySession.fire();
48 togo.reject({
49 statusCode: 403,
50 message: "Session is invalid"
51 });
52 } else {
53 togo.resolve();
54 }
55 return togo;
56};
57
58fluid.defaults("kettle.tests.session.handler.validating", {
59 components: {
60 validator: {
61 type: "kettle.tests.middleware.validateSession"
62 }
63 },
64 requestMiddleware: {
65 validate: {
66 middleware: "{handler}.validator",
67 priority: "after:session"
68 }
69 }
70});
71
72fluid.defaults("kettle.tests.session.existing.handler", {
73 gradeNames: ["kettle.request.http", "kettle.request.sessionAware", "kettle.tests.session.handler.validating"],
74
75 invokers: {
76 handleRequest: {
77 funcName: "kettle.tests.session.existing.handleRequest",
78 args: ["{request}", "{request}.req.session"]
79 }
80 }
81});
82
83kettle.tests.session.existing.handleRequest = function (request, session) {
84 jqUnit.assertTrue("The request was received", true);
85 jqUnit.assertValue("Session exists", session);
86 jqUnit.assertEquals("Session is correct and has a current token", kettle.tests.session.token, session.token);
87 var response = fluid.extend(true, {
88 token: session.token
89 }, kettle.tests.session.response.success);
90 request.events.onSuccess.fire(response);
91};
92
93fluid.defaults("kettle.tests.session.start.handler", {
94 gradeNames: ["kettle.request.http", "kettle.request.sessionAware"],
95 invokers: {
96 handleRequest: {
97 funcName: "kettle.tests.session.start.handleRequest"
98 }
99 }
100});
101
102kettle.tests.session.start.handleRequest = function (request) {
103 var token = request.req.params.token;
104 jqUnit.assertEquals("The session start request was received with token", kettle.tests.session.token, token);
105 request.req.session.token = token;
106 request.events.onSuccess.fire(kettle.tests.session.response.success);
107};
108
109
110fluid.defaults("kettle.tests.session.end.handler", {
111 gradeNames: ["kettle.request.http", "kettle.request.sessionAware"],
112 listeners: {
113 "onDestroySession.clearCookie": {
114 priority: "after:destroy",
115 listener: "kettle.tests.session.clearCookie",
116 args: "{request}.res"
117 },
118 "onDestroySession.testClear": {
119 priority: "after:clearCookie",
120 funcName: "kettle.tests.session.testSessionClear",
121 args: "{request}"
122 }
123 },
124 invokers: {
125 handleRequest: {
126 funcName: "kettle.tests.session.end.handleRequest"
127 }
128 }
129});
130
131kettle.tests.session.clearCookie = function (res) {
132 res.clearCookie("kettle.sid");
133};
134
135
136kettle.tests.session.testSessionClear = function (request) {
137 jqUnit.assertUndefined("Session is destroyed", request.req.session);
138 request.events.onSuccess.fire(kettle.tests.session.response.success);
139};
140
141
142kettle.tests.session.end.handleRequest = function (request) {
143 var token = request.req.params.token;
144 jqUnit.assertEquals("The session end request was received with token", kettle.tests.session.token, token);
145 jqUnit.assertEquals("Token matches the session token", request.req.session.token, token);
146 request.events.onDestroySession.fire();
147};
148
149
150kettle.tests.session.token = "123";
151
152fluid.registerNamespace("kettle.tests.session.response");
153
154kettle.tests.session.response.success = {
155 success: true
156};
157
158kettle.tests.session.response.midSuccess = {
159 success: true,
160 token: kettle.tests.session.token
161};
162
163kettle.tests.session.response.failure = {
164 isError: true,
165 message: "Session is invalid"
166};
167
168
169
170kettle.tests.session.testStartSuccessResponse = function (data, request, parsed) {
171 kettle.test.assertJSONResponse({
172 message: "Successful session start response",
173 expected: kettle.tests.session.response.success,
174 string: data,
175 request: request
176 });
177 jqUnit.assertValue("Cookie is set", request.nativeResponse.headers["set-cookie"]);
178 jqUnit.assertValue("kettle session cookie is set", parsed.signedCookies["kettle.sid"]);
179};
180
181kettle.tests.session.testEndSuccessResponse = function (data, request, parsed) {
182 kettle.test.assertJSONResponse({
183 message: "Successful session end response",
184 expected: kettle.tests.session.response.success,
185 string: data,
186 request: request
187 });
188 jqUnit.assertEquals("kettle session cookie is unset", "", parsed.cookies["kettle.sid"]);
189};
190
191
192kettle.tests.session.testDefs = {
193 name: "Session tests",
194 expect: 24,
195 config: {
196 configName: "kettle.tests.session.config",
197 configPath: "%kettle/tests/configs"
198 },
199 components: {
200 httpTestNoSessionRequest: {
201 type: "kettle.test.request.httpCookie",
202 options: {
203 path: "/testNoSessionRequest"
204 }
205 },
206 httpTestExistingSessionRequest: {
207 type: "kettle.test.request.httpCookie",
208 options: {
209 path: "/testExistingSessionRequest"
210 }
211 },
212 httpTestSessionStart: {
213 type: "kettle.test.request.httpCookie",
214 options: { // Test supplying URL templating via dynamic arguments
215 path: "/testSessionStart/%token"
216 }
217 },
218 httpTestExistingSessionRequest2: {
219 type: "kettle.test.request.httpCookie",
220 options: {
221 path: "/testExistingSessionRequest"
222 }
223 },
224 httpTestNoSessionRequest2: {
225 type: "kettle.test.request.httpCookie",
226 options: {
227 path: "/testNoSessionRequest"
228 }
229 },
230 httpTestSessionEnd: {
231 type: "kettle.test.request.httpCookie",
232 options: {
233 path: "/testSessionEnd/%token",
234 termMap: {
235 token: kettle.tests.session.token
236 }
237 }
238 }
239 },
240 sequence: [{
241 func: "{httpTestNoSessionRequest}.send"
242 }, {
243 event: "{httpTestNoSessionRequest}.events.onComplete",
244 listener: "kettle.test.assertJSONResponse",
245 args: {
246 message: "Standard response from request requiring no session",
247 expected: kettle.tests.session.response.success,
248 string: "{arguments}.0",
249 request: "{httpTestNoSessionRequest}"
250 }
251 }, {
252 func: "{httpTestExistingSessionRequest}.send"
253 }, {
254 event: "{httpTestExistingSessionRequest}.events.onComplete",
255 listener: "kettle.test.assertJSONResponse",
256 args: {
257 message: "Error response from request requiring session without one",
258 expected: kettle.tests.session.response.failure,
259 statusCode: 403,
260 string: "{arguments}.0",
261 request: "{httpTestExistingSessionRequest}"
262 }
263 }, {
264 func: "{httpTestSessionStart}.send",
265 args: [null, {
266 termMap: {
267 token: kettle.tests.session.token
268 }
269 }]
270 }, {
271 event: "{httpTestSessionStart}.events.onComplete",
272 listener: "kettle.tests.session.testStartSuccessResponse"
273 }, {
274 func: "{httpTestExistingSessionRequest2}.send"
275 }, {
276 event: "{httpTestExistingSessionRequest2}.events.onComplete",
277 listener: "kettle.test.assertJSONResponse",
278 args: {
279 message: "Successful mid-session response with state captured from former URL",
280 expected: kettle.tests.session.response.midSuccess,
281 string: "{arguments}.0",
282 request: "{httpTestExistingSessionRequest2}"
283 }
284 }, {
285 func: "{httpTestNoSessionRequest2}.send"
286 }, {
287 event: "{httpTestNoSessionRequest2}.events.onComplete",
288 listener: "kettle.test.assertJSONResponse",
289 args: {
290 message: "Standard response from request requiring no session when one is allocated",
291 expected: kettle.tests.session.response.success,
292 string: "{arguments}.0",
293 request: "{httpTestNoSessionRequest2}"
294 }
295 }, {
296 func: "{httpTestSessionEnd}.send"
297 }, {
298 event: "{httpTestSessionEnd}.events.onComplete",
299 listener: "kettle.tests.session.testEndSuccessResponse"
300 }]
301};