2017-07-18 01:43:59 +08:00
|
|
|
require('../support/test_helper');
|
|
|
|
|
2017-10-05 20:38:43 +08:00
|
|
|
var assert = require('../support/assert');
|
|
|
|
var TestClient = require('../support/test-client');
|
2017-10-06 22:07:24 +08:00
|
|
|
var serverOptions = require('../../lib/cartodb/server_options');
|
2017-07-18 01:43:59 +08:00
|
|
|
|
2017-10-05 20:38:43 +08:00
|
|
|
function createMapConfig(sql = TestClient.SQL.ONE_POINT) {
|
2017-07-18 01:43:59 +08:00
|
|
|
return {
|
|
|
|
version: '1.6.0',
|
|
|
|
layers: [{
|
|
|
|
type: "cartodb",
|
|
|
|
options: {
|
|
|
|
sql: sql,
|
|
|
|
cartocss: TestClient.CARTOCSS.POINTS,
|
|
|
|
cartocss_version: '2.3.0',
|
|
|
|
interactivity: 'cartodb_id'
|
|
|
|
}
|
|
|
|
}]
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2017-10-06 22:07:24 +08:00
|
|
|
describe('mvt (mapnik)', mvt(false));
|
2018-06-11 20:47:39 +08:00
|
|
|
if (process.env.POSTGIS_VERSION >= '20400') {
|
2017-10-16 17:08:46 +08:00
|
|
|
describe('mvt (postgis)', mvt(true));
|
|
|
|
}
|
2017-10-06 22:07:24 +08:00
|
|
|
|
|
|
|
function mvt(usePostGIS) {
|
|
|
|
return function () {
|
2017-10-06 22:21:34 +08:00
|
|
|
const originalUsePostGIS = serverOptions.renderer.mvt.usePostGIS;
|
2017-10-06 22:07:24 +08:00
|
|
|
before(function () {
|
|
|
|
serverOptions.renderer.mvt.usePostGIS = usePostGIS;
|
|
|
|
});
|
2017-10-06 22:21:34 +08:00
|
|
|
after(function (){
|
|
|
|
serverOptions.renderer.mvt.usePostGIS = originalUsePostGIS;
|
|
|
|
});
|
2017-10-05 20:38:43 +08:00
|
|
|
|
2018-03-03 01:22:53 +08:00
|
|
|
describe('named map tile', function () {
|
|
|
|
it('should get default named vector tile', function (done) {
|
|
|
|
const apikeyToken = 1234;
|
2018-03-03 01:37:13 +08:00
|
|
|
const templateName = `mvt-template-${usePostGIS ? 'postgis' : 'mapnik'}`;
|
2018-03-03 01:22:53 +08:00
|
|
|
const template = {
|
|
|
|
version: '0.0.1',
|
|
|
|
name: templateName,
|
|
|
|
placeholders: {
|
|
|
|
buffersize: {
|
|
|
|
type: 'number',
|
|
|
|
default: 0
|
|
|
|
}
|
|
|
|
},
|
|
|
|
layergroup: {
|
|
|
|
version: '1.7.0',
|
|
|
|
layers: [{
|
|
|
|
type: 'cartodb',
|
|
|
|
options: {
|
|
|
|
sql: 'select * from populated_places_simple_reduced limit 10',
|
|
|
|
cartocss: TestClient.CARTOCSS.POINTS,
|
|
|
|
cartocss_version: '2.3.0',
|
|
|
|
}
|
|
|
|
}]
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const testClient = new TestClient(template, apikeyToken);
|
2018-08-31 19:46:39 +08:00
|
|
|
testClient.keysToDelete['map_tpl|localhost'] = 0;
|
2018-03-03 01:22:53 +08:00
|
|
|
|
|
|
|
testClient.getNamedTile(templateName, 0, 0, 0, 'mvt', {}, (err, res, tile) => {
|
|
|
|
if (err) {
|
|
|
|
return done(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
const tileJSON = tile.toJSON();
|
|
|
|
|
|
|
|
assert.equal(tileJSON[0].features.length, 10);
|
|
|
|
|
2018-03-03 01:37:13 +08:00
|
|
|
testClient.drain(done);
|
2018-03-03 01:22:53 +08:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2017-10-05 20:38:43 +08:00
|
|
|
describe('analysis-layers-dataviews-mvt', function () {
|
|
|
|
|
|
|
|
function createMapConfig(layers, dataviews, analysis) {
|
|
|
|
return {
|
|
|
|
version: '1.5.0',
|
|
|
|
layers: layers,
|
|
|
|
dataviews: dataviews || {},
|
|
|
|
analyses: analysis || []
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
var CARTOCSS = [
|
|
|
|
"#points {",
|
|
|
|
" marker-fill-opacity: 1.0;",
|
|
|
|
" marker-line-color: #FFF;",
|
|
|
|
" marker-line-width: 0.5;",
|
|
|
|
" marker-line-opacity: 1.0;",
|
|
|
|
" marker-placement: point;",
|
|
|
|
" marker-type: ellipse;",
|
|
|
|
" marker-width: 8;",
|
|
|
|
" marker-fill: red;",
|
|
|
|
" marker-allow-overlap: true;",
|
|
|
|
"}"
|
|
|
|
].join('\n');
|
|
|
|
|
|
|
|
var mapConfig = createMapConfig(
|
|
|
|
[
|
|
|
|
{
|
|
|
|
"type": "cartodb",
|
|
|
|
"options": {
|
|
|
|
"source": {
|
|
|
|
"id": "2570e105-7b37-40d2-bdf4-1af889598745"
|
|
|
|
},
|
|
|
|
"cartocss": CARTOCSS,
|
|
|
|
"cartocss_version": "2.3.0"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
],
|
|
|
|
{
|
|
|
|
pop_max_histogram: {
|
|
|
|
source: {
|
|
|
|
id: '2570e105-7b37-40d2-bdf4-1af889598745'
|
|
|
|
},
|
|
|
|
type: 'histogram',
|
|
|
|
options: {
|
|
|
|
column: 'pop_max'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
[
|
|
|
|
{
|
|
|
|
"id": "2570e105-7b37-40d2-bdf4-1af889598745",
|
|
|
|
"type": "source",
|
|
|
|
"params": {
|
|
|
|
"query": "select * from populated_places_simple_reduced"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
);
|
|
|
|
|
|
|
|
it('should get pop_max column from dataview', function (done) {
|
2017-10-06 22:07:24 +08:00
|
|
|
var testClient = new TestClient(mapConfig);
|
2017-10-05 20:38:43 +08:00
|
|
|
|
|
|
|
testClient.getTile(0, 0, 0, { format: 'mvt', layers: 0 }, function (err, res, MVT) {
|
|
|
|
var geojsonTile = JSON.parse(MVT.toGeoJSONSync(0));
|
|
|
|
assert.ok(!err, err);
|
|
|
|
|
2017-10-05 22:08:05 +08:00
|
|
|
assert.ok(Array.isArray(geojsonTile.features));
|
|
|
|
assert.ok(geojsonTile.features.length > 0);
|
|
|
|
var feature = geojsonTile.features[0];
|
2017-10-05 20:38:43 +08:00
|
|
|
assert.ok(feature.properties.hasOwnProperty('pop_max'), 'Missing pop_max property');
|
|
|
|
|
|
|
|
testClient.drain(done);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
2017-07-18 01:43:59 +08:00
|
|
|
const testCases = [
|
|
|
|
{
|
|
|
|
desc: 'should get empty mvt with code 204 (no content)',
|
|
|
|
coords: { z: 0, x: 0, y: 0 },
|
|
|
|
format: 'mvt',
|
2017-07-31 23:58:33 +08:00
|
|
|
response: {
|
|
|
|
status: 204,
|
|
|
|
headers: {
|
|
|
|
'Content-Type': undefined
|
|
|
|
}
|
|
|
|
},
|
2017-07-18 16:44:27 +08:00
|
|
|
mapConfig: createMapConfig(TestClient.SQL.EMPTY)
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: 'should get mvt tile with code 200 (ok)',
|
|
|
|
coords: { z: 0, x: 0, y: 0 },
|
|
|
|
format: 'mvt',
|
2017-07-31 23:58:33 +08:00
|
|
|
response: {
|
|
|
|
status: 200,
|
|
|
|
headers: {
|
|
|
|
'Content-Type': 'application/x-protobuf'
|
|
|
|
}
|
|
|
|
},
|
2017-07-18 16:44:27 +08:00
|
|
|
mapConfig: createMapConfig()
|
2017-07-18 01:43:59 +08:00
|
|
|
}
|
|
|
|
];
|
|
|
|
|
|
|
|
testCases.forEach(function (test) {
|
|
|
|
it(test.desc, done => {
|
2017-10-06 22:07:24 +08:00
|
|
|
var testClient = new TestClient(test.mapConfig);
|
2017-07-18 01:43:59 +08:00
|
|
|
const { z, x, y } = test.coords;
|
2017-07-31 23:58:33 +08:00
|
|
|
const { format, response } = test;
|
2017-07-18 01:43:59 +08:00
|
|
|
|
2017-10-09 21:49:51 +08:00
|
|
|
testClient.getTile(z, x, y, { format, response }, err => {
|
2017-07-18 01:43:59 +08:00
|
|
|
assert.ifError(err);
|
|
|
|
testClient.drain(done);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2018-10-11 23:59:49 +08:00
|
|
|
|
|
|
|
describe('overviews-mvt', function () {
|
|
|
|
function createMapConfig(layers, dataviews, analysis) {
|
|
|
|
return {
|
|
|
|
version: '1.8.0',
|
|
|
|
layers: layers,
|
|
|
|
dataviews: dataviews || {},
|
|
|
|
analyses: analysis || []
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
it('should use overviews to fetch mvt data', function (done) {
|
2018-10-15 14:25:44 +08:00
|
|
|
const mapConfig = createMapConfig(
|
2018-10-11 23:59:49 +08:00
|
|
|
[
|
|
|
|
{
|
|
|
|
"type": "cartodb",
|
|
|
|
"options": {
|
|
|
|
"sql": 'SELECT * FROM test_table_overviews',
|
|
|
|
"cartocss": TestClient.CARTOCSS.POINTS,
|
|
|
|
"cartocss_version": "2.3.0"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
);
|
|
|
|
|
2018-10-15 14:25:44 +08:00
|
|
|
const testClient = new TestClient(mapConfig);
|
2018-10-11 23:59:49 +08:00
|
|
|
|
2018-10-15 14:25:44 +08:00
|
|
|
testClient.getTile(0, 0, 0, { format: 'mvt', layers: 0 }, function (err, res, mvt) {
|
|
|
|
assert.ifError(err);
|
|
|
|
|
|
|
|
const geojsonTile = JSON.parse(mvt.toGeoJSONSync(0));
|
2018-10-11 23:59:49 +08:00
|
|
|
|
|
|
|
assert.ok(Array.isArray(geojsonTile.features));
|
|
|
|
assert.ok(geojsonTile.features.length > 0);
|
2018-10-15 14:25:44 +08:00
|
|
|
|
|
|
|
const feature = geojsonTile.features[0];
|
2018-10-11 23:59:49 +08:00
|
|
|
|
|
|
|
assert.ok(feature.properties.hasOwnProperty('_feature_count'), 'Missing _feature_count property');
|
|
|
|
assert.equal(feature.properties.cartodb_id, 1);
|
|
|
|
assert.equal(feature.properties.name, 'Hawai');
|
|
|
|
assert.equal(feature.properties._feature_count, 5); // original table has _feature_count = 1
|
|
|
|
assert.equal(feature.properties.value, 3); // original table has value = 1.0
|
|
|
|
|
|
|
|
testClient.drain(done);
|
|
|
|
});
|
|
|
|
});
|
2018-10-15 14:23:39 +08:00
|
|
|
|
|
|
|
it('two layers, first should use overviews, second shouldn\'t', function (done) {
|
|
|
|
const mapConfig = createMapConfig(
|
|
|
|
[
|
|
|
|
{
|
|
|
|
"type": "cartodb",
|
|
|
|
"options": {
|
|
|
|
"sql": 'SELECT * FROM test_table_overviews',
|
|
|
|
"cartocss": TestClient.CARTOCSS.POINTS,
|
|
|
|
"cartocss_version": "2.3.0"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"type": "cartodb",
|
|
|
|
"options": {
|
|
|
|
"sql": 'SELECT * FROM test_table',
|
|
|
|
"cartocss": TestClient.CARTOCSS.POINTS,
|
|
|
|
"cartocss_version": "2.3.0"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
);
|
|
|
|
|
|
|
|
var testClient = new TestClient(mapConfig);
|
|
|
|
|
|
|
|
testClient.getTile(0, 0, 0, { format: 'mvt' }, function (err, res, mvt) {
|
|
|
|
assert.ifError(err);
|
|
|
|
|
|
|
|
const tileWithOverviews = JSON.parse(mvt.toGeoJSONSync(0));
|
|
|
|
const tileWithoutOverviews = JSON.parse(mvt.toGeoJSONSync(1));
|
|
|
|
|
|
|
|
assert.ok(Array.isArray(tileWithOverviews.features));
|
|
|
|
assert.equal(tileWithOverviews.features.length, 1);
|
|
|
|
|
|
|
|
assert.ok(Array.isArray(tileWithoutOverviews.features));
|
|
|
|
assert.equal(tileWithoutOverviews.features.length, 5);
|
|
|
|
|
|
|
|
testClient.drain(done);
|
|
|
|
});
|
|
|
|
});
|
2018-10-11 23:59:49 +08:00
|
|
|
});
|
2017-10-09 21:49:51 +08:00
|
|
|
};
|
2017-11-29 20:12:09 +08:00
|
|
|
}
|