docs: update homepage link http to https (#5920)
[express.git] / test / app.param.js
blob5c9a5630870fc0b9bcded86db684d176286c235b
1 'use strict'
3 var express = require('../')
4 , request = require('supertest');
6 describe('app', function(){
7 describe('.param(names, fn)', function(){
8 it('should map the array', function(done){
9 var app = express();
11 app.param(['id', 'uid'], function(req, res, next, id){
12 id = Number(id);
13 if (isNaN(id)) return next('route');
14 req.params.id = id;
15 next();
16 });
18 app.get('/post/:id', function(req, res){
19 var id = req.params.id;
20 res.send((typeof id) + ':' + id)
21 });
23 app.get('/user/:uid', function(req, res){
24 var id = req.params.id;
25 res.send((typeof id) + ':' + id)
26 });
28 request(app)
29 .get('/user/123')
30 .expect(200, 'number:123', function (err) {
31 if (err) return done(err)
32 request(app)
33 .get('/post/123')
34 .expect('number:123', done)
39 describe('.param(name, fn)', function(){
40 it('should map logic for a single param', function(done){
41 var app = express();
43 app.param('id', function(req, res, next, id){
44 id = Number(id);
45 if (isNaN(id)) return next('route');
46 req.params.id = id;
47 next();
48 });
50 app.get('/user/:id', function(req, res){
51 var id = req.params.id;
52 res.send((typeof id) + ':' + id)
53 });
55 request(app)
56 .get('/user/123')
57 .expect(200, 'number:123', done)
60 it('should only call once per request', function(done) {
61 var app = express();
62 var called = 0;
63 var count = 0;
65 app.param('user', function(req, res, next, user) {
66 called++;
67 req.user = user;
68 next();
69 });
71 app.get('/foo/:user', function(req, res, next) {
72 count++;
73 next();
74 });
75 app.get('/foo/:user', function(req, res, next) {
76 count++;
77 next();
78 });
79 app.use(function(req, res) {
80 res.end([count, called, req.user].join(' '));
81 });
83 request(app)
84 .get('/foo/bob')
85 .expect('2 1 bob', done);
88 it('should call when values differ', function(done) {
89 var app = express();
90 var called = 0;
91 var count = 0;
93 app.param('user', function(req, res, next, user) {
94 called++;
95 req.users = (req.users || []).concat(user);
96 next();
97 });
99 app.get('/:user/bob', function(req, res, next) {
100 count++;
101 next();
103 app.get('/foo/:user', function(req, res, next) {
104 count++;
105 next();
107 app.use(function(req, res) {
108 res.end([count, called, req.users.join(',')].join(' '));
111 request(app)
112 .get('/foo/bob')
113 .expect('2 2 foo,bob', done);
116 it('should support altering req.params across routes', function(done) {
117 var app = express();
119 app.param('user', function(req, res, next, user) {
120 req.params.user = 'loki';
121 next();
124 app.get('/:user', function(req, res, next) {
125 next('route');
127 app.get('/:user', function (req, res) {
128 res.send(req.params.user);
131 request(app)
132 .get('/bob')
133 .expect('loki', done);
136 it('should not invoke without route handler', function(done) {
137 var app = express();
139 app.param('thing', function(req, res, next, thing) {
140 req.thing = thing;
141 next();
144 app.param('user', function(req, res, next, user) {
145 next(new Error('invalid invocation'))
148 app.post('/:user', function (req, res) {
149 res.send(req.params.user);
152 app.get('/:thing', function (req, res) {
153 res.send(req.thing);
156 request(app)
157 .get('/bob')
158 .expect(200, 'bob', done);
161 it('should work with encoded values', function(done){
162 var app = express();
164 app.param('name', function(req, res, next, name){
165 req.params.name = name;
166 next();
169 app.get('/user/:name', function(req, res){
170 var name = req.params.name;
171 res.send('' + name);
174 request(app)
175 .get('/user/foo%25bar')
176 .expect('foo%bar', done);
179 it('should catch thrown error', function(done){
180 var app = express();
182 app.param('id', function(req, res, next, id){
183 throw new Error('err!');
186 app.get('/user/:id', function(req, res){
187 var id = req.params.id;
188 res.send('' + id);
191 request(app)
192 .get('/user/123')
193 .expect(500, done);
196 it('should catch thrown secondary error', function(done){
197 var app = express();
199 app.param('id', function(req, res, next, val){
200 process.nextTick(next);
203 app.param('id', function(req, res, next, id){
204 throw new Error('err!');
207 app.get('/user/:id', function(req, res){
208 var id = req.params.id;
209 res.send('' + id);
212 request(app)
213 .get('/user/123')
214 .expect(500, done);
217 it('should defer to next route', function(done){
218 var app = express();
220 app.param('id', function(req, res, next, id){
221 next('route');
224 app.get('/user/:id', function(req, res){
225 var id = req.params.id;
226 res.send('' + id);
229 app.get('/:name/123', function(req, res){
230 res.send('name');
233 request(app)
234 .get('/user/123')
235 .expect('name', done);
238 it('should defer all the param routes', function(done){
239 var app = express();
241 app.param('id', function(req, res, next, val){
242 if (val === 'new') return next('route');
243 return next();
246 app.all('/user/:id', function(req, res){
247 res.send('all.id');
250 app.get('/user/:id', function(req, res){
251 res.send('get.id');
254 app.get('/user/new', function(req, res){
255 res.send('get.new');
258 request(app)
259 .get('/user/new')
260 .expect('get.new', done);
263 it('should not call when values differ on error', function(done) {
264 var app = express();
265 var called = 0;
266 var count = 0;
268 app.param('user', function(req, res, next, user) {
269 called++;
270 if (user === 'foo') throw new Error('err!');
271 req.user = user;
272 next();
275 app.get('/:user/bob', function(req, res, next) {
276 count++;
277 next();
279 app.get('/foo/:user', function(req, res, next) {
280 count++;
281 next();
284 app.use(function(err, req, res, next) {
285 res.status(500);
286 res.send([count, called, err.message].join(' '));
289 request(app)
290 .get('/foo/bob')
291 .expect(500, '0 1 err!', done)
294 it('should call when values differ when using "next"', function(done) {
295 var app = express();
296 var called = 0;
297 var count = 0;
299 app.param('user', function(req, res, next, user) {
300 called++;
301 if (user === 'foo') return next('route');
302 req.user = user;
303 next();
306 app.get('/:user/bob', function(req, res, next) {
307 count++;
308 next();
310 app.get('/foo/:user', function(req, res, next) {
311 count++;
312 next();
314 app.use(function(req, res) {
315 res.end([count, called, req.user].join(' '));
318 request(app)
319 .get('/foo/bob')
320 .expect('1 2 bob', done);