From c12e5f7a27b598db500cefe2899db921708b106b Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Fri, 13 May 2016 16:56:52 +0200 Subject: [PATCH] Fix named maps with analysis Named map provider was missing analysis backend dependency Fixes #450 --- lib/cartodb/cache/named_map_provider_cache.js | 6 +- lib/cartodb/server.js | 1 + test/acceptance/analysis/named-maps.js | 439 ++++++++++-------- ...d-map-buffer-layergroup-static-preview.png | Bin 0 -> 13684 bytes .../named-map-buffer-static-preview.png | Bin 0 -> 44790 bytes test/support/test-client.js | 38 ++ 6 files changed, 276 insertions(+), 208 deletions(-) create mode 100644 test/fixtures/analysis/named-map-buffer-layergroup-static-preview.png create mode 100644 test/fixtures/analysis/named-map-buffer-static-preview.png diff --git a/lib/cartodb/cache/named_map_provider_cache.js b/lib/cartodb/cache/named_map_provider_cache.js index a25850dc..9adb29b9 100644 --- a/lib/cartodb/cache/named_map_provider_cache.js +++ b/lib/cartodb/cache/named_map_provider_cache.js @@ -8,15 +8,15 @@ var queue = require('queue-async'); var LruCache = require("lru-cache"); -function NamedMapProviderCache(templateMaps, pgConnection, metadataBackend, userLimitsApi, overviewsAdapter, - turboCartoAdapter) { +function NamedMapProviderCache(templateMaps, pgConnection, metadataBackend, analysisBackend, userLimitsApi, + overviewsAdapter, turboCartoAdapter) { this.templateMaps = templateMaps; this.pgConnection = pgConnection; this.metadataBackend = metadataBackend; this.userLimitsApi = userLimitsApi; this.namedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps); - this.analysisMapConfigAdapter = new AnalysisMapConfigAdapter(); + this.analysisMapConfigAdapter = new AnalysisMapConfigAdapter(analysisBackend); this.overviewsAdapter = overviewsAdapter; this.turboCartoAdapter = turboCartoAdapter; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index ed24f651..0f15e240 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -157,6 +157,7 @@ module.exports = function(serverOptions) { templateMaps, pgConnection, metadataBackend, + analysisBackend, userLimitsApi, overviewsAdapter, turboCartoAdapter diff --git a/test/acceptance/analysis/named-maps.js b/test/acceptance/analysis/named-maps.js index 13d84120..26341a0a 100644 --- a/test/acceptance/analysis/named-maps.js +++ b/test/acceptance/analysis/named-maps.js @@ -1,11 +1,11 @@ var assert = require('../../support/assert'); -var step = require('step'); var helper = require('../../support/test_helper'); var CartodbWindshaft = require('../../../lib/cartodb/server'); var serverOptions = require('../../../lib/cartodb/server_options'); var server = new CartodbWindshaft(serverOptions); +var TestClient = require('../../support/test-client'); var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); @@ -16,230 +16,259 @@ describe('named-maps analysis', function() { var username = 'localhost'; var widgetsTemplateName = 'widgets-template'; - var layergroupid; - var layergroup; - var keysToDelete; - - beforeEach(function(done) { - keysToDelete = {}; - - var widgetsTemplate = { - version: '0.0.1', - name: widgetsTemplateName, - layergroup: { - version: '1.5.0', - layers: [ - { - "type": "cartodb", - "options": { - "source": { - "id": "HEAD" - }, - "cartocss": '#buffer { polygon-fill: red; }', - "cartocss_version": "2.3.0" - } - } - ], - dataviews: { - pop_max_histogram: { - source: { - id: 'HEAD' + var widgetsTemplate = { + version: '0.0.1', + name: widgetsTemplateName, + layergroup: { + version: '1.5.0', + layers: [ + { + "type": "cartodb", + "options": { + "source": { + "id": "HEAD" }, - type: 'histogram', - options: { - column: 'pop_max' - } + "cartocss": '#buffer { polygon-fill: red; }', + "cartocss_version": "2.3.0" } - }, - analyses: [ - { - "id": "HEAD", - "type": "buffer", - "params": { - "source": { - "id": "2570e105-7b37-40d2-bdf4-1af889598745", - "type": "source", - "params": { - "query": "select * from populated_places_simple_reduced" - } - }, - "radius": 50000 - } + } + ], + dataviews: { + pop_max_histogram: { + source: { + id: 'HEAD' + }, + type: 'histogram', + options: { + column: 'pop_max' } - ] - } - }; - - var template_params = {}; - - step( - function createTemplate() - { - var next = this; - assert.response( - server, - { - url: '/api/v1/map/named?api_key=1234', - method: 'POST', - headers: { - host: username, - 'Content-Type': 'application/json' + } + }, + analyses: [ + { + "id": "HEAD", + "type": "buffer", + "params": { + "source": { + "id": "2570e105-7b37-40d2-bdf4-1af889598745", + "type": "source", + "params": { + "query": "select * from populated_places_simple_reduced" + } }, - data: JSON.stringify(widgetsTemplate) - }, - { - status: 200 - }, - function(res, err) { - next(err, res); + "radius": 50000 } - ); - }, - function instantiateTemplate(err, res) { - assert.ifError(err); + } + ] + } + }; - assert.deepEqual(JSON.parse(res.body), { template_id: widgetsTemplateName }); - var next = this; - assert.response( - server, - { - url: '/api/v1/map/named/' + widgetsTemplateName, - method: 'POST', - headers: { - host: username, - 'Content-Type': 'application/json' - }, - data: JSON.stringify(template_params) - }, - { - status: 200 - }, - function(res) { - next(null, res); - } - ); - }, - function finish(err, res) { - assert.ifError(err); - - layergroup = JSON.parse(res.body); - assert.ok(layergroup.hasOwnProperty('layergroupid'), "Missing 'layergroupid' from: " + res.body); - layergroupid = layergroup.layergroupid; - - assert.ok( - Array.isArray(layergroup.metadata.analyses), - 'Missing "analyses" array metadata from: ' + res.body - ); - var analyses = layergroup.metadata.analyses; - assert.equal(analyses.length, 1, 'Invalid number of analyses in metadata'); - var nodes = analyses[0].nodes; - var nodesIds = Object.keys(nodes); - assert.deepEqual(nodesIds, ['2570e105-7b37-40d2-bdf4-1af889598745', 'HEAD']); - nodesIds.forEach(function(nodeId) { - var node = nodes[nodeId]; - assert.ok(node.hasOwnProperty('url'), 'Missing "url" attribute in node'); - assert.ok(node.hasOwnProperty('status'), 'Missing "status" attribute in node'); - assert.ok(!node.hasOwnProperty('query'), 'Unexpected "query" attribute in node'); - }); - - keysToDelete['map_cfg|' + LayergroupToken.parse(layergroup.layergroupid).token] = 0; - keysToDelete['user:localhost:mapviews:global'] = 5; - - return done(); - } - ); - - }); - - afterEach(function(done) { - step( - function deleteTemplate(err) { - assert.ifError(err); - var next = this; - assert.response( - server, - { - url: '/api/v1/map/named/' + widgetsTemplateName + '?api_key=1234', - method: 'DELETE', - headers: { - host: username - } - }, - { - status: 204 - }, - function(res, err) { - next(err, res); - } - ); - }, - function deleteRedisKeys(err) { - assert.ifError(err); - helper.deleteRedisKeys(keysToDelete, done); - } - ); - }); - - it('should be able to retrieve images from analysis', function(done) { + beforeEach(function createTemplate(done) { assert.response( server, { - url: '/api/v1/map/' + layergroupid + '/6/31/24.png', - method: 'GET', - encoding: 'binary', + url: '/api/v1/map/named?api_key=1234', + method: 'POST', + headers: { + host: username, + 'Content-Type': 'application/json' + }, + data: JSON.stringify(widgetsTemplate) + }, + { + status: 200 + }, + function(res, err) { + assert.deepEqual(JSON.parse(res.body), { template_id: widgetsTemplateName }); + return done(err); + } + ); + }); + + afterEach(function deleteTemplate(done) { + assert.response( + server, + { + url: '/api/v1/map/named/' + widgetsTemplateName + '?api_key=1234', + method: 'DELETE', headers: { host: username } }, { - status: 200, - headers: { - 'Content-Type': 'image/png' - } + status: 204 }, function(res, err) { - if (err) { - return done(err); - } + return done(err); + } + ); + }); - var fixturePath = './test/fixtures/analysis/named-map-buffer.png'; - assert.imageBufferIsSimilarToFile(res.body, fixturePath, IMAGE_TOLERANCE_PER_MIL, function(err) { + describe('layergroup', function() { + var layergroupid; + var layergroup; + var keysToDelete; + + beforeEach(function(done) { + keysToDelete = {}; + + assert.response( + server, + { + url: '/api/v1/map/named/' + widgetsTemplateName, + method: 'POST', + headers: { + host: username, + 'Content-Type': 'application/json' + }, + data: JSON.stringify({}) + }, + { + status: 200 + }, + function(res, err) { + assert.ifError(err); + + layergroup = JSON.parse(res.body); + assert.ok(layergroup.hasOwnProperty('layergroupid'), "Missing 'layergroupid' from: " + res.body); + layergroupid = layergroup.layergroupid; + + assert.ok( + Array.isArray(layergroup.metadata.analyses), + 'Missing "analyses" array metadata from: ' + res.body + ); + var analyses = layergroup.metadata.analyses; + assert.equal(analyses.length, 1, 'Invalid number of analyses in metadata'); + var nodes = analyses[0].nodes; + var nodesIds = Object.keys(nodes); + assert.deepEqual(nodesIds, ['2570e105-7b37-40d2-bdf4-1af889598745', 'HEAD']); + nodesIds.forEach(function(nodeId) { + var node = nodes[nodeId]; + assert.ok(node.hasOwnProperty('url'), 'Missing "url" attribute in node'); + assert.ok(node.hasOwnProperty('status'), 'Missing "status" attribute in node'); + assert.ok(!node.hasOwnProperty('query'), 'Unexpected "query" attribute in node'); + }); + + keysToDelete['map_cfg|' + LayergroupToken.parse(layergroup.layergroupid).token] = 0; + keysToDelete['user:localhost:mapviews:global'] = 5; + + return done(); + } + ); + + }); + + afterEach(function(done) { + helper.deleteRedisKeys(keysToDelete, done); + }); + + it('should be able to retrieve images from analysis', function(done) { + assert.response( + server, + { + url: '/api/v1/map/' + layergroupid + '/6/31/24.png', + method: 'GET', + encoding: 'binary', + headers: { + host: username + } + }, + { + status: 200, + headers: { + 'Content-Type': 'image/png' + } + }, + function(res, err) { + if (err) { + return done(err); + } + + var fixturePath = './test/fixtures/analysis/named-map-buffer.png'; + assert.imageBufferIsSimilarToFile(res.body, fixturePath, IMAGE_TOLERANCE_PER_MIL, function(err) { + assert.ok(!err, err); + done(); + }); + + } + ); + }); + + it('should be able to retrieve dataviews from analysis', function(done) { + assert.response( + server, + { + url: '/api/v1/map/' + layergroupid + '/dataview/pop_max_histogram', + method: 'GET', + headers: { + host: username + } + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function(res, err) { + if (err) { + return done(err); + } + + var dataview = JSON.parse(res.body); + assert.equal(dataview.type, 'histogram'); + assert.equal(dataview.bins_start, 0); + + done(); + } + ); + }); + + it('should be able to retrieve static map preview via layergroup', function(done) { + assert.response( + server, + { + url: '/api/v1/map/static/center/' + layergroupid + '/4/42/-3/320/240.png', + method: 'GET', + encoding: 'binary', + headers: { + host: username + } + }, + { + status: 200, + headers: { + 'Content-Type': 'image/png' + } + }, + function(res, err) { + if (err) { + return done(err); + } + + var fixturePath = './test/fixtures/analysis/named-map-buffer-layergroup-static-preview.png'; + assert.imageBufferIsSimilarToFile(res.body, fixturePath, IMAGE_TOLERANCE_PER_MIL, function(err) { + assert.ok(!err, err); + done(); + }); + + } + ); + }); + + }); + + describe('auto-instantiation', function() { + it('should be able to retrieve static map preview via fixed url', function(done) { + TestClient.getStaticMap(widgetsTemplateName, function(err, image) { + assert.ok(!err, err); + var fixturePath = './test/fixtures/analysis/named-map-buffer-static-preview.png'; + assert.imageIsSimilarToFile(image, fixturePath, IMAGE_TOLERANCE_PER_MIL, function(err) { assert.ok(!err, err); done(); }); - - } - ); - }); - - it('should be able to retrieve dataviews from analysis', function(done) { - assert.response( - server, - { - url: '/api/v1/map/' + layergroupid + '/dataview/pop_max_histogram', - method: 'GET', - headers: { - host: username - } - }, - { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } - }, - function(res, err) { - if (err) { - return done(err); - } - - var dataview = JSON.parse(res.body); - assert.equal(dataview.type, 'histogram'); - assert.equal(dataview.bins_start, 0); - - done(); - } - ); + }); + }); }); }); diff --git a/test/fixtures/analysis/named-map-buffer-layergroup-static-preview.png b/test/fixtures/analysis/named-map-buffer-layergroup-static-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..deb0b60c635d755ad38f71e5ad4eef1e0d163cf0 GIT binary patch literal 13684 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

cU_KNEY2Y}8utuq}3iqAI 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

Q4aEhb9-SL7dS>T6W1*+u>jjE5fF literal 0 HcmV?d00001 diff --git a/test/support/test-client.js b/test/support/test-client.js index 5ced9f98..a9ec5bee 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -471,3 +471,41 @@ TestClient.prototype.getNodeStatus = function(nodeName, callback) { TestClient.prototype.drain = function(callback) { helper.deleteRedisKeys(this.keysToDelete, callback); }; + +module.exports.getStaticMap = function getStaticMap(templateName, params, callback) { + if (!callback) { + callback = params; + params = null; + } + + var url = '/api/v1/map/static/named/' + templateName + '/640/480.png'; + + if (params !== null) { + url += '?' + qs.stringify(params); + } + + var requestOptions = { + url: url, + method: 'GET', + headers: { + host: 'localhost' + }, + encoding: 'binary' + }; + + var expectedResponse = { + status: 200, + headers: { + 'Content-Type': 'image/png' + } + }; + + // this could be removed once named maps are invalidated, otherwise you hits the cache + var server = new CartodbWindshaft(serverOptions); + + assert.response(server, requestOptions, expectedResponse, function (res, err) { + helper.deleteRedisKeys({'user:localhost:mapviews:global': 5}, function() { + return callback(err, mapnik.Image.fromBytes(new Buffer(res.body, 'binary'))); + }); + }); +};