tests: add maxAge option tests for res.sendFile
[express.git] / test / res.download.js
blob30215bf6764ec3794622be367616a75e7b8a030a
2 var after = require('after');
3 var assert = require('assert');
4 var express = require('..');
5 var request = require('supertest');
7 describe('res', function(){
8   describe('.download(path)', function(){
9     it('should transfer as an attachment', function(done){
10       var app = express();
12       app.use(function(req, res){
13         res.download('test/fixtures/user.html');
14       });
16       request(app)
17       .get('/')
18       .expect('Content-Type', 'text/html; charset=UTF-8')
19       .expect('Content-Disposition', 'attachment; filename="user.html"')
20       .expect(200, '<p>{{user.name}}</p>', done)
21     })
22   })
24   describe('.download(path, filename)', function(){
25     it('should provide an alternate filename', function(done){
26       var app = express();
28       app.use(function(req, res){
29         res.download('test/fixtures/user.html', 'document');
30       });
32       request(app)
33       .get('/')
34       .expect('Content-Type', 'text/html; charset=UTF-8')
35       .expect('Content-Disposition', 'attachment; filename="document"')
36       .expect(200, done)
37     })
38   })
40   describe('.download(path, fn)', function(){
41     it('should invoke the callback', function(done){
42       var app = express();
43       var cb = after(2, done);
45       app.use(function(req, res){
46         res.download('test/fixtures/user.html', cb);
47       });
49       request(app)
50       .get('/')
51       .expect('Content-Type', 'text/html; charset=UTF-8')
52       .expect('Content-Disposition', 'attachment; filename="user.html"')
53       .expect(200, cb);
54     })
55   })
57   describe('.download(path, filename, fn)', function(){
58     it('should invoke the callback', function(done){
59       var app = express();
60       var cb = after(2, done);
62       app.use(function(req, res){
63         res.download('test/fixtures/user.html', 'document', done);
64       });
66       request(app)
67       .get('/')
68       .expect('Content-Type', 'text/html; charset=UTF-8')
69       .expect('Content-Disposition', 'attachment; filename="document"')
70       .expect(200, cb);
71     })
72   })
74   describe('.download(path, filename, options, fn)', function () {
75     it('should invoke the callback', function (done) {
76       var app = express()
77       var cb = after(2, done)
78       var options = {}
80       app.use(function (req, res) {
81         res.download('test/fixtures/user.html', 'document', options, done)
82       })
84       request(app)
85       .get('/')
86       .expect(200)
87       .expect('Content-Type', 'text/html; charset=UTF-8')
88       .expect('Content-Disposition', 'attachment; filename="document"')
89       .end(cb)
90     })
92     it('should allow options to res.sendFile()', function (done) {
93       var app = express()
95       app.use(function (req, res) {
96         res.download('test/fixtures/.name', 'document', {
97           dotfiles: 'allow',
98           maxAge: '4h'
99         })
100       })
102       request(app)
103       .get('/')
104       .expect(200)
105       .expect('Content-Disposition', 'attachment; filename="document"')
106       .expect('Cache-Control', 'public, max-age=14400')
107       .expect('tobi')
108       .end(done)
109     })
111     describe('when options.headers contains Content-Disposition', function () {
112       it('should should be ignored', function (done) {
113         var app = express()
115         app.use(function (req, res) {
116           res.download('test/fixtures/user.html', 'document', {
117             headers: {
118               'Content-Type': 'text/x-custom',
119               'Content-Disposition': 'inline'
120             }
121           })
122         })
124         request(app)
125         .get('/')
126         .expect(200)
127         .expect('Content-Type', 'text/x-custom')
128         .expect('Content-Disposition', 'attachment; filename="document"')
129         .end(done)
130       })
132       it('should should be ignored case-insensitively', function (done) {
133         var app = express()
135         app.use(function (req, res) {
136           res.download('test/fixtures/user.html', 'document', {
137             headers: {
138               'content-type': 'text/x-custom',
139               'content-disposition': 'inline'
140             }
141           })
142         })
144         request(app)
145         .get('/')
146         .expect(200)
147         .expect('Content-Type', 'text/x-custom')
148         .expect('Content-Disposition', 'attachment; filename="document"')
149         .end(done)
150       })
151     })
152   })
154   describe('on failure', function(){
155     it('should invoke the callback', function(done){
156       var app = express();
158       app.use(function (req, res, next) {
159         res.download('test/fixtures/foobar.html', function(err){
160           if (!err) return next(new Error('expected error'));
161           res.send('got ' + err.status + ' ' + err.code);
162         });
163       });
165       request(app)
166       .get('/')
167       .expect(200, 'got 404 ENOENT', done);
168     })
170     it('should remove Content-Disposition', function(done){
171       var app = express()
173       app.use(function (req, res, next) {
174         res.download('test/fixtures/foobar.html', function(err){
175           if (!err) return next(new Error('expected error'));
176           res.end('failed');
177         });
178       });
180       request(app)
181       .get('/')
182       .expect(shouldNotHaveHeader('Content-Disposition'))
183       .expect(200, 'failed', done);
184     })
185   })
188 function shouldNotHaveHeader(header) {
189   return function (res) {
190     assert.ok(!(header.toLowerCase() in res.headers), 'should not have header ' + header);
191   };