tilestrata-dependency
Version:
A TileStrata plugin for loading another layer tile as a source
93 lines (88 loc) • 3.59 kB
JavaScript
var tilestrata = require('tilestrata');
var TileServer = tilestrata.TileServer;
var TileRequest = tilestrata.TileRequest;
var dependency = require('../index.js');
var assert = require('chai').assert;
describe('Provider Implementation "dependency"', function() {
it('should set "name"', function() {
assert.equal(dependency('basemap', 'tile.txt').name, 'basemap/tile.txt');
});
describe('serve()', function() {
it('should attach statusCode property to errors', function(done) {
var server = new TileServer();
var provider = dependency('basemap', 'tile.txt');
var req = TileRequest.parse('/basemap/3/2/1/tile.txt', {'x-tilestrata-skipcache':'1','x-random':'1'}, 'HEAD');
provider.serve(server, req, function(err, buffer, headers) {
assert.instanceOf(err, Error);
assert.equal(err.statusCode, 404);
done();
});
}),
it('should fetch and return dependency', function(done) {
var server = new TileServer();
server.layer('basemap').route('tile.txt').use({
serve: function(server, req, callback) {
assert.equal(req.method, 'GET');
assert.deepEqual(req.headers, {'x-tilestrata-skipcache':'basemap/tile.txt'});
callback(null, new Buffer('Test dependency', 'utf8'), {'X-Test': 'header'});
}
});
var provider = dependency('basemap', 'tile.txt');
var req = TileRequest.parse('/layer/3/2/1/tile.txt', {'x-tilestrata-skipcache':'basemap/tile.txt','x-random':'1'}, 'HEAD');
provider.serve(server, req, function(err, buffer, headers) {
if (err) throw err;
assert.instanceOf(buffer, Buffer);
assert.equal(buffer.toString('utf8'), 'Test dependency');
assert.equal(headers['X-Test'], 'header');
done();
});
});
it('should fetch and return dependency (no filename)', function(done) {
var server = new TileServer();
server.layer('basemap').route('*@2x.png').use({
serve: function(server, req, callback) {
assert.equal(req.filename, 't@2x.png', 'req.filename');
assert.isFalse(req.hasFilename, 'req.hasFilename');
callback(null, new Buffer('Test dependency', 'utf8'), {});
}
});
var provider = dependency('basemap', '*@2x.png');
var req = TileRequest.parse('/layer/3/2/1.png', {}, 'GET');
provider.serve(server, req, function(err, buffer, headers) {
if (err) throw err;
assert.equal(buffer.toString('utf8'), 'Test dependency');
done();
});
});
it('should allow dynamic source via function', function(done) {
var server = new TileServer();
server.layer('basemap').route('tile.txt').use({
serve: function(server, req, callback) {
callback(null, new Buffer('Test dependency', 'utf8'), {});
}
});
var provider = dependency(function(req) {
return ['basemap', 'tile.txt'];
});
var req = TileRequest.parse('/layer/3/2/1/tile.txt');
provider.serve(server, req, function(err, buffer, headers) {
if (err) throw err;
assert.equal(buffer.toString('utf8'), 'Test dependency');
done();
});
});
it('should return 404 Not Found if dynamic source returns falsey value', function(done) {
var called = false;
var server = new TileServer();
var provider = dependency(function(req) { called = true; });
var req = TileRequest.parse('/layer/3/2/1/tile.txt');
provider.serve(server, req, function(err, buffer, headers) {
assert.isTrue(called, 'provider function called');
assert.instanceOf(err, Error);
assert.equal(err.statusCode, 404, 'error.statusCode');
assert.equal(err.message, 'No source available for this request', 'error.message');
done();
});
});
});
});