tachi
Version:
Node.js MVC framework for seriously rapid application development.
259 lines (208 loc) • 7.05 kB
JavaScript
var proxyquire = require('proxyquire');
Deferred = require('../../Async/deferred');
describe('compression', function() {
describe('#checkHeaders()', function() {
var compression;
beforeEach(function() {
compression = require('../../Utilities/compression');
});
it('should return null if the accept-encoding header is not specified.', function() {
var request = {
headers: {}
};
var compressionType = compression.checkHeaders(request);
compressionType.should.be.empty;
});
// Need to work out a good TestCase syntax, this is too much duplication
// but having the previously-used [].forEach syntax is very icky-looking.
it('should return gzip if only gzip is defined.', function() {
var request = {
headers: {
'accept-encoding': 'gzip'
}
};
var compressionType = compression.checkHeaders(request);
compressionType.should.equal('gzip');
});
it('should return deflate if only deflate is defined.', function() {
var request = {
headers: {
'accept-encoding': 'deflate'
}
};
var compressionType = compression.checkHeaders(request);
compressionType.should.equal('deflate');
});
it('should return deflate if gzip and deflate are defined.', function() {
var request = {
headers: {
'accept-encoding': 'deflate, gzip'
}
};
var compressionType = compression.checkHeaders(request);
compressionType.should.equal('deflate');
});
afterEach(function() {
compression = null;
});
});
describe('#isContentCompressable()', function() {
var compression;
beforeEach(function() {
compression = require('../../Utilities/compression');
});
[
['application/json', true],
['text/html', true],
['application/x-javascript', true],
['text/css', true],
['htm', true],
['html', true],
['js', true],
['css', true],
['application/pdf', false],
['application/msword', false],
['pdf', false],
['apk', false]
].forEach(function(testCase, i) {
it('should return the expected result for a given content type or extension.', function() {
var isContentCompressable = compression.isContentCompressable(testCase[0]);
isContentCompressable.should.equal(testCase[1]);
});
});
afterEach(function() {
compression = null;
});
});
describe('#adjustHeaders()', function() {
var compression;
var headers;
beforeEach(function() {
headers = {};
compression = require('../../Utilities/compression');
});
var varyHeaderKey = 'Vary: Accept-Encoding';
var encodingHeaderKey = 'Content-Encoding';
it('should set the ' + varyHeaderKey + ' header regardless of input.', function() {
compression.adjustHeaders(headers, '');
headers.should.have.property(varyHeaderKey);
headers[varyHeaderKey].should.equal('gzip, deflate');
});
it('should set deflate when deflate is specified as the encoding', function() {
compression.adjustHeaders(headers, 'deflate');
headers[encodingHeaderKey].should.equal('deflate');
});
it('should set gzip when gzip is specified as the encoding', function() {
compression.adjustHeaders(headers, 'gzip');
headers[encodingHeaderKey].should.equal('gzip');
});
afterEach(function() {
headers = null;
compression = null;
});
});
describe('#compress()', function() {
describe('valid content tests', function() {
var compression;
var proxyZlib;
beforeEach(function() {
var proxyCompressFunction = function(gzip, deflate) {
return function(data, callback) {
proxyZlib.gzipWasCalled = gzip;
proxyZlib.deflateWasCalled = deflate;
callback(null, 'compressed');
};
};
proxyZlib = {
deflate: proxyCompressFunction(false, true),
gzip: proxyCompressFunction(true, false),
gzipWasCalled: false,
deflateWasCalled: false
};
var proxies = {
'zlib': proxyZlib
};
compression = proxyquire('../../Utilities/compression', proxies);
});
it('should use deflate when deflate is specified', function(done) {
var deferred = compression.compress('test', 'deflate');
deferred.onComplete(function(result) {
result.should.have.property('error');
result.should.have.property('compressedData');
(!result.error).should.be.true;
result.compressedData.should.equal('compressed');
proxyZlib.gzipWasCalled.should.be.false;
proxyZlib.deflateWasCalled.should.be.true;
done();
});
});
it('should use gzip when gzip is specified', function(done) {
var deferred = compression.compress('test', 'gzip');
deferred.onComplete(function(result) {
result.should.have.property('error');
result.should.have.property('compressedData');
(!result.error).should.be.true;
result.compressedData.should.equal('compressed');
proxyZlib.gzipWasCalled.should.be.true;
proxyZlib.deflateWasCalled.should.be.false;
done();
});
});
afterEach(function() {
proxyZlib = null;
compression = null;
});
});
describe('invalid content tests', function() {
var compression;
var proxyZlib;
beforeEach(function() {
var proxyCompressFunction = function(gzip, deflate) {
return function(data, callback) {
proxyZlib.gzipWasCalled = gzip;
proxyZlib.deflateWasCalled = deflate;
callback('error', 'compressed');
};
};
proxyZlib = {
deflate: proxyCompressFunction(false, true),
gzip: proxyCompressFunction(true, false),
gzipWasCalled: false,
deflateWasCalled: false
};
var proxies = {
'zlib': proxyZlib
};
compression = proxyquire('../../Utilities/compression', proxies);
});
it('should return the original data when an error is returned when using gzip', function(done) {
var deferred = compression.compress('test', 'gzip');
deferred.onComplete(function(result) {
result.should.have.property('error');
result.should.have.property('compressedData');
result.error.should.equal('error');
result.compressedData.should.equal('test');
proxyZlib.gzipWasCalled.should.be.true;
proxyZlib.deflateWasCalled.should.be.false;
done();
});
});
it('should return the original data when an error is returned when using deflate', function(done) {
var deferred = compression.compress('test', 'deflate');
deferred.onComplete(function(result) {
result.should.have.property('error');
result.should.have.property('compressedData');
result.error.should.equal('error');
result.compressedData.should.equal('test');
proxyZlib.gzipWasCalled.should.be.false;
proxyZlib.deflateWasCalled.should.be.true;
done();
});
});
afterEach(function() {
proxyZlib = null;
compression = null;
});
});
});
});