516 lines
19 KiB
JavaScript
516 lines
19 KiB
JavaScript
require('../support/test_helper');
|
|
|
|
var fs = require('fs');
|
|
var assert = require('../support/assert');
|
|
var TestClient = require('../support/test-client');
|
|
var serverOptions = require('../../lib/cartodb/server_options');
|
|
var mapnik = require('windshaft').mapnik;
|
|
var IMAGE_TOLERANCE_PER_MIL = 5;
|
|
|
|
var CARTOCSS_LABELS = [
|
|
'#layer {',
|
|
' polygon-fill: #374C70;',
|
|
' polygon-opacity: 0.9;',
|
|
' line-width: 1;',
|
|
' line-color: #FFF;',
|
|
' line-opacity: 0.5;',
|
|
'}',
|
|
'#layer::labels {',
|
|
' text-name: [name];',
|
|
' text-face-name: \'DejaVu Sans Book\';',
|
|
' text-size: 20;',
|
|
' text-fill: #FFFFFF;',
|
|
' text-label-position-tolerance: 0;',
|
|
' text-halo-radius: 1;',
|
|
' text-halo-fill: #6F808D;',
|
|
' text-dy: -10;',
|
|
' text-allow-overlap: true;',
|
|
' text-placement: point;',
|
|
' text-placement-type: dummy;',
|
|
'}'
|
|
].join('\n');
|
|
|
|
function createMapConfig (bufferSize, cartocss) {
|
|
cartocss = cartocss || CARTOCSS_LABELS;
|
|
|
|
return {
|
|
version: '1.6.0',
|
|
buffersize: bufferSize,
|
|
layers: [{
|
|
type: "cartodb",
|
|
options: {
|
|
sql: [
|
|
'select',
|
|
' *',
|
|
'from',
|
|
' populated_places_simple_reduced',
|
|
].join('\n'),
|
|
cartocss: cartocss,
|
|
cartocss_version: '2.3.0',
|
|
interactivity: 'cartodb_id'
|
|
}
|
|
}]
|
|
};
|
|
}
|
|
|
|
describe('buffer size per format', function () {
|
|
let testClient;
|
|
|
|
var testCases = [
|
|
{
|
|
desc: 'should get png tile using buffer-size 0',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'png',
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png',
|
|
mapConfig: createMapConfig({ png: 0, 'grid.json': 0 }),
|
|
assert: function (tile, callback) {
|
|
assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback);
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get png tile using buffer-size 128',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'png',
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png',
|
|
mapConfig: createMapConfig({ png: 128, 'grid.json': 128 }),
|
|
assert: function (tile, callback) {
|
|
assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback);
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get mvt tile using buffer-size 0',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'mvt',
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.mvt',
|
|
mapConfig: createMapConfig({ mvt: 0 }),
|
|
assert: function (tile, callback) {
|
|
var tileJSON = tile.toJSON();
|
|
var features = tileJSON[0].features;
|
|
assert.equal(features.length, 1);
|
|
callback();
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get mvt tile using buffer-size 128',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'mvt',
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.mvt',
|
|
mapConfig: createMapConfig({ mvt: 128 }),
|
|
assert: function (tile, callback) {
|
|
var tileJSON = tile.toJSON();
|
|
var features = tileJSON[0].features;
|
|
assert.equal(features.length, 9);
|
|
callback();
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get grid.json tile using buffer-size 0 overriden by template params',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'grid.json',
|
|
layers: [0],
|
|
fixturePath: './test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json',
|
|
mapConfig: createMapConfig({ 'grid.json': 0 }),
|
|
assert: function (tile, callback) {
|
|
assert.utfgridEqualsFile(tile, this.fixturePath, 2,callback);
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get grid.json tile using buffer-size 128 overriden by template params',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'grid.json',
|
|
layers: [0],
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json',
|
|
mapConfig: createMapConfig({ 'grid.json': 128 }),
|
|
assert: function (tile, callback) {
|
|
assert.utfgridEqualsFile(tile, this.fixturePath, 2, callback);
|
|
}
|
|
}
|
|
];
|
|
|
|
afterEach(function(done) {
|
|
if (testClient) {
|
|
return testClient.drain(done);
|
|
}
|
|
return done();
|
|
});
|
|
|
|
const originalUsePostGIS = serverOptions.renderer.mvt.usePostGIS;
|
|
after(function () {
|
|
serverOptions.renderer.mvt.usePostGIS = originalUsePostGIS;
|
|
});
|
|
|
|
var testFn = (test) => {
|
|
it(test.desc, function (done) {
|
|
testClient = new TestClient(test.mapConfig, 1234);
|
|
var coords = test.coords;
|
|
var options = {
|
|
format: test.format,
|
|
layers: test.layers
|
|
};
|
|
testClient.getTile(coords.z, coords.x, coords.y, options, function (err, res, tile) {
|
|
assert.ifError(err);
|
|
// To generate images use:
|
|
// tile.save(test.fixturePath);
|
|
test.assert(tile, done);
|
|
});
|
|
});
|
|
};
|
|
|
|
testCases.filter(test => test.format !== 'mvt').forEach(function (test) {
|
|
testFn(test);
|
|
});
|
|
|
|
describe('using mapnik mvt renderer', function() {
|
|
before(function () {
|
|
serverOptions.renderer.mvt.usePostGIS = false;
|
|
});
|
|
testCases.filter(test => test.format === 'mvt').forEach(function (test) {
|
|
testFn(test);
|
|
});
|
|
});
|
|
|
|
const describe_pg = process.env.POSTGIS_VERSION >= '20400' ? describe : describe.skip;
|
|
describe_pg('using postgis mvt renderer', function() {
|
|
before(function () {
|
|
serverOptions.renderer.mvt.usePostGIS = true;
|
|
});
|
|
testCases.filter(test => test.format === 'mvt').forEach(function (test) {
|
|
testFn(test);
|
|
});
|
|
});
|
|
});
|
|
|
|
function createBufferSizeTemplate (name, buffersize, placeholders, cartocss) {
|
|
cartocss = cartocss || CARTOCSS_LABELS;
|
|
|
|
return {
|
|
"version": "0.0.1",
|
|
"name": name,
|
|
"placeholders": placeholders || {
|
|
"buffersize": {
|
|
"type": "number",
|
|
"default": 0
|
|
}
|
|
},
|
|
"layergroup": createMapConfig(buffersize)
|
|
};
|
|
}
|
|
|
|
describe('buffer size per format for named maps', function () {
|
|
var testCases = [
|
|
{
|
|
desc: 'should get png tile using buffer-size 0 (default value in template)',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'png',
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png',
|
|
template: createBufferSizeTemplate('named-default-buffer-size', {png: '<%= buffersize %>'}),
|
|
assert: function (tile, callback) {
|
|
assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback);
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get png tile using buffer-size 128 (placehoder value)',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'png',
|
|
placeholders: { buffersize: 128 },
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png',
|
|
template: createBufferSizeTemplate('named-custom-buffer-size', { png: '<%= buffersize %>'}),
|
|
assert: function (tile, callback) {
|
|
assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback);
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get png tile using buffer-size 0 (default value in template by format)',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'png',
|
|
placeholders: { buffersize_png: 0 },
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png',
|
|
template: createBufferSizeTemplate('named-default-buffer-size-by-format', {
|
|
png: '<%= buffersize_png %>'
|
|
}, {
|
|
"buffersize_png": {
|
|
"type": "number",
|
|
"default": "0"
|
|
}
|
|
}),
|
|
assert: function (tile, callback) {
|
|
assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback);
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get png tile using buffer-size 128 (placehoder value in template by format)',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'png',
|
|
placeholders: { buffersize_png: 128 },
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png',
|
|
template: createBufferSizeTemplate('named-custom-buffer-size-by-format', {
|
|
png: '<%= buffersize_png %>'
|
|
}, {
|
|
"buffersize_png": {
|
|
"type": "number",
|
|
"default": "0"
|
|
}
|
|
}),
|
|
assert: function (tile, callback) {
|
|
assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback);
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get grid.json tile using buffer-size 0 overriden by template params',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'grid.json',
|
|
layers: [0],
|
|
placeholders: { buffersize_gridjson: 0 },
|
|
fixturePath: './test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json',
|
|
template: createBufferSizeTemplate('named-default-buffer-size-by-format-gridjson', {
|
|
'grid.json': '<%= buffersize_gridjson %>'
|
|
}, {
|
|
"buffersize_gridjson": {
|
|
"type": "number",
|
|
"default": "0"
|
|
}
|
|
}),
|
|
assert: function (tile, callback) {
|
|
assert.utfgridEqualsFile(tile, this.fixturePath, 2,callback);
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get grid.json tile using buffer-size 128 overriden by template params',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'grid.json',
|
|
layers: [0],
|
|
placeholders: { buffersize_gridjson: 128 },
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json',
|
|
template: createBufferSizeTemplate('named-custom-buffer-size-by-format-gridjson', {
|
|
'grid.json': '<%= buffersize_gridjson %>'
|
|
}, {
|
|
"buffersize_gridjson": {
|
|
"type": "number",
|
|
"default": "0"
|
|
}
|
|
}),
|
|
assert: function (tile, callback) {
|
|
assert.utfgridEqualsFile(tile, this.fixturePath, 2, callback);
|
|
}
|
|
}
|
|
];
|
|
|
|
afterEach(function(done) {
|
|
if (this.testClient) {
|
|
return this.testClient.drain(done);
|
|
}
|
|
return done();
|
|
});
|
|
|
|
testCases.forEach(function (test) {
|
|
it(test.desc, function (done) {
|
|
this.testClient = new TestClient(test.template, 1234);
|
|
var coords = test.coords;
|
|
var options = {
|
|
format: test.format,
|
|
placeholders: test.placeholders,
|
|
layers: test.layers
|
|
};
|
|
this.testClient.getTile(coords.z, coords.x, coords.y, options, function (err, res, tile) {
|
|
assert.ifError(err);
|
|
// To generate images use:
|
|
//tile.save('./test/fixtures/buffer-size/tile-7.64.48-buffer-size-0-test.png');
|
|
test.assert(tile, done);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
describe('buffer size per format for named maps w/o placeholders', function () {
|
|
let testClient;
|
|
|
|
var testCases = [
|
|
{
|
|
desc: 'should get png tile using buffer-size 0 overriden by template params',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'png',
|
|
placeholders: {
|
|
buffersize: {
|
|
png: 0
|
|
}
|
|
},
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png',
|
|
template: createBufferSizeTemplate('named-no-buffer-size-png-0', {}, {}),
|
|
assert: function (tile, callback) {
|
|
assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback);
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get png tile using buffer-size 128 overriden by template params',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'png',
|
|
placeholders: {
|
|
buffersize: {
|
|
png: 128
|
|
}
|
|
},
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png',
|
|
template: createBufferSizeTemplate('named-no-buffer-size-png-128', {}, {}),
|
|
assert: function (tile, callback) {
|
|
assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback);
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get mvt tile using buffer-size 0 overriden by template params',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'mvt',
|
|
placeholders: {
|
|
buffersize: {
|
|
mvt: 0
|
|
}
|
|
},
|
|
fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.mvt',
|
|
template: createBufferSizeTemplate('named-no-buffer-size-mvt', {}, {}),
|
|
assert: function (tile, callback) {
|
|
var tileJSON = tile.toJSON();
|
|
var features = tileJSON[0].features;
|
|
|
|
var dataFixture = fs.readFileSync(this.fixturePath);
|
|
var vtile = new mapnik.VectorTile(this.coords.z, this.coords.x, this.coords.y);
|
|
vtile.setDataSync(dataFixture);
|
|
var vtileJSON = vtile.toJSON();
|
|
var vtileFeatures = vtileJSON[0].features;
|
|
|
|
assert.equal(features.length, vtileFeatures.length);
|
|
callback();
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get mvt tile using buffer-size 128 overriden by template params',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'mvt',
|
|
placeholders: {
|
|
buffersize: {
|
|
mvt: 128
|
|
}
|
|
},
|
|
fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-128.mvt',
|
|
template: createBufferSizeTemplate('named-no-buffer-size-mvt-128', {}, {}),
|
|
assert: function (tile, callback) {
|
|
var tileJSON = tile.toJSON();
|
|
var features = tileJSON[0].features;
|
|
|
|
var dataFixture = fs.readFileSync(this.fixturePath);
|
|
var vtile = new mapnik.VectorTile(this.coords.z, this.coords.x, this.coords.y);
|
|
vtile.setDataSync(dataFixture);
|
|
var vtileJSON = vtile.toJSON();
|
|
var vtileFeatures = vtileJSON[0].features;
|
|
|
|
assert.equal(features.length, vtileFeatures.length);
|
|
callback();
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get grid.json tile using buffer-size 0 overriden by template params',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'grid.json',
|
|
layers: [0],
|
|
placeholders: {
|
|
buffersize: {
|
|
'grid.json': 0
|
|
}
|
|
},
|
|
fixturePath: './test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json',
|
|
template: createBufferSizeTemplate('named-no-buffer-size-grid-json-0', {}, {}),
|
|
assert: function (tile, callback) {
|
|
assert.utfgridEqualsFile(tile, this.fixturePath, 2,callback);
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get grid.json tile using buffer-size 128 overriden by template params',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'grid.json',
|
|
layers: [0],
|
|
placeholders: {
|
|
buffersize: {
|
|
'grid.json': 128
|
|
}
|
|
},
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json',
|
|
template: createBufferSizeTemplate('named-no-buffer-size-grid-json-128', {}, {}),
|
|
assert: function (tile, callback) {
|
|
assert.utfgridEqualsFile(tile, this.fixturePath, 2, callback);
|
|
}
|
|
},
|
|
{
|
|
desc: 'should get png tile using buffer-size 0' +
|
|
' overriden by template params with no buffersize in mapconfig',
|
|
coords: { z: 7, x: 64, y: 48 },
|
|
format: 'png',
|
|
placeholders: {
|
|
buffersize: {
|
|
png: 0
|
|
}
|
|
},
|
|
fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png',
|
|
template: createBufferSizeTemplate('named-no-buffer-size-mapconfig-png-0', undefined, {}),
|
|
assert: function (tile, callback) {
|
|
assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback);
|
|
}
|
|
},
|
|
|
|
];
|
|
|
|
afterEach(function(done) {
|
|
if (testClient) {
|
|
return testClient.drain(done);
|
|
}
|
|
return done();
|
|
});
|
|
|
|
const originalUsePostGIS = serverOptions.renderer.mvt.usePostGIS;
|
|
after(function () {
|
|
serverOptions.renderer.mvt.usePostGIS = originalUsePostGIS;
|
|
});
|
|
|
|
var testFn = (test) => {
|
|
it(test.desc, function (done) {
|
|
test.template.name += '_1';
|
|
testClient = new TestClient(test.template, 1234);
|
|
var coords = test.coords;
|
|
var options = {
|
|
format: test.format,
|
|
placeholders: test.placeholders,
|
|
layers: test.layers
|
|
};
|
|
testClient.getTile(coords.z, coords.x, coords.y, options, function (err, res, tile) {
|
|
assert.ifError(err);
|
|
// To generate images use:
|
|
//tile.save(test.fixturePath);
|
|
// require('fs').writeFileSync(test.fixturePath, JSON.stringify(tile));
|
|
// require('fs').writeFileSync(test.fixturePath, tile.getDataSync());
|
|
test.assert(tile, done);
|
|
});
|
|
});
|
|
};
|
|
|
|
testCases.filter(test => test.format !== 'mvt').forEach(function (test) {
|
|
testFn(test);
|
|
});
|
|
|
|
describe('using mapnik mvt renderer', function() {
|
|
before(function () {
|
|
serverOptions.renderer.mvt.usePostGIS = false;
|
|
});
|
|
testCases.filter(test => test.format === 'mvt').forEach(function (test) {
|
|
testFn(test);
|
|
});
|
|
});
|
|
|
|
const describe_pg = process.env.POSTGIS_VERSION >= '20400' ? describe : describe.skip;
|
|
describe_pg('using postgis mvt renderer', function() {
|
|
before(function () {
|
|
serverOptions.renderer.mvt.usePostGIS = true;
|
|
});
|
|
testCases.filter(test => test.format === 'mvt').forEach(function (test) {
|
|
testFn(test);
|
|
});
|
|
});
|
|
});
|