diff --git a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js index b0b5548e..7a7150db 100644 --- a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js @@ -232,6 +232,15 @@ function getDataviewsList(dataviews) { } function getDataviewsErrors(dataviews) { + var dataviewType = typeof dataviews; + if (dataviewType !== 'object') { + return [new Error('"dataviews" must be a valid JSON object: "' + dataviewType + '" type found')]; + } + + if (Array.isArray(dataviews)) { + return [new Error('"dataviews" must be a valid JSON object: "array" type found')]; + } + var errors = []; Object.keys(dataviews).forEach(function(dataviewName) { diff --git a/test/acceptance/dataviews/error-cases.js b/test/acceptance/dataviews/error-cases.js new file mode 100644 index 00000000..ebbfdc34 --- /dev/null +++ b/test/acceptance/dataviews/error-cases.js @@ -0,0 +1,87 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var TestClient = require('../../support/test-client'); + +describe('histogram-dataview', function() { + + afterEach(function(done) { + if (this.testClient) { + this.testClient.drain(done); + } else { + done(); + } + }); + + var ERROR_RESPONSE = { + status: 400, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }; + + function createMapConfig(dataviews) { + return { + version: '1.5.0', + layers: [ + { + "type": "cartodb", + "options": { + "source": { + "id": "HEAD" + }, + "cartocss": "#points { marker-width: 10; marker-fill: red; }", + "cartocss_version": "2.3.0" + } + } + ], + dataviews: dataviews, + analyses: [ + { + "id": "HEAD", + "type": "source", + "params": { + "query": "select null::geometry the_geom_webmercator, x from generate_series(0,1000) x" + } + } + ] + }; + } + + it('should fail when invalid dataviews object is provided, string case', function(done) { + var mapConfig = createMapConfig("wadus-string"); + this.testClient = new TestClient(mapConfig, 1234); + this.testClient.getLayergroup(ERROR_RESPONSE, function(err, errObj) { + assert.ok(!err, err); + + assert.deepEqual(errObj, { errors: [ '"dataviews" must be a valid JSON object: "string" type found' ] }); + + done(); + }); + }); + + it('should fail when invalid dataviews object is provided, array case', function(done) { + var mapConfig = createMapConfig([]); + this.testClient = new TestClient(mapConfig, 1234); + this.testClient.getLayergroup(ERROR_RESPONSE, function(err, errObj) { + assert.ok(!err, err); + + assert.deepEqual(errObj, { errors: [ '"dataviews" must be a valid JSON object: "array" type found' ] }); + + done(); + }); + }); + + it('should work with empty but valid objects', function(done) { + var mapConfig = createMapConfig({}); + this.testClient = new TestClient(mapConfig, 1234); + this.testClient.getLayergroup(function(err, layergroup) { + assert.ok(!err, err); + + assert.ok(layergroup); + assert.ok(layergroup.layergroupid); + + done(); + }); + }); +});