var assert = require('assert'); var connect = require('connect'); var request = require('supertest'); var compress = require('./'); var app = connect(); app.use(compress({ threshold: 0 })); app.use(connect.static(__dirname)); var app2 = connect(); app2.use(compress({ threshold: '1kb' })); app2.use('/response/small', function(req, res){ res.setHeader('Content-Type', 'text/plain'); res.end('tiny'); }); app2.use('/response/large', function(req, res){ res.setHeader('Content-Type', 'text/plain'); res.end(new Buffer(2048)); }); app2.use('/stream/small/length', function(req, res){ res.setHeader('Content-Type', 'text/plain'); res.setHeader('Content-Length', '1'); res.write('a'); res.end(); }); app2.use('/stream/large/length', function(req, res){ res.setHeader('Content-Type', 'text/plain'); res.setHeader('Content-Length', '2048'); res.write(new Buffer(2048)); res.end(); }); app2.use('/stream/small', function(req, res, next){ res.setHeader('Content-Type', 'text/plain'); res.write('a'); res.end(); }); app2.use('/image', function(req, res){ res.setHeader('Content-Type', 'image/png'); res.write(new Buffer(2048)); res.end(); }); describe('compress()', function(){ it('should gzip files', function(done){ request(app) .get('/package.json') .set('Accept-Encoding', 'gzip') .end(function(err, res){ res.body.should.not.equal('- groceries'); done(); }); }) it('should set Content-Encoding', function(done){ request(app) .get('/package.json') .set('Accept-Encoding', 'gzip') .expect('Content-Encoding', 'gzip', done); }) it('should support HEAD', function(done){ request(app) .head('/package.json') .set('Accept-Encoding', 'gzip') .expect('', done); }) it('should support conditional GETs', function(done){ request(app) .get('/package.json') .set('Accept-Encoding', 'gzip') .end(function(err, res){ var date = res.headers['last-modified']; request(app) .get('/package.json') .set('Accept-Encoding', 'gzip') .set('If-Modified-Since', date) .expect(304, done); }); }) it('should set Vary', function(done){ request(app) .get('/package.json') .set('Accept-Encoding', 'gzip') .expect('Vary', 'Accept-Encoding', done); }) it('should set Vary even if Accept-Encoding is not set', function(done){ request(app) .get('/package.json') .expect('Vary', 'Accept-Encoding', done); }) it('should not set Vary if Content-Type does not pass filter', function(done){ request(app2) .get('/image') .end(function(err, res){ res.headers.should.not.have.property('vary'); done(); }) }) it('should transfer chunked', function(done){ request(app) .get('/package.json') .set('Accept-Encoding', 'gzip') .expect('Transfer-Encoding', 'chunked', done); }) it('should remove Content-Length for chunked', function(done){ request(app) .get('/package.json') .set('Accept-Encoding', 'gzip') .end(function(err, res){ res.headers.should.not.have.property('content-length'); done() }); }) describe('threshold', function(){ it('should not compress responses below the threshold size', function(done){ request(app2) .get('/response/small') .set('Accept-Encoding', 'gzip') .end(function(err, res){ // I don't know how to do this with supertest // '' or 'identity' should be valid values as well, // but they are not set by compress. assert.equal(res.headers['content-encoding'], undefined); done() }) }) it('should compress responses above the threshold size', function(done){ request(app2) .get('/response/large') .set('Accept-Encoding', 'gzip') .expect('Content-Encoding', 'gzip', done); }) it('should compress when streaming without a content-length', function(done){ request(app2) .get('/stream/small') .set('Accept-Encoding', 'gzip') .expect('Content-Encoding', 'gzip', done); }) it('should not compress when streaming and content-length is lower than threshold', function(done){ request(app2) .get('/stream/small/length') .set('Accept-Encoding', 'gzip') .end(function(err, res){ assert.equal(res.headers['content-encoding'], undefined); done() }) }) it('should compress when streaming and content-length is larger than threshold', function(done){ request(app2) .get('/stream/large/length') .set('Accept-Encoding', 'gzip') .expect('Content-Encoding', 'gzip', done); }) }) describe('res.flush()', function () { it('should always be present', function (done) { var app = connect(); app.use(compress()); app.use(function (req, res) { res.flush.should.be.a.Function; res.statusCode = 204; res.end(); }); request(app) .get('/') .expect(204, done); }) // If anyone knows how to test if the flush works... // it('should flush the response', function (done) { // }) }) })