-
Notifications
You must be signed in to change notification settings - Fork 17
/
dispatcher-test.js
94 lines (80 loc) · 2.66 KB
/
dispatcher-test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
var dispatcher = require('../grasshopper/lib/dispatcher'),
http = require('http'),
assert = require('assert'),
mocks = require('./mocks');
exports.name = 'Dispatcher Tests';
exports.tests = {
'Simple GET.': function(next) {
invoke('GET', '/path', {}, undefined, '/path', function() {
});
next();
},
'GET with in-path argument.': function(next) {
invoke('GET', '/path/ABC', {}, undefined, '/path/{id}', function(args) {
assert.equal(args.id, 'ABC');
});
next();
},
'GET with params.': function(next) {
invoke('GET', '/path?name=ABC', {}, undefined, '/path', function() {
assert.equal(this.params['name'], 'ABC');
});
next();
},
'Simple POST.': function(next) {
invoke('POST', '/path', {
'content-type': 'application/x-www-form-urlencoded',
'content-length': 9
}, 'name=ABC%20DEF', '/path', function() {
assert.equal(this.params['name'], 'ABC DEF');
});
next();
},
'POST with complex params.': function(next) {
invoke('POST', '/path', {
'content-type': 'application/x-www-form-urlencoded',
'content-length': 9
}, 'user.name=ABC&user.*friends=DEF&user.*friends=GHI',
'/path', function() {
assert.deepEqual(this.params['user'], {
name: 'ABC',
'*friends': ['DEF', 'GHI']
});
});
next();
},
'Simple HEAD.': function(next) {
invoke('HEAD', '/path', {}, undefined, '/path', function() {
});
next();
},
'Filter invocation.': function(next) {
var filterInvoked = false;
dispatcher.api.addFilters(/\/path/, function(next) {
filterInvoked = true;
next();
});
invoke('GET', '/path', {}, undefined, '/path', function() {
});
assert.ok(filterInvoked);
next();
}
};
function invoke(method, path, headers, body, route, controller) {
var req = new mocks.MockRequest(method, path, headers),
res = new mocks.MockResponse();
var invoked = false,
routes = {};
routes[method.toLowerCase() + ':' + route] = function() {
invoked = true;
assert.equal(this.request, req);
assert.equal(this.response, res);
controller.apply(this, arguments);
};
dispatcher.dispatch(req, res, new dispatcher.RouteMatcher(routes));
if(body) {
req.emit('data', body);
req.emit('end');
}
assert.ok(invoked);
}