From b3107916ce9a154ca442dffd94ca157418861d8a Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 6 Jul 2016 00:32:30 +0200 Subject: [PATCH] Return multiple turbo-carto errors Closes #541 --- NEWS.md | 3 ++ .../mapconfig/adapter/turbo-carto-adapter.js | 22 ++++++--- test/acceptance/turbo-cartocss/error-cases.js | 49 +++++++++++++++++++ 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/NEWS.md b/NEWS.md index f74a4502..3b2e7ccf 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,9 @@ Released 2016-mm-dd +Enhancements: + - Return multiple turbo-carto errors #541. + Announcements: - Upgrades turbo-carto to [0.13.0](https://github.com/CartoDB/turbo-carto/releases/tag/0.13.0). diff --git a/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js index 97a655ec..c65a1441 100644 --- a/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js @@ -32,12 +32,22 @@ TurboCartoAdapter.prototype.getMapConfig = function (user, requestMapConfig, par parseCartoQueue.defer(self._parseCartoCss.bind(self), user, params, layer, index, layerId); }); - parseCartoQueue.awaitAll(function (err, layers) { + parseCartoQueue.awaitAll(function (err, results) { if (err) { return callback(err); } - requestMapConfig.layers = layers; + var errors = results.reduce(function(errors, result) { + if (result.error) { + errors.push(result.error); + } + return errors; + }, []); + if (errors.length > 0) { + return callback(errors); + } + + requestMapConfig.layers = results.map(function(result) { return result.layer; }); return callback(null, requestMapConfig); }); @@ -70,7 +80,7 @@ var tokensQueryTpl = dot.template([ TurboCartoAdapter.prototype._parseCartoCss = function (username, params, layer, layerIndex, layerId, callback) { if (!shouldParseLayerCartocss(layer)) { - return callback(null, layer); + return callback(null, { layer: layer }); } var pg = new PSQL(dbParamsFromReqParams(params)); @@ -88,14 +98,14 @@ TurboCartoAdapter.prototype._parseCartoCss = function (username, params, layer, context: err.context }; - return callback(error); + return callback(null, { error: error }); } // Try to continue in the rest of the cases if (cartocss) { layer.options.cartocss = cartocss; } - return callback(null, layer); + return callback(null, { layer: layer }); } var layerSql = layer.options.sql; @@ -107,7 +117,7 @@ TurboCartoAdapter.prototype._parseCartoCss = function (username, params, layer, if (err) { var error = new Error('turbo-carto: ' + err.message); error.type = 'turbo-carto'; - return callback(error); + return processCallback(error); } resultSet = resultSet || {}; diff --git a/test/acceptance/turbo-cartocss/error-cases.js b/test/acceptance/turbo-cartocss/error-cases.js index 29722a03..a4a72043 100644 --- a/test/acceptance/turbo-cartocss/error-cases.js +++ b/test/acceptance/turbo-cartocss/error-cases.js @@ -138,4 +138,53 @@ describe('turbo-carto error cases', function() { done(); }); }); + + it('should return multiple errors', function(done) { + + var multipleErrorsMapConfig = { + "version": "1.4.0", + "layers": [ + { + "type": 'mapnik', + "options": { + "cartocss_version": '2.3.0', + "sql": 'SELECT * FROM populated_places_simple_reduced', + "cartocss": createCartocss(null, 'ramp([wadus_column], (red, green, blue))') + } + }, + { + "type": 'mapnik', + "options": { + "cartocss_version": '2.3.0', + "sql": 'SELECT * FROM populated_places_simple_reduced', + "cartocss": createCartocss('ramp([invalid_column], (red, green, blue))') + } + } + ] + }; + + this.testClient = new TestClient(multipleErrorsMapConfig); + this.testClient.getLayergroup(ERROR_RESPONSE, function(err, layergroup) { + assert.ok(!err, err); + + assert.ok(layergroup.hasOwnProperty('errors')); + assert.equal(layergroup.errors_with_context.length, 2); + + assert.equal(layergroup.errors_with_context[0].type, 'layer'); + assert.equal(layergroup.errors_with_context[0].subtype, 'turbo-carto'); + assert.ok(layergroup.errors_with_context[0].message.match(/^turbo-carto/)); + assert.ok(layergroup.errors_with_context[0].message.match(/unable\sto\scompute\sramp/i)); + assert.ok(layergroup.errors_with_context[0].message.match(/wadus_column/)); + assert.equal(layergroup.errors_with_context[0].layer.id, 'layer0'); + + assert.equal(layergroup.errors_with_context[1].type, 'layer'); + assert.equal(layergroup.errors_with_context[1].subtype, 'turbo-carto'); + assert.ok(layergroup.errors_with_context[1].message.match(/^turbo-carto/)); + assert.ok(layergroup.errors_with_context[1].message.match(/unable\sto\scompute\sramp/i)); + assert.ok(layergroup.errors_with_context[1].message.match(/invalid_column/)); + assert.equal(layergroup.errors_with_context[1].layer.id, 'layer1'); + + done(); + }); + }); });