1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | "use strict";
|
14 |
|
15 | var fluid = require("infusion"),
|
16 | kettle = require("../../kettle.js"),
|
17 | jqUnit = fluid.registerNamespace("jqUnit");
|
18 |
|
19 | kettle.loadTestingSupport();
|
20 |
|
21 | fluid.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 |
|
30 | kettle.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 |
|
36 | fluid.defaults("kettle.tests.middleware.validateSession", {
|
37 | gradeNames: "kettle.middleware",
|
38 | invokers: {
|
39 | handle: "kettle.tests.session.validate"
|
40 | }
|
41 | });
|
42 |
|
43 | kettle.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 |
|
58 | fluid.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 |
|
72 | fluid.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 |
|
83 | kettle.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 |
|
93 | fluid.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 |
|
102 | kettle.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 |
|
110 | fluid.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 |
|
131 | kettle.tests.session.clearCookie = function (res) {
|
132 | res.clearCookie("kettle.sid");
|
133 | };
|
134 |
|
135 |
|
136 | kettle.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 |
|
142 | kettle.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 |
|
150 | kettle.tests.session.token = "123";
|
151 |
|
152 | fluid.registerNamespace("kettle.tests.session.response");
|
153 |
|
154 | kettle.tests.session.response.success = {
|
155 | success: true
|
156 | };
|
157 |
|
158 | kettle.tests.session.response.midSuccess = {
|
159 | success: true,
|
160 | token: kettle.tests.session.token
|
161 | };
|
162 |
|
163 | kettle.tests.session.response.failure = {
|
164 | isError: true,
|
165 | message: "Session is invalid"
|
166 | };
|
167 |
|
168 |
|
169 |
|
170 | kettle.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 |
|
181 | kettle.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 |
|
192 | kettle.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: {
|
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 | };
|