build: Node.js@12.3
[express.git] / test / res.format.js
blob076b78d73869a03f33c6657b8900fa64c425048d
2 var after = require('after')
3 var express = require('../')
4   , request = require('supertest')
5   , assert = require('assert');
7 var app1 = express();
9 app1.use(function(req, res, next){
10   res.format({
11     'text/plain': function(){
12       res.send('hey');
13     },
15     'text/html': function(){
16       res.send('<p>hey</p>');
17     },
19     'application/json': function(a, b, c){
20       assert(req === a)
21       assert(res === b)
22       assert(next === c)
23       res.send({ message: 'hey' });
24     }
25   });
26 });
28 app1.use(function(err, req, res, next){
29   if (!err.types) throw err;
30   res.send(err.status, 'Supports: ' + err.types.join(', '));
33 var app2 = express();
35 app2.use(function(req, res, next){
36   res.format({
37     text: function(){ res.send('hey') },
38     html: function(){ res.send('<p>hey</p>') },
39     json: function(){ res.send({ message: 'hey' }) }
40   });
41 });
43 app2.use(function(err, req, res, next){
44   res.send(err.status, 'Supports: ' + err.types.join(', '));
47 var app3 = express();
49 app3.use(function(req, res, next){
50   res.format({
51     text: function(){ res.send('hey') },
52     default: function(){ res.send('default') }
53   })
54 });
56 var app4 = express();
58 app4.get('/', function(req, res, next){
59   res.format({
60     text: function(){ res.send('hey') },
61     html: function(){ res.send('<p>hey</p>') },
62     json: function(){ res.send({ message: 'hey' }) }
63   });
64 });
66 app4.use(function(err, req, res, next){
67   res.send(err.status, 'Supports: ' + err.types.join(', '));
70 var app5 = express();
72 app5.use(function (req, res, next) {
73   res.format({
74     default: function () { res.send('hey') }
75   });
76 });
78 describe('res', function(){
79   describe('.format(obj)', function(){
80     describe('with canonicalized mime types', function(){
81       test(app1);
82     })
84     describe('with extnames', function(){
85       test(app2);
86     })
88     describe('with parameters', function(){
89       var app = express();
91       app.use(function(req, res, next){
92         res.format({
93           'text/plain; charset=utf-8': function(){ res.send('hey') },
94           'text/html; foo=bar; bar=baz': function(){ res.send('<p>hey</p>') },
95           'application/json; q=0.5': function(){ res.send({ message: 'hey' }) }
96         });
97       });
99       app.use(function(err, req, res, next){
100         res.send(err.status, 'Supports: ' + err.types.join(', '));
101       });
103       test(app);
104     })
106     describe('given .default', function(){
107       it('should be invoked instead of auto-responding', function(done){
108         request(app3)
109         .get('/')
110         .set('Accept', 'text/html')
111         .expect('default', done);
112       })
114       it('should work when only .default is provided', function (done) {
115         request(app5)
116         .get('/')
117         .set('Accept', '*/*')
118         .expect('hey', done);
119       })
120     })
122     describe('in router', function(){
123       test(app4);
124     })
126     describe('in router', function(){
127       var app = express();
128       var router = express.Router();
130       router.get('/', function(req, res, next){
131         res.format({
132           text: function(){ res.send('hey') },
133           html: function(){ res.send('<p>hey</p>') },
134           json: function(){ res.send({ message: 'hey' }) }
135         });
136       });
138       router.use(function(err, req, res, next){
139         res.send(err.status, 'Supports: ' + err.types.join(', '));
140       })
142       app.use(router)
144       test(app)
145     })
146   })
149 function test(app) {
150   it('should utilize qvalues in negotiation', function(done){
151     request(app)
152     .get('/')
153     .set('Accept', 'text/html; q=.5, application/json, */*; q=.1')
154     .expect({"message":"hey"}, done);
155   })
157   it('should allow wildcard type/subtypes', function(done){
158     request(app)
159     .get('/')
160     .set('Accept', 'text/html; q=.5, application/*, */*; q=.1')
161     .expect({"message":"hey"}, done);
162   })
164   it('should default the Content-Type', function(done){
165     request(app)
166     .get('/')
167     .set('Accept', 'text/html; q=.5, text/plain')
168     .expect('Content-Type', 'text/plain; charset=utf-8')
169     .expect('hey', done);
170   })
172   it('should set the correct charset for the Content-Type', function (done) {
173     var cb = after(3, done)
175     request(app)
176     .get('/')
177     .set('Accept', 'text/html')
178     .expect('Content-Type', 'text/html; charset=utf-8', cb)
180     request(app)
181     .get('/')
182     .set('Accept', 'text/plain')
183     .expect('Content-Type', 'text/plain; charset=utf-8', cb)
185     request(app)
186     .get('/')
187     .set('Accept', 'application/json')
188     .expect('Content-Type', 'application/json; charset=utf-8', cb)
189   })
191   it('should Vary: Accept', function(done){
192     request(app)
193     .get('/')
194     .set('Accept', 'text/html; q=.5, text/plain')
195     .expect('Vary', 'Accept', done);
196   })
198   describe('when Accept is not present', function(){
199     it('should invoke the first callback', function(done){
200       request(app)
201       .get('/')
202       .expect('hey', done);
203     })
204   })
206   describe('when no match is made', function(){
207     it('should should respond with 406 not acceptable', function(done){
208       request(app)
209       .get('/')
210       .set('Accept', 'foo/bar')
211       .expect('Supports: text/plain, text/html, application/json')
212       .expect(406, done)
213     })
214   })