imgr-le
Version:
Image resizing, cropping, optimisation and serving
477 lines (450 loc) • 20.4 kB
JavaScript
var assert = require('assert')
, express = require('express')
, request = require('request')
, IMGR = require('../lib/imgr').IMGR
, imagesize = require('../lib/size');
var images = __dirname + '/images/'
, compiled = __dirname + '/tmp/compiled/';
var imgr = function (options) {
return new IMGR(options);
};
var port = 12345;
function server() {
var app = express();
app.host = 'http://localhost:' + port;
app.server = app.listen(port++);
return app;
}
assert.statusCode = function (path, code, callback) {
request(path, function (err, res) {
assert(!err, err);
assert.equal(res.statusCode, code, path + ' failed (' + res.statusCode + ')');
callback();
});
};
describe('Server', function () {
it('should serve images from a directory under a custom namespace', function (done) {
var app = server();
imgr().serve(images)
.namespace('/foo')
.using(app);
assert.statusCode(app.host + '/foo/1.jpg', 200, function () {
assert.statusCode(app.host + '/foo/nested/folder/1.jpg', 200, function () {
assert.statusCode(app.host + '/foo/2.png', 200, function () {
assert.statusCode(app.host + '/foo/nothere.jpg', 404, function () {
app.server.close();
done();
});
});
});
});
});
it('should serve images from a directory', function (done) {
var app = server();
imgr().serve(images).using(app);
assert.statusCode(app.host + '/1.jpg', 200, function () {
assert.statusCode(app.host + '/nested/folder/1.jpg', 200, function () {
assert.statusCode(app.host + '/2.png', 200, function () {
assert.statusCode(app.host + '/nothere.jpg', 404, function () {
app.server.close();
done();
});
});
});
});
});
it('should respond to HEAD requests', function (done) {
var app = server();
imgr().serve(images).using(app);
request({ method: 'HEAD', url: app.host + '/1.jpg' }, function (err, res, body) {
assert(!err, err);
assert.equal(res.statusCode, 200);
assert.equal(res.headers['content-type'], 'image/jpeg');
assert.equal(res.headers['content-length'], 70096);
assert(!body);
app.server.close();
done();
});
});
it('should not serve images from the content directory if try_content is false', function (done) {
var app = server();
imgr({ try_content: false }).serve(images).using(app);
assert.statusCode(app.host + '/1.jpg', 404, function () {
app.server.close();
done();
});
});
it('should serve images with a custom width', function (done) {
var app = server();
imgr().serve(images)
.namespace('/foo')
.cacheDir(compiled)
.using(app);
assert.statusCode(app.host + '/foo/200x/1.jpg', 200, function () {
imagesize(compiled + '200x/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 200);
assert.statusCode(app.host + '/foo/nested/folder/200x/1.jpg', 200, function () {
imagesize(compiled + 'nested/folder/200x/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 200);
assert.equal(size.height, 104);
app.server.close();
done();
});
});
});
});
});
it('should force a resize of images if try_cache is false', function (done) {
var app = server();
imgr({ try_cache: false }).serve(images)
.namespace('/foo')
.cacheDir(compiled)
.using(app);
assert.statusCode(app.host + '/foo/200x/1.jpg', 200, function () {
imagesize(compiled + '200x/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 200);
assert.statusCode(app.host + '/foo/200x/1.jpg', 200, function () {
imagesize(compiled + '200x/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 200);
assert.equal(size.height, 104);
app.server.close();
done();
});
});
});
});
});
it('should serve images with a custom height', function (done) {
var app = server();
imgr().serve(images)
.namespace('/foo')
.cacheDir(compiled)
.using(app);
assert.statusCode(app.host + '/foo/x200/1.jpg', 200, function () {
imagesize(compiled + 'x200/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.height, 200);
assert.statusCode(app.host + '/foo/nested/folder/x200/1.jpg', 200, function () {
imagesize(compiled + 'nested/folder/x200/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.height, 200);
assert.equal(size.width, 384);
app.server.close();
done();
});
});
});
});
});
it('should serve images with a custom width and height', function (done) {
var app = server();
imgr().serve(images)
.namespace('/foo')
.cacheDir(compiled)
.using(app);
assert.statusCode(app.host + '/foo/300x200/1.jpg', 200, function () {
imagesize(compiled + '300x200/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 300);
assert.equal(size.height, 200);
assert.statusCode(app.host + '/foo/nested/folder/300x200/1.jpg', 200, function () {
imagesize(compiled + 'nested/folder/300x200/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 300);
assert.equal(size.height, 200);
app.server.close();
done();
});
});
});
});
});
it('should allow for a custom resize filter to be used', function (done) {
var app = server();
imgr({ filter: 'Gaussian' }).serve(images)
.namespace('/foo')
.cacheDir(compiled)
.using(app);
assert.statusCode(app.host + '/foo/300x400/1.jpg', 200, function () {
imagesize(compiled + '300x400/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 300);
assert.equal(size.height, 400);
assert.statusCode(app.host + '/foo/nested/folder/300x400/1.jpg', 200, function () {
imagesize(compiled + 'nested/folder/300x400/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 300);
assert.equal(size.height, 400);
app.server.close();
done();
});
});
});
});
});
it('should create progressive jpegs', function (done) {
var app = server();
imgr({ interlace: 'Line' }).serve(images)
.namespace('/foo')
.cacheDir(compiled)
.using(app);
assert.statusCode(app.host + '/foo/300x500/1.jpg', 200, function () {
imagesize(compiled + '300x500/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 300);
assert.equal(size.height, 500);
assert.statusCode(app.host + '/foo/nested/folder/300x500/1.jpg', 200, function () {
imagesize(compiled + 'nested/folder/300x500/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 300);
assert.equal(size.height, 500);
app.server.close();
done();
});
});
});
});
});
it('should serve images with a custom width, height and orientation', function (done) {
var app = server();
imgr().serve(images)
.namespace('/foo')
.cacheDir(compiled)
.using(app);
assert.statusCode(app.host + '/foo/300x200-top/1.jpg', 200, function () {
imagesize(compiled + '300x200-top/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 300);
assert.equal(size.height, 200);
assert.statusCode(app.host + '/foo/nested/folder/300x200-top/1.jpg', 200, function () {
imagesize(compiled + 'nested/folder/300x200-top/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 300);
assert.equal(size.height, 200);
app.server.close();
done();
});
});
});
});
});
it('should respect the whitelist', function (done) {
var app = server();
imgr().serve(images)
.namespace('/foo')
.cacheDir(compiled)
.whitelist([ '200x', '300x300' ])
.using(app);
assert.statusCode(app.host + '/foo/300x300/1.jpg', 200, function () {
assert.statusCode(app.host + '/foo/300x300-centre/1.jpg', 200, function () {
assert.statusCode(app.host + '/foo/200x/1.jpg', 200, function () {
assert.statusCode(app.host + '/foo/200x300/1.jpg', 403, function () {
assert.statusCode(app.host + '/foo/300x/1.jpg', 403, function () {
app.server.close();
done();
});
});
});
});
});
});
it('should allow for height wildcards in the whitelist', function (done) {
var app = server();
imgr().serve(images)
.namespace('/foo')
.cacheDir(compiled)
.whitelist([ '200x*' ])
.using(app);
assert.statusCode(app.host + '/foo/200x/1.jpg', 200, function () {
assert.statusCode(app.host + '/foo/200x1024/1.jpg', 200, function () {
assert.statusCode(app.host + '/foo/200x20/1.jpg', 200, function () {
assert.statusCode(app.host + '/foo/100x200/1.jpg', 403, function () {
app.server.close();
done();
});
});
});
});
});
it('should allow for width wildcards in the whitelist', function (done) {
var app = server();
imgr().serve(images)
.namespace('/foo')
.cacheDir(compiled)
.whitelist([ '*x200' ])
.using(app);
assert.statusCode(app.host + '/foo/x200/1.jpg', 200, function () {
assert.statusCode(app.host + '/foo/1024x200/1.jpg', 200, function () {
assert.statusCode(app.host + '/foo/20x200/1.jpg', 200, function () {
assert.statusCode(app.host + '/foo/200x100/1.jpg', 403, function () {
app.server.close();
done();
});
});
});
});
});
it('should respect the blacklist', function (done) {
var app = server();
imgr().serve(images)
.namespace('/foo')
.cacheDir(compiled)
.blacklist([ '400x', '500x500' ])
.using(app);
assert.statusCode(app.host + '/foo/400x400/1.jpg', 200, function () {
assert.statusCode(app.host + '/foo/500x500-centre/1.jpg', 403, function () {
assert.statusCode(app.host + '/foo/400x/1.jpg', 403, function () {
app.server.close();
done();
});
});
});
});
it('should support a custom rewriting strategy', function (done) {
var app = server();
imgr().serve(images)
.namespace('/foo')
.urlRewrite('/:path/:file-:size.:ext')
.cacheDir(compiled)
.using(app);
assert.statusCode(app.host + '/foo/1-300x200-top.jpg', 200, function () {
imagesize(compiled + '1-300x200-top.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 300);
assert.equal(size.height, 200);
assert.statusCode(app.host + '/foo/nested/folder/1-300x200-top.jpg', 200, function () {
imagesize(compiled + 'nested/folder/1-300x200-top.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 300);
assert.equal(size.height, 200);
app.server.close();
done();
});
});
});
});
});
it('should support a rewriting strategy without the extension', function (done) {
var app = server();
imgr().serve(images)
.namespace('/foo')
.urlRewrite('/:path/:size/:file')
.cacheDir(compiled)
.using(app);
assert.statusCode(app.host + '/foo/3', 200, function () {
assert.statusCode(app.host + '/foo/300x200-top/3', 200, function () {
imagesize(compiled + '300x200-top/3', function (err, size) {
assert(!err, err);
assert.equal(size.width, 300);
assert.equal(size.height, 200);
app.server.close();
done();
});
});
});
});
it('should redirect if there\'s a querystring and querystring_301 is true', function (done) {
var app = server();
imgr({ querystring_301: true }).serve(images)
.namespace('/foo')
.using(app);
assert.statusCode(app.host + '/foo/1.jpg?foo', 200, function () {
app.server.close();
app = server();
imgr({ querystring_301: true }).serve(images)
.namespace('/foo')
.using(app);
request({ url: app.host + '/foo/1.jpg?foo', followRedirect: false }, function (err, res) {
assert(!err, err);
assert.equal(res.statusCode, 301);
app.server.close();
done();
});
});
});
it('should serve images a configurable crop offset', function (done) {
var app = server();
imgr({ crop_offset: 10 }).serve(images)
.namespace('/foo')
.cacheDir(compiled)
.using(app);
assert.statusCode(app.host + '/foo/100x10-top/1.jpg', 200, function () {
imagesize(compiled + '100x10-top/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 100);
assert.equal(size.height, 10);
assert.statusCode(app.host + '/foo/100x10-bottom/1.jpg', 200, function () {
imagesize(compiled + '100x10-bottom/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 100);
assert.equal(size.height, 10);
assert.statusCode(app.host + '/foo/100x100-left/1.jpg', 200, function () {
imagesize(compiled + '100x100-left/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 100);
assert.equal(size.height, 100);
assert.statusCode(app.host + '/foo/100x100-right/1.jpg', 200, function () {
imagesize(compiled + '100x100-right/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 100);
assert.equal(size.height, 100);
app.server.close();
done();
});
});
});
});
});
});
});
});
});
it('should ignore crop offset if the crop is too large', function (done) {
var app = server();
imgr({ crop_offset: 90 }).serve(images)
.namespace('/foo')
.cacheDir(compiled)
.using(app);
assert.statusCode(app.host + '/foo/100x10-top/1.jpg', 200, function () {
imagesize(compiled + '100x10-top/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 100);
assert.equal(size.height, 10);
assert.statusCode(app.host + '/foo/724x377-top/1.jpg', 200, function () {
imagesize(compiled + '724x377-top/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 724);
assert.equal(size.height, 377);
assert.statusCode(app.host + '/foo/100x10-bottom/1.jpg', 200, function () {
imagesize(compiled + '100x10-bottom/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 100);
assert.equal(size.height, 10);
assert.statusCode(app.host + '/foo/100x100-left/1.jpg', 200, function () {
imagesize(compiled + '100x100-left/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 100);
assert.equal(size.height, 100);
assert.statusCode(app.host + '/foo/100x100-right/1.jpg', 200, function () {
imagesize(compiled + '100x100-right/1.jpg', function (err, size) {
assert(!err, err);
assert.equal(size.width, 100);
assert.equal(size.height, 100);
app.server.close();
done();
});
});
});
});
});
});
});
});
});
});
});
});